From 5a30045102752b4a64da649868792e6959421ae4 Mon Sep 17 00:00:00 2001 From: bsp2 Date: Sun, 19 Aug 2018 23:18:22 +0200 Subject: [PATCH] fix idle detection; update module LindenbergResearch.Westcoast --- .../repos/BOKONTEPByteBeatMachine/LICENSE.txt | 121 - .../repos/BOKONTEPByteBeatMachine/Makefile | 31 - .../repos/BOKONTEPByteBeatMachine/README.md | 66 - .../bytebeatmachine.png | Bin 298170 -> 0 bytes .../BOKONTEPByteBeatMachine/make.objects | 4 - .../BOKONTEPByteBeatMachine/makefile.msvc | 7 - .../res/MyModule - Αντιγραφή.svg | 187 - .../BOKONTEPByteBeatMachine/res/MyModule.svg | 222 - .../BOKONTEPByteBeatMachine/src/MyModule.cpp | 231 - .../BOKONTEPByteBeatMachine/src/Template.cpp | 9 - .../BOKONTEPByteBeatMachine/src/Template.hpp | 9 - .../BOKONTEPByteBeatMachine/src/duk_config.h | 3672 - .../BOKONTEPByteBeatMachine/src/duktape.c | 95142 ---------------- .../BOKONTEPByteBeatMachine/src/duktape.h | 1349 - .../res/AlternateBigKnob.afdesign | Bin 42878 -> 56978 bytes .../res/AlternateBigKnob.svg | 11 +- .../res/AlternateMiddleKnob.afdesign | Bin 52696 -> 53685 bytes .../res/AlternateMiddleKnob.svg | 10 +- .../res/AlternateSmallKnob.afdesign | Bin 35520 -> 33861 bytes .../res/AlternateSmallKnob.svg | 12 +- .../LindenbergResearch/res/IOPortC.afdesign | Bin 38746 -> 33560 bytes .../repos/LindenbergResearch/res/IOPortC.svg | 14 +- .../res/MiddleIncremental.afdesign | Bin 48147 -> 47149 bytes .../res/MiddleIncremental.svg | 16 +- .../res/ScrewLight.afdesign | Bin 25818 -> 26652 bytes .../LindenbergResearch/res/ScrewLight.svg | 14 +- .../LindenbergResearch/res/Westcoast.afdesign | Bin 457541 -> 458896 bytes .../LindenbergResearch/res/Westcoast.svg | 475 +- .../LindenbergResearch/res/WestcoastAged.svg | 355 + .../LindenbergResearch/src/LRComponents.hpp | 42 +- .../LindenbergResearch/src/Westcoast.cpp | 63 +- .../LindenbergResearch/src/dsp/Serge.cpp | 2 +- .../src/dsp/SergeWavefolder.cpp | 75 - .../src/dsp/SergeWavefolder.hpp | 45 - .../src/widgets/LRCVIndicator.cpp | 16 +- .../LindenbergResearch/src/widgets/LRKnob.cpp | 4 +- .../.idea/dictionaries/patricklindenberg.xml | 10 - .../LindenbergResearch__ORIG/CMakeLists.txt | 33 - .../repos/LindenbergResearch__ORIG/LICENSE | 31 - .../repos/LindenbergResearch__ORIG/Makefile | 9 - .../repos/LindenbergResearch__ORIG/README.md | 58 - .../LindenbergResearch__ORIG/_config.yml | 1 - .../repos/LindenbergResearch__ORIG/build.sh | 21 - .../doc/LRTRackModules_0.5.210.png | Bin 264611 -> 0 bytes .../doc/LRTRackModules_0.5.3.png | Bin 132715 -> 0 bytes .../doc/LRTRackModules_0.6.0.png | Bin 276311 -> 0 bytes .../LindenbergResearch__ORIG/make.objects | 16 - .../LindenbergResearch__ORIG/makefile.msvc | 7 - .../res/BigKnob.afdesign | Bin 55603 -> 0 bytes .../LindenbergResearch__ORIG/res/BigKnob.svg | 11 - .../res/BlankPanel.afdesign | Bin 39379 -> 0 bytes .../res/BlankPanel.svg | 109 - .../res/BlankPanelM1.afdesign | Bin 5627 -> 0 bytes .../res/BlankPanelM1.svg | 14 - .../res/CogBig.afdesign | Bin 28876 -> 0 bytes .../LindenbergResearch__ORIG/res/CogBig.svg | 7 - .../res/CogSmall.afdesign | Bin 20024 -> 0 bytes .../LindenbergResearch__ORIG/res/CogSmall.svg | 7 - .../res/IOPortB.afdesign | Bin 37783 -> 0 bytes .../LindenbergResearch__ORIG/res/IOPortB.svg | 45 - .../res/MS20.afdesign | Bin 136325 -> 0 bytes .../LindenbergResearch__ORIG/res/MS20.svg | 285 - .../res/MiddleKnob.afdesign | Bin 52614 -> 0 bytes .../res/MiddleKnob.svg | 13 - .../res/ReShaper.afdesign | Bin 34971 -> 0 bytes .../LindenbergResearch__ORIG/res/ReShaper.svg | 61 - .../res/ScrewDark.afdesign | Bin 28160 -> 0 bytes .../res/ScrewDark.svg | 14 - .../res/SimpleFilter.afdesign | Bin 50394 -> 0 bytes .../res/SimpleFilter.svg | 92 - .../res/SmallKnob.afdesign | Bin 51791 -> 0 bytes .../res/SmallKnob.svg | 17 - .../res/Switch0.afdesign | Bin 21987 -> 0 bytes .../LindenbergResearch__ORIG/res/Switch0.svg | 17 - .../res/Switch1.afdesign | Bin 21429 -> 0 bytes .../LindenbergResearch__ORIG/res/Switch1.svg | 17 - .../res/ToggleKnob.afdesign | Bin 52334 -> 0 bytes .../res/ToggleKnob.svg | 24 - .../LindenbergResearch__ORIG/res/VCF.afdesign | Bin 129595 -> 0 bytes .../LindenbergResearch__ORIG/res/VCF.svg | 307 - .../LindenbergResearch__ORIG/res/VCO.afdesign | Bin 34658 -> 0 bytes .../LindenbergResearch__ORIG/res/VCO.svg | 132 - .../res/digital-7.ttf | Bin 34404 -> 0 bytes .../src/AlmaFilter.cpp | 153 - .../src/BlankPanel.cpp | 78 - .../src/BlankPanelM1.cpp | 64 - .../src/LRComponents.cpp | 275 - .../src/LRComponents.hpp | 515 - .../src/LindenbergResearch.cpp | 24 - .../src/LindenbergResearch.hpp | 15 - .../src/MS20Filter.cpp | 153 - .../LindenbergResearch__ORIG/src/ReShaper.cpp | 96 - .../LindenbergResearch__ORIG/src/Release.h | 6 - .../src/SimpleFilter.cpp | 184 - .../LindenbergResearch__ORIG/src/VCO.cpp | 146 - .../src/dsp/DSPEffect.hpp | 23 - .../src/dsp/DSPMath.cpp | 185 - .../src/dsp/DSPMath.hpp | 314 - .../src/dsp/DSPSystem.hpp | 310 - .../src/dsp/LadderFilter.cpp | 217 - .../src/dsp/LadderFilter.hpp | 55 - .../src/dsp/MS20zdf.cpp | 67 - .../src/dsp/MS20zdf.hpp | 138 - .../src/dsp/Oscillator.cpp | 255 - .../src/dsp/Oscillator.hpp | 110 - .../repos/Template_shared/Template_shared.dll | Bin 1553920 -> 1553920 bytes plugins/community/repos/dBiz/dBiz.dll | Bin 1805824 -> 1805824 bytes src/vst2_main.cpp | 16 +- vst2_bin/CHANGELOG_VST.txt | 1 + vst2_bin/log.txt | 112 +- vst2_bin/plugins/LindenbergResearch/README.md | 19 +- .../res/AlternateBigKnob.svg | 11 +- .../res/AlternateMiddleKnob.svg | 10 +- .../res/AlternateSmallKnob.svg | 12 +- .../LindenbergResearch/res/IOPortC.svg | 14 +- .../res/MiddleIncremental.svg | 16 +- .../LindenbergResearch/res/ScrewLight.svg | 14 +- .../LindenbergResearch/res/Westcoast.svg | 475 +- .../LindenbergResearch/res/WestcoastAged.svg | 355 + vst2_bin/plugins/Template_shared/plugin.dll | Bin 1553920 -> 1553920 bytes vst2_bin/plugins/dBiz/plugin.dll | Bin 1805824 -> 1805824 bytes vst2_bin/settings.json | 32 +- 122 files changed, 1450 insertions(+), 106582 deletions(-) delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/LICENSE.txt delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/Makefile delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/README.md delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/bytebeatmachine.png delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/make.objects delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/makefile.msvc delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/res/MyModule - Αντιγραφή.svg delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/res/MyModule.svg delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/MyModule.cpp delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.cpp delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.hpp delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/duk_config.h delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.c delete mode 100644 plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.h create mode 100644 plugins/community/repos/LindenbergResearch/res/WestcoastAged.svg delete mode 100644 plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.cpp delete mode 100644 plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/.idea/dictionaries/patricklindenberg.xml delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/CMakeLists.txt delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/LICENSE delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/Makefile delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/README.md delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/_config.yml delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/build.sh delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.210.png delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.3.png delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.6.0.png delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/make.objects delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/makefile.msvc delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BigKnob.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BigKnob.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/CogBig.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/CogBig.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/CogSmall.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/CogSmall.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/MS20.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/MS20.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ReShaper.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ReShaper.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ScrewDark.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ScrewDark.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/Switch1.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/Switch1.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/VCF.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/VCF.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/VCO.afdesign delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/VCO.svg delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/res/digital-7.ttf delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/AlmaFilter.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanel.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanelM1.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/MS20Filter.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/ReShaper.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/Release.h delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/SimpleFilter.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/VCO.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPEffect.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPSystem.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.hpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.cpp delete mode 100644 plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.hpp create mode 100644 vst2_bin/plugins/LindenbergResearch/res/WestcoastAged.svg diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/LICENSE.txt b/plugins/community/repos/BOKONTEPByteBeatMachine/LICENSE.txt deleted file mode 100644 index 0e259d42..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/LICENSE.txt +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/Makefile b/plugins/community/repos/BOKONTEPByteBeatMachine/Makefile deleted file mode 100644 index 4a1fd72a..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# If RACK_DIR is not defined when calling the Makefile, default to two directories above -RACK_DIR ?= ../.. - -# Must follow the format in the Naming section of -# https://vcvrack.com/manual/PluginDevelopmentTutorial.html -SLUG = BOKONTEPByteBeatMachine - -# Must follow the format in the Versioning section of -# https://vcvrack.com/manual/PluginDevelopmentTutorial.html -VERSION = 0.6.1 - -# FLAGS will be passed to both the C and C++ compiler -FLAGS += -CFLAGS += -CXXFLAGS += - -# Careful about linking to shared libraries, since you can't assume much about the user's environment and library search path. -# Static libraries are fine. -LDFLAGS += - -# Add .cpp and .c files to the build -SOURCES += $(wildcard src/*.cpp) -SOURCES += $(wildcard src/*.c) - - -# Add files to the ZIP package when running `make dist` -# The compiled plugin is automatically added. -DISTRIBUTABLES += $(wildcard LICENSE*) res - -# Include the VCV Rack plugin Makefile framework -include $(RACK_DIR)/plugin.mk diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/README.md b/plugins/community/repos/BOKONTEPByteBeatMachine/README.md deleted file mode 100644 index 1394ff85..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/README.md +++ /dev/null @@ -1,66 +0,0 @@ - -# BokontepByteBeatMachine - -javascript bytebeat on VCVRack -Now you can burn countless cpu cycles by creating 8 bit oscillators with javascript! Built with duktape and caffeine drinks! - -Demo video here: -[![BokontepByteBeatMachine demo](http://img.youtube.com/vi/AQctoH3ucmQ/0.jpg)](http://www.youtube.com/watch?v=AQctoH3ucmQ) - -Some kind of manual -=================== - -![alt text](bytebeatmachine.png "BokontepByteBeatMachine on VCVRack") -BokontepByteBeatMachine is an 8bit, 8000 Hz javascript oscillator. You can enter a javascript expression in the textbox -(better write it in a text editor if is more than one line and paste it there), right click on the context menu and select initialize (or just press CTRL+I) -to compile the expression. If the expression is compiled successfully the red led over the textarea with the javascript turns to red. -If there is an error in compiling the statement the red led flashes. If the expression is successfully compiled, when a trigger is received on the trigger input, or if you -press the button above the trigger input the expression is evaluated and eventually outputted as an 8bit unsigned integer (0-255), -which in turn is converted to the -5.0 .. 5.0 values that VCVRack works with. -The javascript expression can contain javascript functions, bit and arithmetic operations and 3 variables. t, X and Y (look out for case sensitivity t is lower case, X and Y upper case). -t is the current time. X and Y are 8 bit unsigned ints coming from the X and Y inputs. Each value from the inputs with a value between -5.0 and 5.0 is mapped to an integer between 0 and 255. -This works at a glorious 8000 samples per second so there you have it, a bytebeat oscillator in javascript! -You can also use the trigger led button over the trigger input to test the oscillator. -A few things to try. - -The simplest thing to try is just putting t as the expression. This produces a kind of stepped saw. -Or you can try my personal favorite (([1.122,1.259,1.498,1.681,1.887][((t >> 12) ^ ((t >> 10)+ 3561)) %5]) * t & 128 | (([1.122,1.259,1.498,1.681,1.887][((t >> 11) ^ ((t >> 9) +2137)) %5]) * t) & ((t>>14)%120+8) | (t>>4) ) -I call the above snippet ΚΙΝΕΖΙΚΑ ΠΑΡΑΘΥΡΑ (chinese windows if this is greek to you) -If you want to learn more about bytebeat you can start here: -https://www.reddit.com/r/bytebeat/ -http://countercomplex.blogspot.gr/2011/10/algorithmic-symphonies-from-one-line-of.html -http://countercomplex.blogspot.gr/2011/10/some-deep-analysis-of-one-line-music.html - - -Some more technical mumbo jumbo -=============================== -BokontepByteBeatMachine is built using the opensource duktape javascript engine. The expression you enter on the textbox is actually turned into a javascript function before -compilation so if you enter just the t, internally a function is constructed like this: - -``` -function f(t,X,Y) -{ - return (t); -} -``` - -The function is compiled and then repeatedly executed. That's it. Each time a trigger is received t is reset to 0. For more insights on how this works just look at the source code. - -A small disclaimerish note on audio quality -=========================================== -This plugin produces sound with a lot of unpleasant frequencies due to low bit rate and aliasing. This is by design in this case. - - -Legal stuff aka license -======================= -This code is left on the public domain. Do as you please with it. - - -Peace, - -ВОКОИТЕР 2018 - -Oh, and if you like this don't forget to check out my music and my ramblings on -http://bokontep.blogspot.gr - - diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/bytebeatmachine.png b/plugins/community/repos/BOKONTEPByteBeatMachine/bytebeatmachine.png deleted file mode 100644 index 850a64b7dea668e29da79f718b61566bc5e6a412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 298170 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%0DNclhOHCho@op)K90RH0YP@6BbZ6mr|RKi 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%0DG+jb?$uUDWN=)@ORgS+e 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

Ba(!qWwciKB~Z~*hVQ*erFLH3Ls2wU>)-I=JcEA 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 - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/res/MyModule.svg b/plugins/community/repos/BOKONTEPByteBeatMachine/res/MyModule.svg deleted file mode 100644 index df3eb5c6..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/res/MyModule.svg +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/MyModule.cpp b/plugins/community/repos/BOKONTEPByteBeatMachine/src/MyModule.cpp deleted file mode 100644 index 185bc49c..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/MyModule.cpp +++ /dev/null @@ -1,231 +0,0 @@ -#include "Template.hpp" -//#include "Fundamental.hpp" -#include "dsp/digital.hpp" -#include "duktape.h" - -namespace rack_plugin_BokontepByteBeat { - -struct BokontepByteBeatModule : Module { - enum ParamIds { - - TRIG_PARAM, - TRIG_PARAM_BUTTON, - X_PARAM, - Y_PARAM, - NUM_PARAMS - }; - enum InputIds { - - TRIG_INPUT, - X_INPUT, - Y_INPUT, - NUM_INPUTS - }; - enum OutputIds { - BYTEBEAT_OUTPUT, - NUM_OUTPUTS - }; - enum LightIds { - BLINK_LIGHT, - TRIGGER_LIGHT, - NUM_LIGHTS - }; - - - char javascriptBuffer[512]; - const char* header = "function f(t,X,Y) { return ("; - const char* footer = "); } "; - float accumulator = 0.0f; - float timestep = 1.0/8000.0f; - TextField* textField; - bool running = false; - bool compiled = false; - SchmittTrigger trigger; - float phase = 0.0; - float blinkPhase = 0.0; - int t = 0; - duk_context *ctx = NULL; - BokontepByteBeatModule() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { - - } - void step() override; - - // For more advanced Module features, read Rack's engine.hpp header file - // - toJson, fromJson: serialization of internal data - // - onSampleRateChange: event triggered by a change of sample rate - // - onReset, onRandomize, onCreate, onDelete: implements special behavior when user clicks these from the context menu - void onCreate () override - { - if(ctx) - { - duk_destroy_heap(ctx); - ctx = duk_create_heap_default(); - } - else - { - ctx = duk_create_heap_default(); - } - //textField->text = "t = t+1;"; - running = false; - if(strlen(textField->text.c_str())<512) - { - sprintf(javascriptBuffer,"%s%s%s",header,textField->text.c_str(),footer); - if (duk_pcompile_string(ctx, DUK_COMPILE_FUNCTION,javascriptBuffer)==0) - { - compiled = true; - } - else - { - compiled = false; - running = false; - } - } - else - { - compiled = false; - running = false; - } - - - - } - void onDelete() override - { - if(ctx) - { - duk_destroy_heap(ctx); - } - if(!ctx) - { - ctx = NULL; - } - } - void onReset () override - { - onCreate(); - } - -}; - - -void BokontepByteBeatModule::step() { - // Implement a bytebeat oscillator - float deltaTime = engineGetSampleTime(); - int x = 0; - int y = 0; - if((inputs[TRIG_INPUT].value || params[TRIG_PARAM_BUTTON].value) && compiled) - { - - t = 0; - - accumulator = 0.0f; - running = true; - - } - - x=(uint8_t)(((inputs[X_INPUT].value+5.0f)/10.0)*255); //scale -5.0 .. +5.0 to 0-255 - y=(uint8_t)(((inputs[Y_INPUT].value+5.0f)/10.0)*255); //scale -5.0 .. +5.0 to 0-255 - - - - accumulator = accumulator + deltaTime; - t = accumulator/timestep; - - - // Compute the output - int retval = 0; - - if(running) - { - - duk_dup(ctx, 0); - duk_push_int(ctx, t); - duk_push_int(ctx, x); - duk_push_int(ctx, y); - duk_call(ctx, 3); - retval = (uint8_t)duk_get_int_default(ctx, 1, 0); - duk_pop(ctx); - - - - //retval = rand()*255; - } - outputs[BYTEBEAT_OUTPUT].value = 5.0f * ((retval-127.0)/127.0); - lights[TRIGGER_LIGHT].value = max(inputs[TRIG_INPUT].value , params[TRIG_PARAM_BUTTON].value); - // Blink light at 1Hz - blinkPhase += deltaTime; - if (blinkPhase >= 1.0f) - blinkPhase -= 1.0f; - if(compiled) - { - lights[BLINK_LIGHT].value = 1.0f; - } - else - { - lights[BLINK_LIGHT].value = (blinkPhase < 0.5f) ? 1.0f : 0.0f; - } -} - - -struct BokontepByteBeatWidget : ModuleWidget { - TextField *textField; - BokontepByteBeatWidget(BokontepByteBeatModule *module) : ModuleWidget(module) { - - setPanel(SVG::load(assetPlugin(plugin, "res/MyModule.svg"))); - - addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); - addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); - addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); - addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); - - //addParam(ParamWidget::create(Vec(28, 87), module, BokontepByteBeatModule::TRIG_PARAM, -3.0, 3.0, 0.0)); - - addParam(ParamWidget::create(Vec(42, 270), module, BokontepByteBeatModule::TRIG_PARAM_BUTTON, 0.0f, 1.0f, 0.0f)); - addChild(ModuleLightWidget::create>(Vec(46.4f, 274.4f), module, BokontepByteBeatModule::TRIGGER_LIGHT)); - addInput(Port::create(Vec(38, 300), Port::INPUT, module, BokontepByteBeatModule::TRIG_INPUT)); - addInput(Port::create(Vec(98, 300), Port::INPUT, module, BokontepByteBeatModule::X_INPUT)); - addInput(Port::create(Vec(153, 300), Port::INPUT, module, BokontepByteBeatModule::Y_INPUT)); - addOutput(Port::create(Vec(215, 300), Port::OUTPUT, module, BokontepByteBeatModule::BYTEBEAT_OUTPUT)); - - addChild(ModuleLightWidget::create>(Vec(125, 100), module, BokontepByteBeatModule::BLINK_LIGHT)); - textField = Widget::create(mm2px(Vec(3, 42))); - textField->box.size = mm2px(Vec(85, 40)); - textField->multiline = true; - - addChild(textField); - module->textField = this->textField; - } - json_t *toJson() override { - json_t *rootJ = ModuleWidget::toJson(); - - // text - json_object_set_new(rootJ, "text", json_string(textField->text.c_str())); - - return rootJ; - } - - void fromJson(json_t *rootJ) override { - ModuleWidget::fromJson(rootJ); - - // text - json_t *textJ = json_object_get(rootJ, "text"); - if (textJ) - { - textField->text = json_string_value(textJ); - module->onCreate(); - } - } -}; - -} // namespace rack_plugin_BokontepByteBeat - -using namespace rack_plugin_BokontepByteBeat; - -RACK_PLUGIN_MODEL_INIT(BOKONTEPByteBeatMachine, BokontepByteBeatMachine) { - // Specify the Module and ModuleWidget subclass, human-readable - // author name for categorization per plugin, module slug (should never - // change), human-readable module name, and any number of tags - // (found in `include/tags.hpp`) separated by commas. - Model *modelBokontepByteBeatMachine = Model::create("BokontepByteBeat", "BokontepByteBeatMachine", "Bokontep ByteBeat Machine", OSCILLATOR_TAG); - return modelBokontepByteBeatMachine; -} diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.cpp b/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.cpp deleted file mode 100644 index 879b2c6a..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "Template.hpp" - -RACK_PLUGIN_MODEL_DECLARE(BOKONTEPByteBeatMachine, BokontepByteBeatMachine); - -RACK_PLUGIN_INIT(BOKONTEPByteBeatMachine) { - RACK_PLUGIN_INIT_ID(); - - RACK_PLUGIN_MODEL_ADD(BOKONTEPByteBeatMachine, BokontepByteBeatMachine); -} diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.hpp b/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.hpp deleted file mode 100644 index ebb06db7..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/Template.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "rack.hpp" - -using namespace rack; - -RACK_PLUGIN_DECLARE(BOKONTEPByteBeatMachine); - -#ifdef USE_VST2 -#define plugin "BOKONTEPByteBeatMachine" -#endif // USE_VST2 diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duk_config.h b/plugins/community/repos/BOKONTEPByteBeatMachine/src/duk_config.h deleted file mode 100644 index 51e973f8..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duk_config.h +++ /dev/null @@ -1,3672 +0,0 @@ -/* - * duk_config.h configuration header generated by genconfig.py. - * - * Git commit: 25420e773c5fbc50d5b46bf487fc45717e35b94f - * Git describe: v2.2.1 - * Git branch: v2.2-maintenance - * - * Supported platforms: - * - Mac OSX, iPhone, Darwin - * - Orbis - * - OpenBSD - * - Generic BSD - * - Atari ST TOS - * - AmigaOS - * - Durango (XboxOne) - * - Windows - * - Flashplayer (Crossbridge) - * - QNX - * - TI-Nspire - * - Emscripten - * - Linux - * - Solaris - * - AIX - * - HPUX - * - Generic POSIX - * - Cygwin - * - Generic UNIX - * - Generic fallback - * - * Supported architectures: - * - x86 - * - x64 - * - x32 - * - ARM 32-bit - * - ARM 64-bit - * - MIPS 32-bit - * - MIPS 64-bit - * - PowerPC 32-bit - * - PowerPC 64-bit - * - SPARC 32-bit - * - SPARC 64-bit - * - SuperH - * - Motorola 68k - * - Emscripten - * - Generic - * - * Supported compilers: - * - Clang - * - GCC - * - MSVC - * - Emscripten - * - TinyC - * - VBCC - * - Bruce's C compiler - * - Generic - * - */ - -#if !defined(DUK_CONFIG_H_INCLUDED) -#define DUK_CONFIG_H_INCLUDED - -/* - * Intermediate helper defines - */ - -/* DLL build detection */ -/* not configured for DLL build */ -#undef DUK_F_DLL_BUILD - -/* Apple OSX, iOS */ -#if defined(__APPLE__) -#define DUK_F_APPLE -#endif - -/* FreeBSD */ -#if defined(__FreeBSD__) || defined(__FreeBSD) -#define DUK_F_FREEBSD -#endif - -/* Orbis (PS4) variant */ -#if defined(DUK_F_FREEBSD) && defined(__ORBIS__) -#define DUK_F_ORBIS -#endif - -/* OpenBSD */ -#if defined(__OpenBSD__) || defined(__OpenBSD) -#define DUK_F_OPENBSD -#endif - -/* NetBSD */ -#if defined(__NetBSD__) || defined(__NetBSD) -#define DUK_F_NETBSD -#endif - -/* BSD variant */ -#if defined(DUK_F_FREEBSD) || defined(DUK_F_NETBSD) || defined(DUK_F_OPENBSD) || \ - defined(__bsdi__) || defined(__DragonFly__) -#define DUK_F_BSD -#endif - -/* Atari ST TOS. __TOS__ defined by PureC. No platform define in VBCC - * apparently, so to use with VBCC user must define __TOS__ manually. - */ -#if defined(__TOS__) -#define DUK_F_TOS -#endif - -/* Motorola 68K. Not defined by VBCC, so user must define one of these - * manually when using VBCC. - */ -#if defined(__m68k__) || defined(M68000) || defined(__MC68K__) -#define DUK_F_M68K -#endif - -/* AmigaOS. Neither AMIGA nor __amigaos__ is defined on VBCC, so user must - * define 'AMIGA' manually when using VBCC. - */ -#if defined(AMIGA) || defined(__amigaos__) -#define DUK_F_AMIGAOS -#endif - -/* PowerPC */ -#if defined(__powerpc) || defined(__powerpc__) || defined(__PPC__) -#define DUK_F_PPC -#if defined(__PPC64__) || defined(__LP64__) || defined(_LP64) -#define DUK_F_PPC64 -#else -#define DUK_F_PPC32 -#endif -#endif - -/* Durango (Xbox One) */ -#if defined(_DURANGO) || defined(_XBOX_ONE) -#define DUK_F_DURANGO -#endif - -/* Windows, both 32-bit and 64-bit */ -#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64) || \ - defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) -#define DUK_F_WINDOWS -#if defined(_WIN64) || defined(WIN64) -#define DUK_F_WIN64 -#else -#define DUK_F_WIN32 -#endif -#endif - -/* Flash player (e.g. Crossbridge) */ -#if defined(__FLASHPLAYER__) -#define DUK_F_FLASHPLAYER -#endif - -/* QNX */ -#if defined(__QNX__) -#define DUK_F_QNX -#endif - -/* TI-Nspire (using Ndless) */ -#if defined(_TINSPIRE) -#define DUK_F_TINSPIRE -#endif - -/* Emscripten (provided explicitly by user), improve if possible */ -#if defined(EMSCRIPTEN) -#define DUK_F_EMSCRIPTEN -#endif - -/* BCC (Bruce's C compiler): this is a "torture target" for compilation */ -#if defined(__BCC__) || defined(__BCC_VERSION__) -#define DUK_F_BCC -#endif - -/* Linux */ -#if defined(__linux) || defined(__linux__) || defined(linux) -#define DUK_F_LINUX -#endif - -/* illumos / Solaris */ -#if defined(__sun) && defined(__SVR4) -#define DUK_F_SUN -#if defined(__SUNPRO_C) && (__SUNPRO_C < 0x550) -#define DUK_F_OLD_SOLARIS -/* Defines _ILP32 / _LP64 required by DUK_F_X86/DUK_F_X64. Platforms - * are processed before architectures, so this happens before the - * DUK_F_X86/DUK_F_X64 detection is emitted. - */ -#include -#endif -#endif - -/* AIX */ -#if defined(_AIX) -/* defined(__xlc__) || defined(__IBMC__): works but too wide */ -#define DUK_F_AIX -#endif - -/* HPUX */ -#if defined(__hpux) -#define DUK_F_HPUX -#if defined(__ia64) -#define DUK_F_HPUX_ITANIUM -#endif -#endif - -/* POSIX */ -#if defined(__posix) -#define DUK_F_POSIX -#endif - -/* Cygwin */ -#if defined(__CYGWIN__) -#define DUK_F_CYGWIN -#endif - -/* Generic Unix (includes Cygwin) */ -#if defined(__unix) || defined(__unix__) || defined(unix) || \ - defined(DUK_F_LINUX) || defined(DUK_F_BSD) -#define DUK_F_UNIX -#endif - -/* C++ */ -#undef DUK_F_CPP -#if defined(__cplusplus) -#define DUK_F_CPP -#endif - -/* Intel x86 (32-bit), x64 (64-bit) or x32 (64-bit but 32-bit pointers), - * define only one of DUK_F_X86, DUK_F_X64, DUK_F_X32. - * https://sites.google.com/site/x32abi/ - * - * With DUK_F_OLD_SOLARIS the header must be included - * before this. - */ -#if defined(__amd64__) || defined(__amd64) || \ - defined(__x86_64__) || defined(__x86_64) || \ - defined(_M_X64) || defined(_M_AMD64) -#if defined(__ILP32__) || defined(_ILP32) -#define DUK_F_X32 -#else -#define DUK_F_X64 -#endif -#elif defined(i386) || defined(__i386) || defined(__i386__) || \ - defined(__i486__) || defined(__i586__) || defined(__i686__) || \ - defined(__IA32__) || defined(_M_IX86) || defined(__X86__) || \ - defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) -#if defined(__LP64__) || defined(_LP64) -/* This should not really happen, but would indicate x64. */ -#define DUK_F_X64 -#else -#define DUK_F_X86 -#endif -#endif - -/* ARM */ -#if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(_M_ARM) || defined(__aarch64__) -#define DUK_F_ARM -#if defined(__LP64__) || defined(_LP64) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__) -#define DUK_F_ARM64 -#else -#define DUK_F_ARM32 -#endif -#endif - -/* MIPS. Related defines: __MIPSEB__, __MIPSEL__, __mips_isa_rev, __LP64__ */ -#if defined(__mips__) || defined(mips) || defined(_MIPS_ISA) || \ - defined(_R3000) || defined(_R4000) || defined(_R5900) || \ - defined(_MIPS_ISA_MIPS1) || defined(_MIPS_ISA_MIPS2) || \ - defined(_MIPS_ISA_MIPS3) || defined(_MIPS_ISA_MIPS4) || \ - defined(__mips) || defined(__MIPS__) -#define DUK_F_MIPS -#if defined(__LP64__) || defined(_LP64) || defined(__mips64) || \ - defined(__mips64__) || defined(__mips_n64) -#define DUK_F_MIPS64 -#else -#define DUK_F_MIPS32 -#endif -#endif - -/* SPARC */ -#if defined(sparc) || defined(__sparc) || defined(__sparc__) -#define DUK_F_SPARC -#if defined(__LP64__) || defined(_LP64) -#define DUK_F_SPARC64 -#else -#define DUK_F_SPARC32 -#endif -#endif - -/* SuperH */ -#if defined(__sh__) || \ - defined(__sh1__) || defined(__SH1__) || \ - defined(__sh2__) || defined(__SH2__) || \ - defined(__sh3__) || defined(__SH3__) || \ - defined(__sh4__) || defined(__SH4__) || \ - defined(__sh5__) || defined(__SH5__) -#define DUK_F_SUPERH -#endif - -/* Clang */ -#if defined(__clang__) -#define DUK_F_CLANG -#endif - -/* C99 or above */ -#undef DUK_F_C99 -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -#define DUK_F_C99 -#endif - -/* C++11 or above */ -#undef DUK_F_CPP11 -#if defined(__cplusplus) && (__cplusplus >= 201103L) -#define DUK_F_CPP11 -#endif - -/* GCC. Clang also defines __GNUC__ so don't detect GCC if using Clang. */ -#if defined(__GNUC__) && !defined(__clang__) && !defined(DUK_F_CLANG) -#define DUK_F_GCC -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) -/* Convenience, e.g. gcc 4.5.1 == 40501; http://stackoverflow.com/questions/6031819/emulating-gccs-builtin-unreachable */ -#define DUK_F_GCC_VERSION (__GNUC__ * 10000L + __GNUC_MINOR__ * 100L + __GNUC_PATCHLEVEL__) -#else -#error cannot figure out gcc version -#endif -#endif - -/* MinGW. Also GCC flags (DUK_F_GCC) are enabled now. */ -#if defined(__MINGW32__) || defined(__MINGW64__) -#define DUK_F_MINGW -#endif - -/* MSVC */ -#if defined(_MSC_VER) -/* MSVC preprocessor defines: http://msdn.microsoft.com/en-us/library/b0084kay.aspx - * _MSC_FULL_VER includes the build number, but it has at least two formats, see e.g. - * BOOST_MSVC_FULL_VER in http://www.boost.org/doc/libs/1_52_0/boost/config/compiler/visualc.hpp - */ -#define DUK_F_MSVC -#if defined(_MSC_FULL_VER) -#if (_MSC_FULL_VER > 100000000) -#define DUK_F_MSVC_FULL_VER _MSC_FULL_VER -#else -#define DUK_F_MSCV_FULL_VER (_MSC_FULL_VER * 10) -#endif -#endif -#endif /* _MSC_VER */ - -/* TinyC */ -#if defined(__TINYC__) -/* http://bellard.org/tcc/tcc-doc.html#SEC9 */ -#define DUK_F_TINYC -#endif - -/* VBCC */ -#if defined(__VBCC__) -#define DUK_F_VBCC -#endif - -#if defined(ANDROID) || defined(__ANDROID__) -#define DUK_F_ANDROID -#endif - -/* Atari Mint */ -#if defined(__MINT__) -#define DUK_F_MINT -#endif - -/* - * Platform autodetection - */ - -/* Workaround for older C++ compilers before including , - * see e.g.: https://sourceware.org/bugzilla/show_bug.cgi?id=15366 - */ -#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS) -#define __STDC_LIMIT_MACROS -#endif -#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) -#define __STDC_CONSTANT_MACROS -#endif - -#if defined(DUK_F_APPLE) -/* --- Mac OSX, iPhone, Darwin --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -/* http://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor */ -#if TARGET_IPHONE_SIMULATOR -#define DUK_USE_OS_STRING "iphone-sim" -#elif TARGET_OS_IPHONE -#define DUK_USE_OS_STRING "iphone" -#elif TARGET_OS_MAC -#define DUK_USE_OS_STRING "osx" -#else -#define DUK_USE_OS_STRING "osx-unknown" -#endif - -/* Use _setjmp() on Apple by default, see GH-55. */ -#define DUK_JMPBUF_TYPE jmp_buf -#define DUK_SETJMP(jb) _setjmp((jb)) -#define DUK_LONGJMP(jb) _longjmp((jb), 1) -#elif defined(DUK_F_ORBIS) -/* --- Orbis --- */ -/* Orbis = PS4 */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_S -/* no parsing (not an error) */ -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "orbis" -#elif defined(DUK_F_OPENBSD) -/* --- OpenBSD --- */ -/* http://www.monkey.org/openbsd/archive/ports/0401/msg00089.html */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "openbsd" -#elif defined(DUK_F_BSD) -/* --- Generic BSD --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "bsd" -#elif defined(DUK_F_TOS) -/* --- Atari ST TOS --- */ -#define DUK_USE_DATE_NOW_TIME -#define DUK_USE_DATE_TZO_GMTIME -/* no parsing (not an error) */ -#define DUK_USE_DATE_FMT_STRFTIME -#include - -#define DUK_USE_OS_STRING "tos" - -/* TOS on M68K is always big endian. */ -#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_M68K) -#define DUK_USE_BYTEORDER 3 -#endif -#elif defined(DUK_F_AMIGAOS) -/* --- AmigaOS --- */ -#if defined(DUK_F_M68K) -/* AmigaOS on M68k */ -#define DUK_USE_DATE_NOW_TIME -#define DUK_USE_DATE_TZO_GMTIME -/* no parsing (not an error) */ -#define DUK_USE_DATE_FMT_STRFTIME -#include -#elif defined(DUK_F_PPC) -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#if !defined(UINTPTR_MAX) -#define UINTPTR_MAX UINT_MAX -#endif -#else -#error AmigaOS but not M68K/PPC, not supported now -#endif - -#define DUK_USE_OS_STRING "amigaos" - -/* AmigaOS on M68K or PPC is always big endian. */ -#if !defined(DUK_USE_BYTEORDER) && (defined(DUK_F_M68K) || defined(DUK_F_PPC)) -#define DUK_USE_BYTEORDER 3 -#endif -#elif defined(DUK_F_DURANGO) -/* --- Durango (XboxOne) --- */ -/* Durango = XboxOne - * Configuration is nearly identical to Windows, except for - * DUK_USE_DATE_TZO_WINDOWS. - */ - -/* Initial fix: disable secure CRT related warnings when compiling Duktape - * itself (must be defined before including Windows headers). Don't define - * for user code including duktape.h. - */ -#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -/* MSVC does not have sys/param.h */ -#define DUK_USE_DATE_NOW_WINDOWS -#define DUK_USE_DATE_TZO_WINDOWS_NO_DST -/* Note: PRS and FMT are intentionally left undefined for now. This means - * there is no platform specific date parsing/formatting but there is still - * the ISO 8601 standard format. - */ -#if defined(DUK_COMPILING_DUKTAPE) -/* Only include when compiling Duktape to avoid polluting application build - * with a lot of unnecessary defines. - */ -#include -#endif - -#define DUK_USE_OS_STRING "durango" - -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -#elif defined(DUK_F_WINDOWS) -/* --- Windows --- */ -/* Windows version can't obviously be determined at compile time, - * but _WIN32_WINNT indicates the minimum version targeted: - * - https://msdn.microsoft.com/en-us/library/6sehtctf.aspx - */ - -/* Initial fix: disable secure CRT related warnings when compiling Duktape - * itself (must be defined before including Windows headers). Don't define - * for user code including duktape.h. - */ -#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS -#endif - -/* Windows 32-bit and 64-bit are currently the same. */ -/* MSVC does not have sys/param.h */ - -#if defined(DUK_COMPILING_DUKTAPE) -/* Only include when compiling Duktape to avoid polluting application build - * with a lot of unnecessary defines. - */ -#include -#endif - -/* GetSystemTimePreciseAsFileTime() available from Windows 8: - * https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx - */ -#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) || defined(DUK_USE_DATE_NOW_WINDOWS) -/* User forced provider. */ -#else -#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602) -#define DUK_USE_DATE_NOW_WINDOWS_SUBMS -#else -#define DUK_USE_DATE_NOW_WINDOWS -#endif -#endif - -#define DUK_USE_DATE_TZO_WINDOWS - -/* Note: PRS and FMT are intentionally left undefined for now. This means - * there is no platform specific date parsing/formatting but there is still - * the ISO 8601 standard format. - */ - -/* QueryPerformanceCounter() may go backwards in Windows XP, so enable for - * Vista and later: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions - */ -#if !defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) && \ - defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) -#define DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC -#endif - -#define DUK_USE_OS_STRING "windows" - -/* On Windows, assume we're little endian. Even Itanium which has a - * configurable endianness runs little endian in Windows. - */ -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -#elif defined(DUK_F_FLASHPLAYER) -/* --- Flashplayer (Crossbridge) --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "flashplayer" - -#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_FLASHPLAYER) -#define DUK_USE_BYTEORDER 1 -#endif -#elif defined(DUK_F_QNX) -/* --- QNX --- */ -#if defined(DUK_F_QNX) && defined(DUK_COMPILING_DUKTAPE) -/* See: /opt/qnx650/target/qnx6/usr/include/sys/platform.h */ -#define _XOPEN_SOURCE 600 -#define _POSIX_C_SOURCE 200112L -#endif - -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "qnx" -#elif defined(DUK_F_TINSPIRE) -/* --- TI-Nspire --- */ -#if defined(DUK_COMPILING_DUKTAPE) && !defined(_XOPEN_SOURCE) -#define _XOPEN_SOURCE /* e.g. strptime */ -#endif - -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "tinspire" -#elif defined(DUK_F_EMSCRIPTEN) -/* --- Emscripten --- */ -#if defined(DUK_COMPILING_DUKTAPE) -#if !defined(_POSIX_C_SOURCE) -#define _POSIX_C_SOURCE 200809L -#endif -#if !defined(_GNU_SOURCE) -#define _GNU_SOURCE /* e.g. getdate_r */ -#endif -#if !defined(_XOPEN_SOURCE) -#define _XOPEN_SOURCE /* e.g. strptime */ -#endif -#endif /* DUK_COMPILING_DUKTAPE */ - -#include -#if defined(DUK_F_BCC) -/* no endian.h */ -#else -#include -#endif /* DUK_F_BCC */ -#include -#include -#include -#include - -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME - -#define DUK_USE_OS_STRING "emscripten" -#elif defined(DUK_F_LINUX) -/* --- Linux --- */ -#if defined(DUK_COMPILING_DUKTAPE) -#if !defined(_POSIX_C_SOURCE) -#define _POSIX_C_SOURCE 200809L -#endif -#if !defined(_GNU_SOURCE) -#define _GNU_SOURCE /* e.g. getdate_r */ -#endif -#if !defined(_XOPEN_SOURCE) -#define _XOPEN_SOURCE /* e.g. strptime */ -#endif -#endif /* DUK_COMPILING_DUKTAPE */ - -#include -#if defined(DUK_F_BCC) -/* no endian.h or stdint.h */ -#else -#include -#include -#endif /* DUK_F_BCC */ -#include -#include -#include - -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME - -#if 0 /* XXX: safe condition? */ -#define DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME -#endif - -#define DUK_USE_OS_STRING "linux" -#elif defined(DUK_F_SUN) -/* --- Solaris --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME - -#include -#if defined(DUK_F_OLD_SOLARIS) -/* Old Solaris with no endian.h, stdint.h */ -#define DUK_F_NO_STDINT_H -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#else /* DUK_F_OLD_SOLARIS */ -#include -#endif /* DUK_F_OLD_SOLARIS */ - -#include -#include -#include - -#define DUK_USE_OS_STRING "solaris" -#elif defined(DUK_F_AIX) -/* --- AIX --- */ -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include - -#define DUK_USE_OS_STRING "aix" -#elif defined(DUK_F_HPUX) -/* --- HPUX --- */ -#define DUK_F_NO_STDINT_H -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include - -#define DUK_USE_OS_STRING "hpux" -#elif defined(DUK_F_POSIX) -/* --- Generic POSIX --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -#define DUK_USE_OS_STRING "posix" -#elif defined(DUK_F_CYGWIN) -/* --- Cygwin --- */ -/* don't use strptime() for now */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#include -#include -#include - -#define DUK_JMPBUF_TYPE jmp_buf -#define DUK_SETJMP(jb) _setjmp((jb)) -#define DUK_LONGJMP(jb) _longjmp((jb), 1) - -#define DUK_USE_OS_STRING "windows" -#elif defined(DUK_F_UNIX) -/* --- Generic UNIX --- */ -#define DUK_USE_DATE_NOW_GETTIMEOFDAY -#define DUK_USE_DATE_TZO_GMTIME_R -#define DUK_USE_DATE_PRS_STRPTIME -#define DUK_USE_DATE_FMT_STRFTIME -#include -#include -#define DUK_USE_OS_STRING "unknown" -#else -/* --- Generic fallback --- */ -/* The most portable current time provider is time(), but it only has a - * one second resolution. - */ -#define DUK_USE_DATE_NOW_TIME - -/* The most portable way to figure out local time offset is gmtime(), - * but it's not thread safe so use with caution. - */ -#define DUK_USE_DATE_TZO_GMTIME - -/* Avoid custom date parsing and formatting for portability. */ -#undef DUK_USE_DATE_PRS_STRPTIME -#undef DUK_USE_DATE_FMT_STRFTIME - -/* Rely on C89 headers only; time.h must be here. */ -#include - -#define DUK_USE_OS_STRING "unknown" -#endif /* autodetect platform */ - -/* Shared includes: C89 */ -#include -#include -#include -#include /* varargs */ -#include -#include /* e.g. ptrdiff_t */ -#include -#include - -/* date.h is omitted, and included per platform */ - -/* Shared includes: stdint.h is C99 */ -#if defined(DUK_F_NO_STDINT_H) -/* stdint.h not available */ -#else -/* Technically C99 (C++11) but found in many systems. On some systems - * __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS must be defined before - * including stdint.h (see above). - */ -#include -#endif - -#if defined(DUK_F_CPP) -#include /* std::exception */ -#endif - -/* - * Architecture autodetection - */ - -#if defined(DUK_F_X86) -/* --- x86 --- */ -#define DUK_USE_ARCH_STRING "x86" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -/* XXX: This is technically not guaranteed because it's possible to configure - * an x86 to require aligned accesses with Alignment Check (AC) flag. - */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 1 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_X64) -/* --- x64 --- */ -#define DUK_USE_ARCH_STRING "x64" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -/* XXX: This is technically not guaranteed because it's possible to configure - * an x86 to require aligned accesses with Alignment Check (AC) flag. - */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 1 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_X32) -/* --- x32 --- */ -#define DUK_USE_ARCH_STRING "x32" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -/* XXX: This is technically not guaranteed because it's possible to configure - * an x86 to require aligned accesses with Alignment Check (AC) flag. - */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 1 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_ARM32) -/* --- ARM 32-bit --- */ -#define DUK_USE_ARCH_STRING "arm32" -/* Byte order varies, so rely on autodetect. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 4 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_ARM64) -/* --- ARM 64-bit --- */ -#define DUK_USE_ARCH_STRING "arm64" -/* Byte order varies, so rely on autodetect. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_MIPS32) -/* --- MIPS 32-bit --- */ -#define DUK_USE_ARCH_STRING "mips32" -/* MIPS byte order varies so rely on autodetection. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_MIPS64) -/* --- MIPS 64-bit --- */ -#define DUK_USE_ARCH_STRING "mips64" -/* MIPS byte order varies so rely on autodetection. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_PPC32) -/* --- PowerPC 32-bit --- */ -#define DUK_USE_ARCH_STRING "ppc32" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_PPC64) -/* --- PowerPC 64-bit --- */ -#define DUK_USE_ARCH_STRING "ppc64" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_SPARC32) -/* --- SPARC 32-bit --- */ -#define DUK_USE_ARCH_STRING "sparc32" -/* SPARC byte order varies so rely on autodetection. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_SPARC64) -/* --- SPARC 64-bit --- */ -#define DUK_USE_ARCH_STRING "sparc64" -/* SPARC byte order varies so rely on autodetection. */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_SUPERH) -/* --- SuperH --- */ -#define DUK_USE_ARCH_STRING "sh" -/* Byte order varies, rely on autodetection. */ -/* Based on 'make checkalign' there are no alignment requirements on - * Linux SH4, but align by 4 is probably a good basic default. - */ -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 4 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_M68K) -/* --- Motorola 68k --- */ -#define DUK_USE_ARCH_STRING "m68k" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 3 -#endif -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#define DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#elif defined(DUK_F_EMSCRIPTEN) -/* --- Emscripten --- */ -#define DUK_USE_ARCH_STRING "emscripten" -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -#if !defined(DUK_USE_ALIGN_BY) -#define DUK_USE_ALIGN_BY 8 -#endif -#undef DUK_USE_PACKED_TVAL -#define DUK_F_PACKED_TVAL_PROVIDED -#else -/* --- Generic --- */ -/* These are necessary wild guesses. */ -#define DUK_USE_ARCH_STRING "generic" -/* Rely on autodetection for byte order, alignment, and packed tval. */ -#endif /* autodetect architecture */ - -/* - * Compiler autodetection - */ - -#if defined(DUK_F_CLANG) -/* --- Clang --- */ -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -/* C99 / C++11 and above: rely on va_copy() which is required. */ -#define DUK_VA_COPY(dest,src) va_copy(dest,src) -#else -/* Clang: assume we have __va_copy() in non-C99 mode. */ -#define DUK_VA_COPY(dest,src) __va_copy(dest,src) -#endif - -#define DUK_NORETURN(decl) decl __attribute__((noreturn)) - -#if defined(__clang__) && defined(__has_builtin) -#if __has_builtin(__builtin_unreachable) -#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) -#endif -#endif - -#define DUK_USE_BRANCH_HINTS -#define DUK_LIKELY(x) __builtin_expect((x), 1) -#define DUK_UNLIKELY(x) __builtin_expect((x), 0) -#if defined(__clang__) && defined(__has_builtin) -#if __has_builtin(__builtin_unpredictable) -#define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x)) -#endif -#endif - -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_NOINLINE __attribute__((noinline)) -#define DUK_INLINE inline -#define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) -#endif - -/* DUK_HOT */ -/* DUK_COLD */ - -#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) -/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're - * compiling Duktape or the application. - */ -#if defined(DUK_COMPILING_DUKTAPE) -#define DUK_EXTERNAL_DECL extern __declspec(dllexport) -#define DUK_EXTERNAL __declspec(dllexport) -#else -#define DUK_EXTERNAL_DECL extern __declspec(dllimport) -#define DUK_EXTERNAL should_not_happen -#endif -#if defined(DUK_SINGLE_FILE) -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#else -#define DUK_INTERNAL_DECL extern -#define DUK_INTERNAL /*empty*/ -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static -#else -#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern -#define DUK_EXTERNAL __attribute__ ((visibility("default"))) -#if defined(DUK_SINGLE_FILE) -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and - * Clang. Based on documentation it should suffice to have the attribute - * in the declaration only, but in practice some warnings are generated unless - * the attribute is also applied to the definition. - */ -#define DUK_INTERNAL_DECL static __attribute__ ((unused)) -#define DUK_INTERNAL static __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#endif -#else -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) -#endif -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static -#endif - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "clang" -#else -#define DUK_USE_COMPILER_STRING "clang" -#endif - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_USE_VARIADIC_MACROS -#endif - -#define DUK_USE_UNION_INITIALIZERS - -#undef DUK_USE_FLEX_C99 -#undef DUK_USE_FLEX_ZEROSIZE -#undef DUK_USE_FLEX_ONESIZE -#if defined(DUK_F_C99) -#define DUK_USE_FLEX_C99 -#else -#define DUK_USE_FLEX_ZEROSIZE -#endif - -#undef DUK_USE_GCC_PRAGMAS -#define DUK_USE_PACK_CLANG_ATTR -#elif defined(DUK_F_GCC) -/* --- GCC --- */ -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -/* C99 / C++11 and above: rely on va_copy() which is required. */ -#define DUK_VA_COPY(dest,src) va_copy(dest,src) -#else -/* GCC: assume we have __va_copy() in non-C99 mode. */ -#define DUK_VA_COPY(dest,src) __va_copy(dest,src) -#endif - -#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 20500L) -/* since gcc-2.5 */ -#define DUK_NORETURN(decl) decl __attribute__((noreturn)) -#endif - -#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L) -/* since gcc-4.5 */ -#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) -#endif - -#define DUK_USE_BRANCH_HINTS -#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L) -/* GCC: test not very accurate; enable only in relatively recent builds - * because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html) - */ -#define DUK_LIKELY(x) __builtin_expect((x), 1) -#define DUK_UNLIKELY(x) __builtin_expect((x), 0) -#endif -/* XXX: equivalent of clang __builtin_unpredictable? */ - -#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \ - defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 30101) -#define DUK_NOINLINE __attribute__((noinline)) -#define DUK_INLINE inline -#define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) -#endif - -#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \ - defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40300) -#define DUK_HOT __attribute__((hot)) -#define DUK_COLD __attribute__((cold)) -#endif - -#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) -/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're - * compiling Duktape or the application. - */ -#if defined(DUK_COMPILING_DUKTAPE) -#define DUK_EXTERNAL_DECL extern __declspec(dllexport) -#define DUK_EXTERNAL __declspec(dllexport) -#else -#define DUK_EXTERNAL_DECL extern __declspec(dllimport) -#define DUK_EXTERNAL should_not_happen -#endif -#if defined(DUK_SINGLE_FILE) -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#else -#define DUK_INTERNAL_DECL extern -#define DUK_INTERNAL /*empty*/ -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static -#elif defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40000) -#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern -#define DUK_EXTERNAL __attribute__ ((visibility("default"))) -#if defined(DUK_SINGLE_FILE) -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and - * Clang. Based on documentation it should suffice to have the attribute - * in the declaration only, but in practice some warnings are generated unless - * the attribute is also applied to the definition. - */ -#define DUK_INTERNAL_DECL static __attribute__ ((unused)) -#define DUK_INTERNAL static __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#endif -#else -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) -#endif -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static -#endif - -#if defined(DUK_F_MINGW) -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "mingw++" -#else -#define DUK_USE_COMPILER_STRING "mingw" -#endif -#else -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "g++" -#else -#define DUK_USE_COMPILER_STRING "gcc" -#endif -#endif - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) || (defined(DUK_F_CPP11) && defined(__GNUC__)) -#define DUK_USE_VARIADIC_MACROS -#endif - -#define DUK_USE_UNION_INITIALIZERS - -#undef DUK_USE_FLEX_C99 -#undef DUK_USE_FLEX_ZEROSIZE -#undef DUK_USE_FLEX_ONESIZE -#if defined(DUK_F_C99) -#define DUK_USE_FLEX_C99 -#else -#define DUK_USE_FLEX_ZEROSIZE -#endif - -#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40600) -#define DUK_USE_GCC_PRAGMAS -#else -#undef DUK_USE_GCC_PRAGMAS -#endif - -#define DUK_USE_PACK_GCC_ATTR -#elif defined(DUK_F_MSVC) -/* --- MSVC --- */ -/* http://msdn.microsoft.com/en-us/library/aa235362(VS.60).aspx */ -#define DUK_NORETURN(decl) __declspec(noreturn) decl - -/* XXX: DUK_UNREACHABLE for msvc? */ - -#undef DUK_USE_BRANCH_HINTS - -/* XXX: DUK_LIKELY, DUK_UNLIKELY for msvc? */ -/* XXX: DUK_NOINLINE, DUK_INLINE, DUK_ALWAYS_INLINE for msvc? */ - -#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS) -/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're - * compiling Duktape or the application. - */ -#if defined(DUK_COMPILING_DUKTAPE) -#define DUK_EXTERNAL_DECL extern __declspec(dllexport) -#define DUK_EXTERNAL __declspec(dllexport) -#else -#define DUK_EXTERNAL_DECL extern __declspec(dllimport) -#define DUK_EXTERNAL should_not_happen -#endif -#if defined(DUK_SINGLE_FILE) -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#else -#define DUK_INTERNAL_DECL extern -#define DUK_INTERNAL /*empty*/ -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static -#endif - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "msvc++" -#else -#define DUK_USE_COMPILER_STRING "msvc" -#endif - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) -#define DUK_USE_VARIADIC_MACROS -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) -/* VS2005+ should have variadic macros even when they're not C99. */ -#define DUK_USE_VARIADIC_MACROS -#endif - -#undef DUK_USE_UNION_INITIALIZERS -#if defined(_MSC_VER) && (_MSC_VER >= 1800) -/* VS2013+ supports union initializers but there's a bug involving union-inside-struct: - * https://connect.microsoft.com/VisualStudio/feedback/details/805981 - * The bug was fixed (at least) in VS2015 so check for VS2015 for now: - * https://blogs.msdn.microsoft.com/vcblog/2015/07/01/c-compiler-front-end-fixes-in-vs2015/ - * Manually tested using VS2013, CL reports 18.00.31101, so enable for VS2013 too. - */ -#define DUK_USE_UNION_INITIALIZERS -#endif - -#undef DUK_USE_FLEX_C99 -#undef DUK_USE_FLEX_ZEROSIZE -#undef DUK_USE_FLEX_ONESIZE -#if defined(DUK_F_C99) -#define DUK_USE_FLEX_C99 -#else -#define DUK_USE_FLEX_ZEROSIZE -#endif - -#undef DUK_USE_GCC_PRAGMAS - -#define DUK_USE_PACK_MSVC_PRAGMA - -/* These have been tested from VS2008 onwards; may work in older VS versions - * too but not enabled by default. - */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -#define DUK_NOINLINE __declspec(noinline) -#define DUK_INLINE __inline -#define DUK_ALWAYS_INLINE __forceinline -#endif - -#if defined(_MSC_VER) && (_MSC_VER >= 1900) -#define DUK_SNPRINTF snprintf -#define DUK_VSNPRINTF vsnprintf -#else -/* (v)snprintf() is missing before MSVC 2015. Note that _(v)snprintf() does - * NOT NUL terminate on truncation, but Duktape code never assumes that. - * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 - */ -#define DUK_SNPRINTF _snprintf -#define DUK_VSNPRINTF _vsnprintf -#endif - -/* Avoid warning when doing DUK_UNREF(some_function). */ -#if defined(_MSC_VER) && (_MSC_VER < 1500) -#pragma warning(disable: 4100 4101 4550 4551) -#define DUK_UNREF(x) -#else -#define DUK_UNREF(x) do { __pragma(warning(suppress:4100 4101 4550 4551)) (x); } while (0) -#endif - -/* Older versions of MSVC don't support the LL/ULL suffix. */ -#define DUK_U64_CONSTANT(x) x##ui64 -#define DUK_I64_CONSTANT(x) x##i64 -#elif defined(DUK_F_EMSCRIPTEN) -/* --- Emscripten --- */ -#define DUK_NORETURN(decl) decl __attribute__((noreturn)) - -#if defined(__clang__) && defined(__has_builtin) -#if __has_builtin(__builtin_unreachable) -#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0) -#endif -#endif - -#define DUK_USE_BRANCH_HINTS -#define DUK_LIKELY(x) __builtin_expect((x), 1) -#define DUK_UNLIKELY(x) __builtin_expect((x), 0) -#if defined(__clang__) && defined(__has_builtin) -#if __has_builtin(__builtin_unpredictable) -#define DUK_UNPREDICTABLE(x) __builtin_unpredictable((x)) -#endif -#endif - -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_NOINLINE __attribute__((noinline)) -#define DUK_INLINE inline -#define DUK_ALWAYS_INLINE inline __attribute__((always_inline)) -#endif - -#define DUK_EXTERNAL_DECL __attribute__ ((visibility("default"))) extern -#define DUK_EXTERNAL __attribute__ ((visibility("default"))) -#if defined(DUK_SINGLE_FILE) -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and - * Clang. Based on documentation it should suffice to have the attribute - * in the declaration only, but in practice some warnings are generated unless - * the attribute is also applied to the definition. - */ -#define DUK_INTERNAL_DECL static __attribute__ ((unused)) -#define DUK_INTERNAL static __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL static -#define DUK_INTERNAL static -#endif -#else -#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG) -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) __attribute__ ((unused)) -#else -#define DUK_INTERNAL_DECL __attribute__ ((visibility("hidden"))) extern -#define DUK_INTERNAL __attribute__ ((visibility("hidden"))) -#endif -#endif -#define DUK_LOCAL_DECL static -#define DUK_LOCAL static - -#define DUK_USE_COMPILER_STRING "emscripten" - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_USE_VARIADIC_MACROS -#endif - -#define DUK_USE_UNION_INITIALIZERS - -#undef DUK_USE_FLEX_C99 -#undef DUK_USE_FLEX_ZEROSIZE -#undef DUK_USE_FLEX_ONESIZE -#if defined(DUK_F_C99) -#define DUK_USE_FLEX_C99 -#else -#define DUK_USE_FLEX_ZEROSIZE -#endif - -#undef DUK_USE_GCC_PRAGMAS -#define DUK_USE_PACK_CLANG_ATTR -#elif defined(DUK_F_TINYC) -/* --- TinyC --- */ -#undef DUK_USE_BRANCH_HINTS - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "tinyc++" -#else -#define DUK_USE_COMPILER_STRING "tinyc" -#endif - -/* http://bellard.org/tcc/tcc-doc.html#SEC7 */ -#define DUK_USE_VARIADIC_MACROS - -#define DUK_USE_UNION_INITIALIZERS - -/* Most portable, wastes space */ -#define DUK_USE_FLEX_ONESIZE - -/* Most portable, potentially wastes space */ -#define DUK_USE_PACK_DUMMY_MEMBER -#elif defined(DUK_F_VBCC) -/* --- VBCC --- */ -#undef DUK_USE_BRANCH_HINTS - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "vbcc-c++" -#else -#define DUK_USE_COMPILER_STRING "vbcc" -#endif - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_USE_VARIADIC_MACROS -#endif - -/* VBCC supports C99 so check only for C99 for union initializer support. - * Designated union initializers would possibly work even without a C99 check. - */ -#undef DUK_USE_UNION_INITIALIZERS -#if defined(DUK_F_C99) -#define DUK_USE_UNION_INITIALIZERS -#endif - -#define DUK_USE_FLEX_ZEROSIZE -#define DUK_USE_PACK_DUMMY_MEMBER -#elif defined(DUK_F_BCC) -/* --- Bruce's C compiler --- */ -#undef DUK_USE_BRANCH_HINTS - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "bcc++" -#else -#define DUK_USE_COMPILER_STRING "bcc" -#endif - -/* Most portable */ -#undef DUK_USE_VARIADIC_MACROS - -/* Most portable, wastes space */ -#undef DUK_USE_UNION_INITIALIZERS - -/* Most portable, wastes space */ -#define DUK_USE_FLEX_ONESIZE - -/* Most portable, potentially wastes space */ -#define DUK_USE_PACK_DUMMY_MEMBER - -/* BCC, assume we're on x86. */ -#if !defined(DUK_USE_BYTEORDER) -#define DUK_USE_BYTEORDER 1 -#endif -#else -/* --- Generic --- */ -#undef DUK_USE_BRANCH_HINTS - -#if defined(DUK_F_CPP) -#define DUK_USE_COMPILER_STRING "generic-c++" -#else -#define DUK_USE_COMPILER_STRING "generic" -#endif - -#undef DUK_USE_VARIADIC_MACROS -#if defined(DUK_F_C99) || defined(DUK_F_CPP11) -#define DUK_USE_VARIADIC_MACROS -#endif - -/* C++ doesn't have standard designated union initializers ({ .foo = 1 }). */ -#undef DUK_USE_UNION_INITIALIZERS -#if defined(DUK_F_C99) -#define DUK_USE_UNION_INITIALIZERS -#endif - -/* Most portable, wastes space */ -#define DUK_USE_FLEX_ONESIZE - -/* Most portable, potentially wastes space */ -#define DUK_USE_PACK_DUMMY_MEMBER -#endif /* autodetect compiler */ - -/* uclibc */ -#if defined(__UCLIBC__) -#define DUK_F_UCLIBC -#endif - -/* - * Wrapper typedefs and constants for integer types, also sanity check types. - * - * C99 typedefs are quite good but not always available, and we want to avoid - * forcibly redefining the C99 typedefs. So, there are Duktape wrappers for - * all C99 typedefs and Duktape code should only use these typedefs. Type - * detection when C99 is not supported is best effort and may end up detecting - * some types incorrectly. - * - * Pointer sizes are a portability problem: pointers to different types may - * have a different size and function pointers are very difficult to manage - * portably. - * - * http://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types - * - * Note: there's an interesting corner case when trying to define minimum - * signed integer value constants which leads to the current workaround of - * defining e.g. -0x80000000 as (-0x7fffffffL - 1L). See doc/code-issues.txt - * for a longer discussion. - * - * Note: avoid typecasts and computations in macro integer constants as they - * can then no longer be used in macro relational expressions (such as - * #if DUK_SIZE_MAX < 0xffffffffUL). There is internal code which relies on - * being able to compare DUK_SIZE_MAX against a limit. - */ - -/* XXX: add feature options to force basic types from outside? */ - -#if !defined(INT_MAX) -#error INT_MAX not defined -#endif - -/* Check that architecture is two's complement, standard C allows e.g. - * INT_MIN to be -2**31+1 (instead of -2**31). - */ -#if defined(INT_MAX) && defined(INT_MIN) -#if INT_MAX != -(INT_MIN + 1) -#error platform does not seem complement of two -#endif -#else -#error cannot check complement of two -#endif - -/* Pointer size determination based on __WORDSIZE or architecture when - * that's not available. - */ -#if defined(DUK_F_X86) || defined(DUK_F_X32) || \ - defined(DUK_F_M68K) || defined(DUK_F_PPC32) || \ - defined(DUK_F_BCC) || \ - (defined(__WORDSIZE) && (__WORDSIZE == 32)) || \ - ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \ - defined(DUK_F_HPUX)) && defined(_ILP32)) || \ - defined(DUK_F_ARM32) -#define DUK_F_32BIT_PTRS -#elif defined(DUK_F_X64) || \ - (defined(__WORDSIZE) && (__WORDSIZE == 64)) || \ - ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \ - defined(DUK_F_HPUX)) && defined(_LP64)) || \ - defined(DUK_F_ARM64) -#define DUK_F_64BIT_PTRS -#else -/* not sure, not needed with C99 anyway */ -#endif - -/* Intermediate define for 'have inttypes.h' */ -#undef DUK_F_HAVE_INTTYPES -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ - !(defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC)) -/* vbcc + AmigaOS has C99 but no inttypes.h */ -#define DUK_F_HAVE_INTTYPES -#elif defined(__cplusplus) && (__cplusplus >= 201103L) -/* C++11 apparently ratified stdint.h */ -#define DUK_F_HAVE_INTTYPES -#endif - -/* Basic integer typedefs and limits, preferably from inttypes.h, otherwise - * through automatic detection. - */ -#if defined(DUK_F_HAVE_INTTYPES) -/* C99 or compatible */ - -#define DUK_F_HAVE_64BIT -#include - -typedef uint8_t duk_uint8_t; -typedef int8_t duk_int8_t; -typedef uint16_t duk_uint16_t; -typedef int16_t duk_int16_t; -typedef uint32_t duk_uint32_t; -typedef int32_t duk_int32_t; -typedef uint64_t duk_uint64_t; -typedef int64_t duk_int64_t; -typedef uint_least8_t duk_uint_least8_t; -typedef int_least8_t duk_int_least8_t; -typedef uint_least16_t duk_uint_least16_t; -typedef int_least16_t duk_int_least16_t; -typedef uint_least32_t duk_uint_least32_t; -typedef int_least32_t duk_int_least32_t; -typedef uint_least64_t duk_uint_least64_t; -typedef int_least64_t duk_int_least64_t; -typedef uint_fast8_t duk_uint_fast8_t; -typedef int_fast8_t duk_int_fast8_t; -typedef uint_fast16_t duk_uint_fast16_t; -typedef int_fast16_t duk_int_fast16_t; -typedef uint_fast32_t duk_uint_fast32_t; -typedef int_fast32_t duk_int_fast32_t; -typedef uint_fast64_t duk_uint_fast64_t; -typedef int_fast64_t duk_int_fast64_t; -typedef uintptr_t duk_uintptr_t; -typedef intptr_t duk_intptr_t; -typedef uintmax_t duk_uintmax_t; -typedef intmax_t duk_intmax_t; - -#define DUK_UINT8_MIN 0 -#define DUK_UINT8_MAX UINT8_MAX -#define DUK_INT8_MIN INT8_MIN -#define DUK_INT8_MAX INT8_MAX -#define DUK_UINT_LEAST8_MIN 0 -#define DUK_UINT_LEAST8_MAX UINT_LEAST8_MAX -#define DUK_INT_LEAST8_MIN INT_LEAST8_MIN -#define DUK_INT_LEAST8_MAX INT_LEAST8_MAX -#define DUK_UINT_FAST8_MIN 0 -#define DUK_UINT_FAST8_MAX UINT_FAST8_MAX -#define DUK_INT_FAST8_MIN INT_FAST8_MIN -#define DUK_INT_FAST8_MAX INT_FAST8_MAX -#define DUK_UINT16_MIN 0 -#define DUK_UINT16_MAX UINT16_MAX -#define DUK_INT16_MIN INT16_MIN -#define DUK_INT16_MAX INT16_MAX -#define DUK_UINT_LEAST16_MIN 0 -#define DUK_UINT_LEAST16_MAX UINT_LEAST16_MAX -#define DUK_INT_LEAST16_MIN INT_LEAST16_MIN -#define DUK_INT_LEAST16_MAX INT_LEAST16_MAX -#define DUK_UINT_FAST16_MIN 0 -#define DUK_UINT_FAST16_MAX UINT_FAST16_MAX -#define DUK_INT_FAST16_MIN INT_FAST16_MIN -#define DUK_INT_FAST16_MAX INT_FAST16_MAX -#define DUK_UINT32_MIN 0 -#define DUK_UINT32_MAX UINT32_MAX -#define DUK_INT32_MIN INT32_MIN -#define DUK_INT32_MAX INT32_MAX -#define DUK_UINT_LEAST32_MIN 0 -#define DUK_UINT_LEAST32_MAX UINT_LEAST32_MAX -#define DUK_INT_LEAST32_MIN INT_LEAST32_MIN -#define DUK_INT_LEAST32_MAX INT_LEAST32_MAX -#define DUK_UINT_FAST32_MIN 0 -#define DUK_UINT_FAST32_MAX UINT_FAST32_MAX -#define DUK_INT_FAST32_MIN INT_FAST32_MIN -#define DUK_INT_FAST32_MAX INT_FAST32_MAX -#define DUK_UINT64_MIN 0 -#define DUK_UINT64_MAX UINT64_MAX -#define DUK_INT64_MIN INT64_MIN -#define DUK_INT64_MAX INT64_MAX -#define DUK_UINT_LEAST64_MIN 0 -#define DUK_UINT_LEAST64_MAX UINT_LEAST64_MAX -#define DUK_INT_LEAST64_MIN INT_LEAST64_MIN -#define DUK_INT_LEAST64_MAX INT_LEAST64_MAX -#define DUK_UINT_FAST64_MIN 0 -#define DUK_UINT_FAST64_MAX UINT_FAST64_MAX -#define DUK_INT_FAST64_MIN INT_FAST64_MIN -#define DUK_INT_FAST64_MAX INT_FAST64_MAX - -#define DUK_UINTPTR_MIN 0 -#define DUK_UINTPTR_MAX UINTPTR_MAX -#define DUK_INTPTR_MIN INTPTR_MIN -#define DUK_INTPTR_MAX INTPTR_MAX - -#define DUK_UINTMAX_MIN 0 -#define DUK_UINTMAX_MAX UINTMAX_MAX -#define DUK_INTMAX_MIN INTMAX_MIN -#define DUK_INTMAX_MAX INTMAX_MAX - -#define DUK_SIZE_MIN 0 -#define DUK_SIZE_MAX SIZE_MAX -#undef DUK_SIZE_MAX_COMPUTED - -#else /* C99 types */ - -/* When C99 types are not available, we use heuristic detection to get - * the basic 8, 16, 32, and (possibly) 64 bit types. The fast/least - * types are then assumed to be exactly the same for now: these could - * be improved per platform but C99 types are very often now available. - * 64-bit types are not available on all platforms; this is OK at least - * on 32-bit platforms. - * - * This detection code is necessarily a bit hacky and can provide typedefs - * and defines that won't work correctly on some exotic platform. - */ - -#if (defined(CHAR_BIT) && (CHAR_BIT == 8)) || \ - (defined(UCHAR_MAX) && (UCHAR_MAX == 255)) -typedef unsigned char duk_uint8_t; -typedef signed char duk_int8_t; -#else -#error cannot detect 8-bit type -#endif - -#if defined(USHRT_MAX) && (USHRT_MAX == 65535UL) -typedef unsigned short duk_uint16_t; -typedef signed short duk_int16_t; -#elif defined(UINT_MAX) && (UINT_MAX == 65535UL) -/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */ -typedef unsigned int duk_uint16_t; -typedef signed int duk_int16_t; -#else -#error cannot detect 16-bit type -#endif - -#if defined(UINT_MAX) && (UINT_MAX == 4294967295UL) -typedef unsigned int duk_uint32_t; -typedef signed int duk_int32_t; -#elif defined(ULONG_MAX) && (ULONG_MAX == 4294967295UL) -/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */ -typedef unsigned long duk_uint32_t; -typedef signed long duk_int32_t; -#else -#error cannot detect 32-bit type -#endif - -/* 64-bit type detection is a bit tricky. - * - * ULLONG_MAX is a standard define. __LONG_LONG_MAX__ and __ULONG_LONG_MAX__ - * are used by at least GCC (even if system headers don't provide ULLONG_MAX). - * Some GCC variants may provide __LONG_LONG_MAX__ but not __ULONG_LONG_MAX__. - * - * ULL / LL constants are rejected / warned about by some compilers, even if - * the compiler has a 64-bit type and the compiler/system headers provide an - * unsupported constant (ULL/LL)! Try to avoid using ULL / LL constants. - * As a side effect we can only check that e.g. ULONG_MAX is larger than 32 - * bits but can't be sure it is exactly 64 bits. Self tests will catch such - * cases. - */ -#undef DUK_F_HAVE_64BIT -#if !defined(DUK_F_HAVE_64BIT) && defined(ULONG_MAX) -#if (ULONG_MAX > 4294967295UL) -#define DUK_F_HAVE_64BIT -typedef unsigned long duk_uint64_t; -typedef signed long duk_int64_t; -#endif -#endif -#if !defined(DUK_F_HAVE_64BIT) && defined(ULLONG_MAX) -#if (ULLONG_MAX > 4294967295UL) -#define DUK_F_HAVE_64BIT -typedef unsigned long long duk_uint64_t; -typedef signed long long duk_int64_t; -#endif -#endif -#if !defined(DUK_F_HAVE_64BIT) && defined(__ULONG_LONG_MAX__) -#if (__ULONG_LONG_MAX__ > 4294967295UL) -#define DUK_F_HAVE_64BIT -typedef unsigned long long duk_uint64_t; -typedef signed long long duk_int64_t; -#endif -#endif -#if !defined(DUK_F_HAVE_64BIT) && defined(__LONG_LONG_MAX__) -#if (__LONG_LONG_MAX__ > 2147483647L) -#define DUK_F_HAVE_64BIT -typedef unsigned long long duk_uint64_t; -typedef signed long long duk_int64_t; -#endif -#endif -#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MINGW) -#define DUK_F_HAVE_64BIT -typedef unsigned long duk_uint64_t; -typedef signed long duk_int64_t; -#endif -#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MSVC) -#define DUK_F_HAVE_64BIT -typedef unsigned __int64 duk_uint64_t; -typedef signed __int64 duk_int64_t; -#endif -#if !defined(DUK_F_HAVE_64BIT) -/* cannot detect 64-bit type, not always needed so don't error */ -#endif - -typedef duk_uint8_t duk_uint_least8_t; -typedef duk_int8_t duk_int_least8_t; -typedef duk_uint16_t duk_uint_least16_t; -typedef duk_int16_t duk_int_least16_t; -typedef duk_uint32_t duk_uint_least32_t; -typedef duk_int32_t duk_int_least32_t; -typedef duk_uint8_t duk_uint_fast8_t; -typedef duk_int8_t duk_int_fast8_t; -typedef duk_uint16_t duk_uint_fast16_t; -typedef duk_int16_t duk_int_fast16_t; -typedef duk_uint32_t duk_uint_fast32_t; -typedef duk_int32_t duk_int_fast32_t; -#if defined(DUK_F_HAVE_64BIT) -typedef duk_uint64_t duk_uint_least64_t; -typedef duk_int64_t duk_int_least64_t; -typedef duk_uint64_t duk_uint_fast64_t; -typedef duk_int64_t duk_int_fast64_t; -#endif -#if defined(DUK_F_HAVE_64BIT) -typedef duk_uint64_t duk_uintmax_t; -typedef duk_int64_t duk_intmax_t; -#else -typedef duk_uint32_t duk_uintmax_t; -typedef duk_int32_t duk_intmax_t; -#endif - -/* Note: the funny looking computations for signed minimum 16-bit, 32-bit, and - * 64-bit values are intentional as the obvious forms (e.g. -0x80000000L) are - * -not- portable. See code-issues.txt for a detailed discussion. - */ -#define DUK_UINT8_MIN 0UL -#define DUK_UINT8_MAX 0xffUL -#define DUK_INT8_MIN (-0x80L) -#define DUK_INT8_MAX 0x7fL -#define DUK_UINT_LEAST8_MIN 0UL -#define DUK_UINT_LEAST8_MAX 0xffUL -#define DUK_INT_LEAST8_MIN (-0x80L) -#define DUK_INT_LEAST8_MAX 0x7fL -#define DUK_UINT_FAST8_MIN 0UL -#define DUK_UINT_FAST8_MAX 0xffUL -#define DUK_INT_FAST8_MIN (-0x80L) -#define DUK_INT_FAST8_MAX 0x7fL -#define DUK_UINT16_MIN 0UL -#define DUK_UINT16_MAX 0xffffUL -#define DUK_INT16_MIN (-0x7fffL - 1L) -#define DUK_INT16_MAX 0x7fffL -#define DUK_UINT_LEAST16_MIN 0UL -#define DUK_UINT_LEAST16_MAX 0xffffUL -#define DUK_INT_LEAST16_MIN (-0x7fffL - 1L) -#define DUK_INT_LEAST16_MAX 0x7fffL -#define DUK_UINT_FAST16_MIN 0UL -#define DUK_UINT_FAST16_MAX 0xffffUL -#define DUK_INT_FAST16_MIN (-0x7fffL - 1L) -#define DUK_INT_FAST16_MAX 0x7fffL -#define DUK_UINT32_MIN 0UL -#define DUK_UINT32_MAX 0xffffffffUL -#define DUK_INT32_MIN (-0x7fffffffL - 1L) -#define DUK_INT32_MAX 0x7fffffffL -#define DUK_UINT_LEAST32_MIN 0UL -#define DUK_UINT_LEAST32_MAX 0xffffffffUL -#define DUK_INT_LEAST32_MIN (-0x7fffffffL - 1L) -#define DUK_INT_LEAST32_MAX 0x7fffffffL -#define DUK_UINT_FAST32_MIN 0UL -#define DUK_UINT_FAST32_MAX 0xffffffffUL -#define DUK_INT_FAST32_MIN (-0x7fffffffL - 1L) -#define DUK_INT_FAST32_MAX 0x7fffffffL - -/* 64-bit constants. Since LL / ULL constants are not always available, - * use computed values. These values can't be used in preprocessor - * comparisons; flag them as such. - */ -#if defined(DUK_F_HAVE_64BIT) -#define DUK_UINT64_MIN ((duk_uint64_t) 0) -#define DUK_UINT64_MAX ((duk_uint64_t) -1) -#define DUK_INT64_MIN ((duk_int64_t) (~(DUK_UINT64_MAX >> 1))) -#define DUK_INT64_MAX ((duk_int64_t) (DUK_UINT64_MAX >> 1)) -#define DUK_UINT_LEAST64_MIN DUK_UINT64_MIN -#define DUK_UINT_LEAST64_MAX DUK_UINT64_MAX -#define DUK_INT_LEAST64_MIN DUK_INT64_MIN -#define DUK_INT_LEAST64_MAX DUK_INT64_MAX -#define DUK_UINT_FAST64_MIN DUK_UINT64_MIN -#define DUK_UINT_FAST64_MAX DUK_UINT64_MAX -#define DUK_INT_FAST64_MIN DUK_INT64_MIN -#define DUK_INT_FAST64_MAX DUK_INT64_MAX -#define DUK_UINT64_MIN_COMPUTED -#define DUK_UINT64_MAX_COMPUTED -#define DUK_INT64_MIN_COMPUTED -#define DUK_INT64_MAX_COMPUTED -#define DUK_UINT_LEAST64_MIN_COMPUTED -#define DUK_UINT_LEAST64_MAX_COMPUTED -#define DUK_INT_LEAST64_MIN_COMPUTED -#define DUK_INT_LEAST64_MAX_COMPUTED -#define DUK_UINT_FAST64_MIN_COMPUTED -#define DUK_UINT_FAST64_MAX_COMPUTED -#define DUK_INT_FAST64_MIN_COMPUTED -#define DUK_INT_FAST64_MAX_COMPUTED -#endif - -#if defined(DUK_F_HAVE_64BIT) -#define DUK_UINTMAX_MIN DUK_UINT64_MIN -#define DUK_UINTMAX_MAX DUK_UINT64_MAX -#define DUK_INTMAX_MIN DUK_INT64_MIN -#define DUK_INTMAX_MAX DUK_INT64_MAX -#define DUK_UINTMAX_MIN_COMPUTED -#define DUK_UINTMAX_MAX_COMPUTED -#define DUK_INTMAX_MIN_COMPUTED -#define DUK_INTMAX_MAX_COMPUTED -#else -#define DUK_UINTMAX_MIN 0UL -#define DUK_UINTMAX_MAX 0xffffffffUL -#define DUK_INTMAX_MIN (-0x7fffffffL - 1L) -#define DUK_INTMAX_MAX 0x7fffffffL -#endif - -/* This detection is not very reliable. */ -#if defined(DUK_F_32BIT_PTRS) -typedef duk_int32_t duk_intptr_t; -typedef duk_uint32_t duk_uintptr_t; -#define DUK_UINTPTR_MIN DUK_UINT32_MIN -#define DUK_UINTPTR_MAX DUK_UINT32_MAX -#define DUK_INTPTR_MIN DUK_INT32_MIN -#define DUK_INTPTR_MAX DUK_INT32_MAX -#elif defined(DUK_F_64BIT_PTRS) && defined(DUK_F_HAVE_64BIT) -typedef duk_int64_t duk_intptr_t; -typedef duk_uint64_t duk_uintptr_t; -#define DUK_UINTPTR_MIN DUK_UINT64_MIN -#define DUK_UINTPTR_MAX DUK_UINT64_MAX -#define DUK_INTPTR_MIN DUK_INT64_MIN -#define DUK_INTPTR_MAX DUK_INT64_MAX -#define DUK_UINTPTR_MIN_COMPUTED -#define DUK_UINTPTR_MAX_COMPUTED -#define DUK_INTPTR_MIN_COMPUTED -#define DUK_INTPTR_MAX_COMPUTED -#else -#error cannot determine intptr type -#endif - -/* SIZE_MAX may be missing so use an approximate value for it. */ -#undef DUK_SIZE_MAX_COMPUTED -#if !defined(SIZE_MAX) -#define DUK_SIZE_MAX_COMPUTED -#define SIZE_MAX ((size_t) (-1)) -#endif -#define DUK_SIZE_MIN 0 -#define DUK_SIZE_MAX SIZE_MAX - -#endif /* C99 types */ - -/* A few types are assumed to always exist. */ -typedef size_t duk_size_t; -typedef ptrdiff_t duk_ptrdiff_t; - -/* The best type for an "all around int" in Duktape internals is "at least - * 32 bit signed integer" which is most convenient. Same for unsigned type. - * Prefer 'int' when large enough, as it is almost always a convenient type. - */ -#if defined(UINT_MAX) && (UINT_MAX >= 0xffffffffUL) -typedef int duk_int_t; -typedef unsigned int duk_uint_t; -#define DUK_INT_MIN INT_MIN -#define DUK_INT_MAX INT_MAX -#define DUK_UINT_MIN 0 -#define DUK_UINT_MAX UINT_MAX -#else -typedef duk_int_fast32_t duk_int_t; -typedef duk_uint_fast32_t duk_uint_t; -#define DUK_INT_MIN DUK_INT_FAST32_MIN -#define DUK_INT_MAX DUK_INT_FAST32_MAX -#define DUK_UINT_MIN DUK_UINT_FAST32_MIN -#define DUK_UINT_MAX DUK_UINT_FAST32_MAX -#endif - -/* Same as 'duk_int_t' but guaranteed to be a 'fast' variant if this - * distinction matters for the CPU. These types are used mainly in the - * executor where it might really matter. - */ -typedef duk_int_fast32_t duk_int_fast_t; -typedef duk_uint_fast32_t duk_uint_fast_t; -#define DUK_INT_FAST_MIN DUK_INT_FAST32_MIN -#define DUK_INT_FAST_MAX DUK_INT_FAST32_MAX -#define DUK_UINT_FAST_MIN DUK_UINT_FAST32_MIN -#define DUK_UINT_FAST_MAX DUK_UINT_FAST32_MAX - -/* Small integers (16 bits or more) can fall back to the 'int' type, but - * have a typedef so they are marked "small" explicitly. - */ -typedef int duk_small_int_t; -typedef unsigned int duk_small_uint_t; -#define DUK_SMALL_INT_MIN INT_MIN -#define DUK_SMALL_INT_MAX INT_MAX -#define DUK_SMALL_UINT_MIN 0 -#define DUK_SMALL_UINT_MAX UINT_MAX - -/* Fast variants of small integers, again for really fast paths like the - * executor. - */ -typedef duk_int_fast16_t duk_small_int_fast_t; -typedef duk_uint_fast16_t duk_small_uint_fast_t; -#define DUK_SMALL_INT_FAST_MIN DUK_INT_FAST16_MIN -#define DUK_SMALL_INT_FAST_MAX DUK_INT_FAST16_MAX -#define DUK_SMALL_UINT_FAST_MIN DUK_UINT_FAST16_MIN -#define DUK_SMALL_UINT_FAST_MAX DUK_UINT_FAST16_MAX - -/* Boolean values are represented with the platform 'unsigned int'. */ -typedef duk_small_uint_t duk_bool_t; -#define DUK_BOOL_MIN DUK_SMALL_UINT_MIN -#define DUK_BOOL_MAX DUK_SMALL_UINT_MAX - -/* Index values must have at least 32-bit signed range. */ -typedef duk_int_t duk_idx_t; -#define DUK_IDX_MIN DUK_INT_MIN -#define DUK_IDX_MAX DUK_INT_MAX - -/* Unsigned index variant. */ -typedef duk_uint_t duk_uidx_t; -#define DUK_UIDX_MIN DUK_UINT_MIN -#define DUK_UIDX_MAX DUK_UINT_MAX - -/* Array index values, could be exact 32 bits. - * Currently no need for signed duk_arridx_t. - */ -typedef duk_uint_t duk_uarridx_t; -#define DUK_UARRIDX_MIN DUK_UINT_MIN -#define DUK_UARRIDX_MAX DUK_UINT_MAX - -/* Duktape/C function return value, platform int is enough for now to - * represent 0, 1, or negative error code. Must be compatible with - * assigning truth values (e.g. duk_ret_t rc = (foo == bar);). - */ -typedef duk_small_int_t duk_ret_t; -#define DUK_RET_MIN DUK_SMALL_INT_MIN -#define DUK_RET_MAX DUK_SMALL_INT_MAX - -/* Error codes are represented with platform int. High bits are used - * for flags and such, so 32 bits are needed. - */ -typedef duk_int_t duk_errcode_t; -#define DUK_ERRCODE_MIN DUK_INT_MIN -#define DUK_ERRCODE_MAX DUK_INT_MAX - -/* Codepoint type. Must be 32 bits or more because it is used also for - * internal codepoints. The type is signed because negative codepoints - * are used as internal markers (e.g. to mark EOF or missing argument). - * (X)UTF-8/CESU-8 encode/decode take and return an unsigned variant to - * ensure duk_uint32_t casts back and forth nicely. Almost everything - * else uses the signed one. - */ -typedef duk_int_t duk_codepoint_t; -typedef duk_uint_t duk_ucodepoint_t; -#define DUK_CODEPOINT_MIN DUK_INT_MIN -#define DUK_CODEPOINT_MAX DUK_INT_MAX -#define DUK_UCODEPOINT_MIN DUK_UINT_MIN -#define DUK_UCODEPOINT_MAX DUK_UINT_MAX - -/* IEEE float/double typedef. */ -typedef float duk_float_t; -typedef double duk_double_t; - -/* We're generally assuming that we're working on a platform with a 32-bit - * address space. If DUK_SIZE_MAX is a typecast value (which is necessary - * if SIZE_MAX is missing), the check must be avoided because the - * preprocessor can't do a comparison. - */ -#if !defined(DUK_SIZE_MAX) -#error DUK_SIZE_MAX is undefined, probably missing SIZE_MAX -#elif !defined(DUK_SIZE_MAX_COMPUTED) -#if DUK_SIZE_MAX < 0xffffffffUL -/* On some systems SIZE_MAX can be smaller than max unsigned 32-bit value - * which seems incorrect if size_t is (at least) an unsigned 32-bit type. - * However, it doesn't seem useful to error out compilation if this is the - * case. - */ -#endif -#endif - -/* Type used in public API declarations and user code. Typedef maps to - * 'struct duk_hthread' like the 'duk_hthread' typedef which is used - * exclusively in internals. - */ -typedef struct duk_hthread duk_context; - -/* Check whether we should use 64-bit integers or not. - * - * Quite incomplete now. Use 64-bit types if detected (C99 or other detection) - * unless they are known to be unreliable. For instance, 64-bit types are - * available on VBCC but seem to misbehave. - */ -#if defined(DUK_F_HAVE_64BIT) && !defined(DUK_F_VBCC) -#define DUK_USE_64BIT_OPS -#else -#undef DUK_USE_64BIT_OPS -#endif - -/* - * Fill-ins for platform, architecture, and compiler - */ - -/* An abort()-like primitive is needed by the default fatal error handler. */ -#if !defined(DUK_ABORT) -#define DUK_ABORT abort -#endif - -#if !defined(DUK_SETJMP) -#define DUK_JMPBUF_TYPE jmp_buf -#define DUK_SETJMP(jb) setjmp((jb)) -#define DUK_LONGJMP(jb) longjmp((jb), 1) -#endif - -#if 0 -/* sigsetjmp() alternative */ -#define DUK_JMPBUF_TYPE sigjmp_buf -#define DUK_SETJMP(jb) sigsetjmp((jb)) -#define DUK_LONGJMP(jb) siglongjmp((jb), 1) -#endif - -/* Special naming to avoid conflict with e.g. DUK_FREE() in duk_heap.h - * (which is unfortunately named). May sometimes need replacement, e.g. - * some compilers don't handle zero length or NULL correctly in realloc(). - */ -#if !defined(DUK_ANSI_MALLOC) -#define DUK_ANSI_MALLOC malloc -#endif -#if !defined(DUK_ANSI_REALLOC) -#define DUK_ANSI_REALLOC realloc -#endif -#if !defined(DUK_ANSI_CALLOC) -#define DUK_ANSI_CALLOC calloc -#endif -#if !defined(DUK_ANSI_FREE) -#define DUK_ANSI_FREE free -#endif - -/* ANSI C (various versions) and some implementations require that the - * pointer arguments to memset(), memcpy(), and memmove() be valid values - * even when byte size is 0 (even a NULL pointer is considered invalid in - * this context). Zero-size operations as such are allowed, as long as their - * pointer arguments point to a valid memory area. The DUK_MEMSET(), - * DUK_MEMCPY(), and DUK_MEMMOVE() macros require this same behavior, i.e.: - * (1) pointers must be valid and non-NULL, (2) zero size must otherwise be - * allowed. If these are not fulfilled, a macro wrapper is needed. - * - * http://stackoverflow.com/questions/5243012/is-it-guaranteed-to-be-safe-to-perform-memcpy0-0-0 - * http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-October/011065.html - * - * Not sure what's the required behavior when a pointer points just past the - * end of a buffer, which often happens in practice (e.g. zero size memmoves). - * For example, if allocation size is 3, the following pointer would not - * technically point to a valid memory byte: - * - * <-- alloc --> - * | 0 | 1 | 2 | ..... - * ^-- p=3, points after last valid byte (2) - */ -#if !defined(DUK_MEMCPY) -#if defined(DUK_F_UCLIBC) -/* Old uclibcs have a broken memcpy so use memmove instead (this is overly wide - * now on purpose): http://lists.uclibc.org/pipermail/uclibc-cvs/2008-October/025511.html - */ -#define DUK_MEMCPY memmove -#else -#define DUK_MEMCPY memcpy -#endif -#endif -#if !defined(DUK_MEMMOVE) -#define DUK_MEMMOVE memmove -#endif -#if !defined(DUK_MEMCMP) -#define DUK_MEMCMP memcmp -#endif -#if !defined(DUK_MEMSET) -#define DUK_MEMSET memset -#endif -#if !defined(DUK_STRLEN) -#define DUK_STRLEN strlen -#endif -#if !defined(DUK_STRCMP) -#define DUK_STRCMP strcmp -#endif -#if !defined(DUK_STRNCMP) -#define DUK_STRNCMP strncmp -#endif -#if !defined(DUK_SPRINTF) -#define DUK_SPRINTF sprintf -#endif -#if !defined(DUK_SNPRINTF) -/* snprintf() is technically not part of C89 but usually available. */ -#define DUK_SNPRINTF snprintf -#endif -#if !defined(DUK_VSPRINTF) -#define DUK_VSPRINTF vsprintf -#endif -#if !defined(DUK_VSNPRINTF) -/* vsnprintf() is technically not part of C89 but usually available. */ -#define DUK_VSNPRINTF vsnprintf -#endif -#if !defined(DUK_SSCANF) -#define DUK_SSCANF sscanf -#endif -#if !defined(DUK_VSSCANF) -#define DUK_VSSCANF vsscanf -#endif -#if !defined(DUK_MEMZERO) -#define DUK_MEMZERO(p,n) DUK_MEMSET((p), 0, (n)) -#endif - -#if !defined(DUK_DOUBLE_INFINITY) -#undef DUK_USE_COMPUTED_INFINITY -#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION < 40600) -/* GCC older than 4.6: avoid overflow warnings related to using INFINITY */ -#define DUK_DOUBLE_INFINITY (__builtin_inf()) -#elif defined(INFINITY) -#define DUK_DOUBLE_INFINITY ((double) INFINITY) -#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \ - !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX) -#define DUK_DOUBLE_INFINITY (1.0 / 0.0) -#else -/* In VBCC (1.0 / 0.0) results in a warning and 0.0 instead of infinity. - * Use a computed infinity (initialized when a heap is created at the - * latest). - */ -#define DUK_USE_COMPUTED_INFINITY -#define DUK_DOUBLE_INFINITY duk_computed_infinity -#endif -#endif - -#if !defined(DUK_DOUBLE_NAN) -#undef DUK_USE_COMPUTED_NAN -#if defined(NAN) -#define DUK_DOUBLE_NAN NAN -#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \ - !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX) -#define DUK_DOUBLE_NAN (0.0 / 0.0) -#else -/* In VBCC (0.0 / 0.0) results in a warning and 0.0 instead of NaN. - * In MSVC (VS2010 Express) (0.0 / 0.0) results in a compile error. - * Use a computed NaN (initialized when a heap is created at the - * latest). - */ -#define DUK_USE_COMPUTED_NAN -#define DUK_DOUBLE_NAN duk_computed_nan -#endif -#endif - -/* Many platforms are missing fpclassify() and friends, so use replacements - * if necessary. The replacement constants (FP_NAN etc) can be anything but - * match Linux constants now. - */ -#undef DUK_USE_REPL_FPCLASSIFY -#undef DUK_USE_REPL_SIGNBIT -#undef DUK_USE_REPL_ISFINITE -#undef DUK_USE_REPL_ISNAN -#undef DUK_USE_REPL_ISINF - -/* Complex condition broken into separate parts. */ -#undef DUK_F_USE_REPL_ALL -#if !(defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) && \ - defined(FP_SUBNORMAL) && defined(FP_NORMAL)) -/* Missing some obvious constants. */ -#define DUK_F_USE_REPL_ALL -#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC) -/* VBCC is missing the built-ins even in C99 mode (perhaps a header issue). */ -#define DUK_F_USE_REPL_ALL -#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_M68K) -/* AmigaOS + M68K seems to have math issues even when using GCC cross - * compilation. Use replacements for all AmigaOS versions on M68K - * regardless of compiler. - */ -#define DUK_F_USE_REPL_ALL -#elif defined(DUK_F_FREEBSD) && defined(DUK_F_CLANG) -/* Placeholder fix for (detection is wider than necessary): - * http://llvm.org/bugs/show_bug.cgi?id=17788 - */ -#define DUK_F_USE_REPL_ALL -#elif defined(DUK_F_UCLIBC) -/* At least some uclibc versions have broken floating point math. For - * example, fpclassify() can incorrectly classify certain NaN formats. - * To be safe, use replacements. - */ -#define DUK_F_USE_REPL_ALL -#elif defined(DUK_F_AIX) -/* Older versions may be missing isnan(), etc. */ -#define DUK_F_USE_REPL_ALL -#endif - -#if defined(DUK_F_USE_REPL_ALL) -#define DUK_USE_REPL_FPCLASSIFY -#define DUK_USE_REPL_SIGNBIT -#define DUK_USE_REPL_ISFINITE -#define DUK_USE_REPL_ISNAN -#define DUK_USE_REPL_ISINF -#define DUK_FPCLASSIFY duk_repl_fpclassify -#define DUK_SIGNBIT duk_repl_signbit -#define DUK_ISFINITE duk_repl_isfinite -#define DUK_ISNAN duk_repl_isnan -#define DUK_ISINF duk_repl_isinf -#define DUK_FP_NAN 0 -#define DUK_FP_INFINITE 1 -#define DUK_FP_ZERO 2 -#define DUK_FP_SUBNORMAL 3 -#define DUK_FP_NORMAL 4 -#else -#define DUK_FPCLASSIFY fpclassify -#define DUK_SIGNBIT signbit -#define DUK_ISFINITE isfinite -#define DUK_ISNAN isnan -#define DUK_ISINF isinf -#define DUK_FP_NAN FP_NAN -#define DUK_FP_INFINITE FP_INFINITE -#define DUK_FP_ZERO FP_ZERO -#define DUK_FP_SUBNORMAL FP_SUBNORMAL -#define DUK_FP_NORMAL FP_NORMAL -#endif - -#if defined(DUK_F_USE_REPL_ALL) -#undef DUK_F_USE_REPL_ALL -#endif - -/* These functions don't currently need replacement but are wrapped for - * completeness. Because these are used as function pointers, they need - * to be defined as concrete C functions (not macros). - */ -#if !defined(DUK_FABS) -#define DUK_FABS fabs -#endif -#if !defined(DUK_FLOOR) -#define DUK_FLOOR floor -#endif -#if !defined(DUK_CEIL) -#define DUK_CEIL ceil -#endif -#if !defined(DUK_FMOD) -#define DUK_FMOD fmod -#endif -#if !defined(DUK_POW) -#define DUK_POW pow -#endif -#if !defined(DUK_ACOS) -#define DUK_ACOS acos -#endif -#if !defined(DUK_ASIN) -#define DUK_ASIN asin -#endif -#if !defined(DUK_ATAN) -#define DUK_ATAN atan -#endif -#if !defined(DUK_ATAN2) -#define DUK_ATAN2 atan2 -#endif -#if !defined(DUK_SIN) -#define DUK_SIN sin -#endif -#if !defined(DUK_COS) -#define DUK_COS cos -#endif -#if !defined(DUK_TAN) -#define DUK_TAN tan -#endif -#if !defined(DUK_EXP) -#define DUK_EXP exp -#endif -#if !defined(DUK_LOG) -#define DUK_LOG log -#endif -#if !defined(DUK_SQRT) -#define DUK_SQRT sqrt -#endif - -/* The functions below exist only in C99/C++11 or later and need a workaround - * for platforms that don't include them. MSVC isn't detected as C99, but - * these functions also exist in MSVC 2013 and later so include a clause for - * that too. Android doesn't have log2; disable all of these for Android. - */ -#if (defined(DUK_F_C99) || defined(DUK_F_CPP11) || (defined(_MSC_VER) && (_MSC_VER >= 1800))) && \ - !defined(DUK_F_ANDROID) && !defined(DUK_F_MINT) -#if !defined(DUK_CBRT) -#define DUK_CBRT cbrt -#endif -#if !defined(DUK_LOG2) -#define DUK_LOG2 log2 -#endif -#if !defined(DUK_LOG10) -#define DUK_LOG10 log10 -#endif -#if !defined(DUK_TRUNC) -#define DUK_TRUNC trunc -#endif -#endif /* DUK_F_C99 etc */ - -/* NetBSD 6.0 x86 (at least) has a few problems with pow() semantics, - * see test-bug-netbsd-math-pow.js. MinGW has similar (but different) - * issues, see test-bug-mingw-math-issues.js. Enable pow() workarounds - * for these targets. - */ -#undef DUK_USE_POW_WORKAROUNDS -#if defined(DUK_F_NETBSD) || defined(DUK_F_MINGW) -#define DUK_USE_POW_WORKAROUNDS -#endif - -/* Similar workarounds for atan2() semantics issues. MinGW issues are - * documented in test-bug-mingw-math-issues.js. - */ -#undef DUK_USE_ATAN2_WORKAROUNDS -#if defined(DUK_F_MINGW) -#define DUK_USE_ATAN2_WORKAROUNDS -#endif - -/* Rely as little as possible on compiler behavior for NaN comparison, - * signed zero handling, etc. Currently never activated but may be needed - * for broken compilers. - */ -#undef DUK_USE_PARANOID_MATH - -/* There was a curious bug where test-bi-date-canceling.js would fail e.g. - * on 64-bit Ubuntu, gcc-4.8.1, -m32, and no -std=c99. Some date computations - * using doubles would be optimized which then broke some corner case tests. - * The problem goes away by adding 'volatile' to the datetime computations. - * Not sure what the actual triggering conditions are, but using this on - * non-C99 systems solves the known issues and has relatively little cost - * on other platforms. - */ -#undef DUK_USE_PARANOID_DATE_COMPUTATION -#if !defined(DUK_F_C99) -#define DUK_USE_PARANOID_DATE_COMPUTATION -#endif - -/* - * Byte order and double memory layout detection - * - * Endianness detection is a major portability hassle because the macros - * and headers are not standardized. There's even variance across UNIX - * platforms. Even with "standard" headers, details like underscore count - * varies between platforms, e.g. both __BYTE_ORDER and _BYTE_ORDER are used - * (Crossbridge has a single underscore, for instance). - * - * The checks below are structured with this in mind: several approaches are - * used, and at the end we check if any of them worked. This allows generic - * approaches to be tried first, and platform/compiler specific hacks tried - * last. As a last resort, the user can force a specific endianness, as it's - * not likely that automatic detection will work on the most exotic platforms. - * - * Duktape supports little and big endian machines. There's also support - * for a hybrid used by some ARM machines where integers are little endian - * but IEEE double values use a mixed order (12345678 -> 43218765). This - * byte order for doubles is referred to as "mixed endian". - */ - -/* GCC and Clang provide endianness defines as built-in predefines, with - * leading and trailing double underscores (e.g. __BYTE_ORDER__). See - * output of "make gccpredefs" and "make clangpredefs". Clang doesn't - * seem to provide __FLOAT_WORD_ORDER__; assume not mixed endian for clang. - * http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html - */ -#if !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) -#if defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#define DUK_USE_BYTEORDER 1 -#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) -#define DUK_USE_BYTEORDER 2 -#elif !defined(__FLOAT_WORD_ORDER__) -/* Float word order not known, assume not a hybrid. */ -#define DUK_USE_BYTEORDER 1 -#else -/* Byte order is little endian but cannot determine IEEE double word order. */ -#endif /* float word order */ -#elif defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) -#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) -#define DUK_USE_BYTEORDER 3 -#elif !defined(__FLOAT_WORD_ORDER__) -/* Float word order not known, assume not a hybrid. */ -#define DUK_USE_BYTEORDER 3 -#else -/* Byte order is big endian but cannot determine IEEE double word order. */ -#endif /* float word order */ -#else -/* Cannot determine byte order; __ORDER_PDP_ENDIAN__ is related to 32-bit - * integer ordering and is not relevant. - */ -#endif /* integer byte order */ -#endif /* !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) */ - -/* More or less standard endianness predefines provided by header files. - * The ARM hybrid case is detected by assuming that __FLOAT_WORD_ORDER - * will be big endian, see: http://lists.mysql.com/internals/443. - * On some platforms some defines may be present with an empty value which - * causes comparisons to fail: https://github.com/svaarala/duktape/issues/453. - */ -#if !defined(DUK_USE_BYTEORDER) -#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) || \ - defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN) || \ - defined(__LITTLE_ENDIAN__) -#if defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) || \ - defined(_FLOAT_WORD_ORDER) && defined(_LITTLE_ENDIAN) && (_FLOAT_WORD_ORDER == _LITTLE_ENDIAN) -#define DUK_USE_BYTEORDER 1 -#elif defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \ - defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN) -#define DUK_USE_BYTEORDER 2 -#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER) -/* Float word order not known, assume not a hybrid. */ -#define DUK_USE_BYTEORDER 1 -#else -/* Byte order is little endian but cannot determine IEEE double word order. */ -#endif /* float word order */ -#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) || \ - defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN) || \ - defined(__BIG_ENDIAN__) -#if defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \ - defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN) -#define DUK_USE_BYTEORDER 3 -#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER) -/* Float word order not known, assume not a hybrid. */ -#define DUK_USE_BYTEORDER 3 -#else -/* Byte order is big endian but cannot determine IEEE double word order. */ -#endif /* float word order */ -#else -/* Cannot determine byte order. */ -#endif /* integer byte order */ -#endif /* !defined(DUK_USE_BYTEORDER) */ - -/* QNX gcc cross compiler seems to define e.g. __LITTLEENDIAN__ or __BIGENDIAN__: - * $ /opt/qnx650/host/linux/x86/usr/bin/i486-pc-nto-qnx6.5.0-gcc -dM -E - > 24) | \ - ((((duk_uint32_t) (x)) >> 8) & 0xff00UL) | \ - ((((duk_uint32_t) (x)) << 8) & 0xff0000UL) | \ - (((duk_uint32_t) (x)) << 24)) -#endif -#if !defined(DUK_BSWAP16) -#define DUK_BSWAP16(x) \ - ((duk_uint16_t) (x) >> 8) | \ - ((duk_uint16_t) (x) << 8) -#endif - -/* DUK_USE_VARIADIC_MACROS: required from compilers, so no fill-in. */ -/* DUK_USE_UNION_INITIALIZERS: required from compilers, so no fill-in. */ - -#if !(defined(DUK_USE_FLEX_C99) || defined(DUK_USE_FLEX_ZEROSIZE) || defined(DUK_USE_FLEX_ONESIZE)) -#if defined(DUK_F_C99) -#define DUK_USE_FLEX_C99 -#else -#define DUK_USE_FLEX_ZEROSIZE /* Not standard but common enough */ -#endif -#endif - -#if !(defined(DUK_USE_PACK_GCC_ATTR) || defined(DUK_USE_PACK_CLANG_ATTR) || \ - defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_DUMMY_MEMBER)) -#define DUK_USE_PACK_DUMMY_MEMBER -#endif - -#if 0 /* not defined by default */ -#undef DUK_USE_GCC_PRAGMAS -#endif - -#if !defined(DUK_U64_CONSTANT) -#define DUK_U64_CONSTANT(x) x##ULL -#endif -#if !defined(DUK_I64_CONSTANT) -#define DUK_I64_CONSTANT(x) x##LL -#endif - -/* Workaround for GH-323: avoid inlining control when compiling from - * multiple sources, as it causes compiler portability trouble. - */ -#if !defined(DUK_SINGLE_FILE) -#undef DUK_NOINLINE -#undef DUK_INLINE -#undef DUK_ALWAYS_INLINE -#define DUK_NOINLINE /*nop*/ -#define DUK_INLINE /*nop*/ -#define DUK_ALWAYS_INLINE /*nop*/ -#endif - -/* - * Check whether or not a packed duk_tval representation is possible. - * What's basically required is that pointers are 32-bit values - * (sizeof(void *) == 4). Best effort check, not always accurate. - * If guess goes wrong, crashes may result; self tests also verify - * the guess. - */ - -/* Explicit marker needed; may be 'defined', 'undefined, 'or 'not provided'. */ -#if !defined(DUK_F_PACKED_TVAL_PROVIDED) -#undef DUK_F_PACKED_TVAL_POSSIBLE - -/* Strict C99 case: DUK_UINTPTR_MAX (= UINTPTR_MAX) should be very reliable */ -#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) -#if (DUK_UINTPTR_MAX <= 0xffffffffUL) -#define DUK_F_PACKED_TVAL_POSSIBLE -#endif -#endif - -/* Non-C99 case, still relying on DUK_UINTPTR_MAX, as long as it is not a computed value */ -#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) && !defined(DUK_UINTPTR_MAX_COMPUTED) -#if (DUK_UINTPTR_MAX <= 0xffffffffUL) -#define DUK_F_PACKED_TVAL_POSSIBLE -#endif -#endif - -/* DUK_SIZE_MAX (= SIZE_MAX) is often reliable */ -#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_SIZE_MAX) && !defined(DUK_SIZE_MAX_COMPUTED) -#if (DUK_SIZE_MAX <= 0xffffffffUL) -#define DUK_F_PACKED_TVAL_POSSIBLE -#endif -#endif - -#undef DUK_USE_PACKED_TVAL -#if defined(DUK_F_PACKED_TVAL_POSSIBLE) -#define DUK_USE_PACKED_TVAL -#endif - -#undef DUK_F_PACKED_TVAL_POSSIBLE -#endif /* DUK_F_PACKED_TVAL_PROVIDED */ -/* Object property allocation layout has implications for memory and code - * footprint and generated code size/speed. The best layout also depends - * on whether the platform has alignment requirements or benefits from - * having mostly aligned accesses. - */ -#undef DUK_USE_HOBJECT_LAYOUT_1 -#undef DUK_USE_HOBJECT_LAYOUT_2 -#undef DUK_USE_HOBJECT_LAYOUT_3 -#if (DUK_USE_ALIGN_BY == 1) -/* On platforms without any alignment issues, layout 1 is preferable - * because it compiles to slightly less code and provides direct access - * to property keys. - */ -#define DUK_USE_HOBJECT_LAYOUT_1 -#else -/* On other platforms use layout 2, which requires some padding but - * is a bit more natural than layout 3 in ordering the entries. Layout - * 3 is currently not used. - */ -#define DUK_USE_HOBJECT_LAYOUT_2 -#endif - -/* GCC/clang inaccurate math would break compliance and probably duk_tval, - * so refuse to compile. Relax this if -ffast-math is tested to work. - */ -#if defined(__FAST_MATH__) -#error __FAST_MATH__ defined, refusing to compile -#endif - -/* - * Autogenerated defaults - */ - -#define DUK_USE_ARRAY_BUILTIN -#define DUK_USE_ARRAY_FASTPATH -#define DUK_USE_ARRAY_PROP_FASTPATH -#undef DUK_USE_ASSERTIONS -#define DUK_USE_AUGMENT_ERROR_CREATE -#define DUK_USE_AUGMENT_ERROR_THROW -#define DUK_USE_AVOID_PLATFORM_FUNCPTRS -#define DUK_USE_BASE64_FASTPATH -#define DUK_USE_BOOLEAN_BUILTIN -#define DUK_USE_BUFFEROBJECT_SUPPORT -#undef DUK_USE_BUFLEN16 -#define DUK_USE_BYTECODE_DUMP_SUPPORT -#define DUK_USE_CACHE_ACTIVATION -#define DUK_USE_CACHE_CATCHER -#define DUK_USE_CALLSTACK_LIMIT 10000 -#define DUK_USE_COMMONJS_MODULES -#define DUK_USE_COMPILER_RECLIMIT 2500 -#define DUK_USE_COROUTINE_SUPPORT -#undef DUK_USE_CPP_EXCEPTIONS -#undef DUK_USE_DATAPTR16 -#undef DUK_USE_DATAPTR_DEC16 -#undef DUK_USE_DATAPTR_ENC16 -#define DUK_USE_DATE_BUILTIN -#undef DUK_USE_DATE_FORMAT_STRING -#undef DUK_USE_DATE_GET_LOCAL_TZOFFSET -#undef DUK_USE_DATE_GET_NOW -#undef DUK_USE_DATE_PARSE_STRING -#undef DUK_USE_DATE_PRS_GETDATE -#undef DUK_USE_DEBUG -#undef DUK_USE_DEBUGGER_DUMPHEAP -#undef DUK_USE_DEBUGGER_INSPECT -#undef DUK_USE_DEBUGGER_PAUSE_UNCAUGHT -#undef DUK_USE_DEBUGGER_SUPPORT -#define DUK_USE_DEBUGGER_THROW_NOTIFY -#undef DUK_USE_DEBUGGER_TRANSPORT_TORTURE -#define DUK_USE_DEBUG_BUFSIZE 65536L -#define DUK_USE_DEBUG_LEVEL 0 -#undef DUK_USE_DEBUG_WRITE -#define DUK_USE_DOUBLE_LINKED_HEAP -#define DUK_USE_DUKTAPE_BUILTIN -#define DUK_USE_ENCODING_BUILTINS -#define DUK_USE_ERRCREATE -#define DUK_USE_ERRTHROW -#define DUK_USE_ES6 -#define DUK_USE_ES6_OBJECT_PROTO_PROPERTY -#define DUK_USE_ES6_OBJECT_SETPROTOTYPEOF -#define DUK_USE_ES6_PROXY -#define DUK_USE_ES6_REGEXP_SYNTAX -#define DUK_USE_ES6_UNICODE_ESCAPE -#define DUK_USE_ES7 -#define DUK_USE_ES7_EXP_OPERATOR -#define DUK_USE_ES8 -#define DUK_USE_ES9 -#define DUK_USE_ESBC_LIMITS -#define DUK_USE_ESBC_MAX_BYTES 2147418112L -#define DUK_USE_ESBC_MAX_LINENUMBER 2147418112L -#undef DUK_USE_EXEC_FUN_LOCAL -#undef DUK_USE_EXEC_INDIRECT_BOUND_CHECK -#undef DUK_USE_EXEC_PREFER_SIZE -#define DUK_USE_EXEC_REGCONST_OPTIMIZE -#undef DUK_USE_EXEC_TIMEOUT_CHECK -#undef DUK_USE_EXPLICIT_NULL_INIT -#undef DUK_USE_EXTSTR_FREE -#undef DUK_USE_EXTSTR_INTERN_CHECK -#undef DUK_USE_FASTINT -#define DUK_USE_FAST_REFCOUNT_DEFAULT -#undef DUK_USE_FATAL_HANDLER -#define DUK_USE_FATAL_MAXLEN 128 -#define DUK_USE_FINALIZER_SUPPORT -#undef DUK_USE_FINALIZER_TORTURE -#undef DUK_USE_FUNCPTR16 -#undef DUK_USE_FUNCPTR_DEC16 -#undef DUK_USE_FUNCPTR_ENC16 -#define DUK_USE_FUNCTION_BUILTIN -#define DUK_USE_FUNC_FILENAME_PROPERTY -#define DUK_USE_FUNC_NAME_PROPERTY -#undef DUK_USE_GC_TORTURE -#undef DUK_USE_GET_MONOTONIC_TIME -#undef DUK_USE_GET_RANDOM_DOUBLE -#undef DUK_USE_GLOBAL_BINDING -#define DUK_USE_GLOBAL_BUILTIN -#undef DUK_USE_HEAPPTR16 -#undef DUK_USE_HEAPPTR_DEC16 -#undef DUK_USE_HEAPPTR_ENC16 -#define DUK_USE_HEX_FASTPATH -#define DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT 2 -#define DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT 9 -#define DUK_USE_HOBJECT_ARRAY_MINGROW_ADD 16 -#define DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR 8 -#define DUK_USE_HOBJECT_ENTRY_MINGROW_ADD 16 -#define DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR 8 -#define DUK_USE_HOBJECT_HASH_PART -#define DUK_USE_HOBJECT_HASH_PROP_LIMIT 8 -#define DUK_USE_HSTRING_ARRIDX -#define DUK_USE_HSTRING_CLEN -#undef DUK_USE_HSTRING_EXTDATA -#define DUK_USE_HSTRING_LAZY_CLEN -#define DUK_USE_HTML_COMMENTS -#define DUK_USE_IDCHAR_FASTPATH -#undef DUK_USE_INJECT_HEAP_ALLOC_ERROR -#undef DUK_USE_INTERRUPT_COUNTER -#undef DUK_USE_INTERRUPT_DEBUG_FIXUP -#define DUK_USE_JC -#define DUK_USE_JSON_BUILTIN -#define DUK_USE_JSON_DECNUMBER_FASTPATH -#define DUK_USE_JSON_DECSTRING_FASTPATH -#define DUK_USE_JSON_DEC_RECLIMIT 1000 -#define DUK_USE_JSON_EATWHITE_FASTPATH -#define DUK_USE_JSON_ENC_RECLIMIT 1000 -#define DUK_USE_JSON_QUOTESTRING_FASTPATH -#undef DUK_USE_JSON_STRINGIFY_FASTPATH -#define DUK_USE_JSON_SUPPORT -#define DUK_USE_JX -#define DUK_USE_LEXER_SLIDING_WINDOW -#undef DUK_USE_LIGHTFUNC_BUILTINS -#define DUK_USE_MARK_AND_SWEEP_RECLIMIT 256 -#define DUK_USE_MATH_BUILTIN -#define DUK_USE_NATIVE_CALL_RECLIMIT 1000 -#define DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER -#define DUK_USE_NONSTD_ARRAY_MAP_TRAILER -#define DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT -#undef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY -#undef DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY -#define DUK_USE_NONSTD_FUNC_STMT -#define DUK_USE_NONSTD_GETTER_KEY_ARGUMENT -#define DUK_USE_NONSTD_JSON_ESC_U2028_U2029 -#define DUK_USE_NONSTD_SETTER_KEY_ARGUMENT -#define DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT -#define DUK_USE_NUMBER_BUILTIN -#define DUK_USE_OBJECT_BUILTIN -#undef DUK_USE_OBJSIZES16 -#undef DUK_USE_PARANOID_ERRORS -#define DUK_USE_PC2LINE -#define DUK_USE_PERFORMANCE_BUILTIN -#undef DUK_USE_PREFER_SIZE -#undef DUK_USE_PROMISE_BUILTIN -#define DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS -#undef DUK_USE_REFCOUNT16 -#define DUK_USE_REFCOUNT32 -#define DUK_USE_REFERENCE_COUNTING -#define DUK_USE_REFLECT_BUILTIN -#define DUK_USE_REGEXP_CANON_BITMAP -#undef DUK_USE_REGEXP_CANON_WORKAROUND -#define DUK_USE_REGEXP_COMPILER_RECLIMIT 10000 -#define DUK_USE_REGEXP_EXECUTOR_RECLIMIT 10000 -#define DUK_USE_REGEXP_SUPPORT -#undef DUK_USE_ROM_GLOBAL_CLONE -#undef DUK_USE_ROM_GLOBAL_INHERIT -#undef DUK_USE_ROM_OBJECTS -#define DUK_USE_ROM_PTRCOMP_FIRST 63488L -#undef DUK_USE_ROM_STRINGS -#define DUK_USE_SECTION_B -#undef DUK_USE_SELF_TESTS -#define DUK_USE_SHEBANG_COMMENTS -#undef DUK_USE_SHUFFLE_TORTURE -#define DUK_USE_SOURCE_NONBMP -#undef DUK_USE_STRHASH16 -#undef DUK_USE_STRHASH_DENSE -#define DUK_USE_STRHASH_SKIP_SHIFT 5 -#define DUK_USE_STRICT_DECL -#undef DUK_USE_STRICT_UTF8_SOURCE -#define DUK_USE_STRING_BUILTIN -#undef DUK_USE_STRLEN16 -#define DUK_USE_STRTAB_GROW_LIMIT 17 -#define DUK_USE_STRTAB_MAXSIZE 268435456L -#define DUK_USE_STRTAB_MINSIZE 1024 -#undef DUK_USE_STRTAB_PTRCOMP -#define DUK_USE_STRTAB_RESIZE_CHECK_MASK 255 -#define DUK_USE_STRTAB_SHRINK_LIMIT 6 -#undef DUK_USE_STRTAB_TORTURE -#undef DUK_USE_SYMBOL_BUILTIN -#define DUK_USE_TAILCALL -#define DUK_USE_TARGET_INFO "unknown" -#define DUK_USE_TRACEBACKS -#define DUK_USE_TRACEBACK_DEPTH 10 -#define DUK_USE_USER_DECLARE() /* no user declarations */ -#define DUK_USE_VALSTACK_GROW_SHIFT 2 -#define DUK_USE_VALSTACK_LIMIT 1000000L -#define DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT 2 -#define DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT 4 -#undef DUK_USE_VALSTACK_UNSAFE -#define DUK_USE_VERBOSE_ERRORS -#define DUK_USE_VERBOSE_EXECUTOR_ERRORS -#define DUK_USE_VOLUNTARY_GC -#define DUK_USE_ZERO_BUFFER_DATA - -/* - * You may add overriding #define/#undef directives below for - * customization. You of course cannot un-#include or un-typedef - * anything; these require direct changes above. - */ - -/* __OVERRIDE_DEFINES__ */ - -/* - * Date provider selection - * - * User may define DUK_USE_DATE_GET_NOW() etc directly, in which case we'll - * rely on an external provider. If this is not done, revert to previous - * behavior and use Unix/Windows built-in provider. - */ - -#if defined(DUK_COMPILING_DUKTAPE) - -#if defined(DUK_USE_DATE_GET_NOW) -/* External provider already defined. */ -#elif defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) -#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_gettimeofday() -#elif defined(DUK_USE_DATE_NOW_TIME) -#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_time() -#elif defined(DUK_USE_DATE_NOW_WINDOWS) -#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows() -#elif defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) -#define DUK_USE_DATE_GET_NOW(ctx) duk_bi_date_get_now_windows_subms() -#else -#error no provider for DUK_USE_DATE_GET_NOW() -#endif - -#if defined(DUK_USE_DATE_GET_LOCAL_TZOFFSET) -/* External provider already defined. */ -#elif defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME) -#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_gmtime((d)) -#elif defined(DUK_USE_DATE_TZO_WINDOWS) -#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows((d)) -#elif defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) -#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) duk_bi_date_get_local_tzoffset_windows_no_dst((d)) -#else -#error no provider for DUK_USE_DATE_GET_LOCAL_TZOFFSET() -#endif - -#if defined(DUK_USE_DATE_PARSE_STRING) -/* External provider already defined. */ -#elif defined(DUK_USE_DATE_PRS_STRPTIME) -#define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_strptime((ctx), (str)) -#elif defined(DUK_USE_DATE_PRS_GETDATE) -#define DUK_USE_DATE_PARSE_STRING(ctx,str) duk_bi_date_parse_string_getdate((ctx), (str)) -#else -/* No provider for DUK_USE_DATE_PARSE_STRING(), fall back to ISO 8601 only. */ -#endif - -#if defined(DUK_USE_DATE_FORMAT_STRING) -/* External provider already defined. */ -#elif defined(DUK_USE_DATE_FMT_STRFTIME) -#define DUK_USE_DATE_FORMAT_STRING(ctx,parts,tzoffset,flags) \ - duk_bi_date_format_parts_strftime((ctx), (parts), (tzoffset), (flags)) -#else -/* No provider for DUK_USE_DATE_FORMAT_STRING(), fall back to ISO 8601 only. */ -#endif - -#if defined(DUK_USE_GET_MONOTONIC_TIME) -/* External provider already defined. */ -#elif defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) -#define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_clock_gettime() -#elif defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) -#define DUK_USE_GET_MONOTONIC_TIME(ctx) duk_bi_date_get_monotonic_time_windows_qpc() -#else -/* No provider for DUK_USE_GET_MONOTONIC_TIME(), fall back to DUK_USE_DATE_GET_NOW(). */ -#endif - -#endif /* DUK_COMPILING_DUKTAPE */ - -/* - * Checks for legacy feature options (DUK_OPT_xxx) - */ - -#if defined(DUK_OPT_ASSERTIONS) -#error unsupported legacy feature option DUK_OPT_ASSERTIONS used -#endif -#if defined(DUK_OPT_BUFFEROBJECT_SUPPORT) -#error unsupported legacy feature option DUK_OPT_BUFFEROBJECT_SUPPORT used -#endif -#if defined(DUK_OPT_BUFLEN16) -#error unsupported legacy feature option DUK_OPT_BUFLEN16 used -#endif -#if defined(DUK_OPT_DATAPTR16) -#error unsupported legacy feature option DUK_OPT_DATAPTR16 used -#endif -#if defined(DUK_OPT_DATAPTR_DEC16) -#error unsupported legacy feature option DUK_OPT_DATAPTR_DEC16 used -#endif -#if defined(DUK_OPT_DATAPTR_ENC16) -#error unsupported legacy feature option DUK_OPT_DATAPTR_ENC16 used -#endif -#if defined(DUK_OPT_DDDPRINT) -#error unsupported legacy feature option DUK_OPT_DDDPRINT used -#endif -#if defined(DUK_OPT_DDPRINT) -#error unsupported legacy feature option DUK_OPT_DDPRINT used -#endif -#if defined(DUK_OPT_DEBUG) -#error unsupported legacy feature option DUK_OPT_DEBUG used -#endif -#if defined(DUK_OPT_DEBUGGER_DUMPHEAP) -#error unsupported legacy feature option DUK_OPT_DEBUGGER_DUMPHEAP used -#endif -#if defined(DUK_OPT_DEBUGGER_FWD_LOGGING) -#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_LOGGING used -#endif -#if defined(DUK_OPT_DEBUGGER_FWD_PRINTALERT) -#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_PRINTALERT used -#endif -#if defined(DUK_OPT_DEBUGGER_SUPPORT) -#error unsupported legacy feature option DUK_OPT_DEBUGGER_SUPPORT used -#endif -#if defined(DUK_OPT_DEBUGGER_TRANSPORT_TORTURE) -#error unsupported legacy feature option DUK_OPT_DEBUGGER_TRANSPORT_TORTURE used -#endif -#if defined(DUK_OPT_DEBUG_BUFSIZE) -#error unsupported legacy feature option DUK_OPT_DEBUG_BUFSIZE used -#endif -#if defined(DUK_OPT_DECLARE) -#error unsupported legacy feature option DUK_OPT_DECLARE used -#endif -#if defined(DUK_OPT_DEEP_C_STACK) -#error unsupported legacy feature option DUK_OPT_DEEP_C_STACK used -#endif -#if defined(DUK_OPT_DLL_BUILD) -#error unsupported legacy feature option DUK_OPT_DLL_BUILD used -#endif -#if defined(DUK_OPT_DPRINT) -#error unsupported legacy feature option DUK_OPT_DPRINT used -#endif -#if defined(DUK_OPT_DPRINT_COLORS) -#error unsupported legacy feature option DUK_OPT_DPRINT_COLORS used -#endif -#if defined(DUK_OPT_DPRINT_RDTSC) -#error unsupported legacy feature option DUK_OPT_DPRINT_RDTSC used -#endif -#if defined(DUK_OPT_EXEC_TIMEOUT_CHECK) -#error unsupported legacy feature option DUK_OPT_EXEC_TIMEOUT_CHECK used -#endif -#if defined(DUK_OPT_EXTERNAL_STRINGS) -#error unsupported legacy feature option DUK_OPT_EXTERNAL_STRINGS used -#endif -#if defined(DUK_OPT_EXTSTR_FREE) -#error unsupported legacy feature option DUK_OPT_EXTSTR_FREE used -#endif -#if defined(DUK_OPT_EXTSTR_INTERN_CHECK) -#error unsupported legacy feature option DUK_OPT_EXTSTR_INTERN_CHECK used -#endif -#if defined(DUK_OPT_FASTINT) -#error unsupported legacy feature option DUK_OPT_FASTINT used -#endif -#if defined(DUK_OPT_FORCE_ALIGN) -#error unsupported legacy feature option DUK_OPT_FORCE_ALIGN used -#endif -#if defined(DUK_OPT_FORCE_BYTEORDER) -#error unsupported legacy feature option DUK_OPT_FORCE_BYTEORDER used -#endif -#if defined(DUK_OPT_FUNCPTR16) -#error unsupported legacy feature option DUK_OPT_FUNCPTR16 used -#endif -#if defined(DUK_OPT_FUNCPTR_DEC16) -#error unsupported legacy feature option DUK_OPT_FUNCPTR_DEC16 used -#endif -#if defined(DUK_OPT_FUNCPTR_ENC16) -#error unsupported legacy feature option DUK_OPT_FUNCPTR_ENC16 used -#endif -#if defined(DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY) -#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY used -#endif -#if defined(DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY) -#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY used -#endif -#if defined(DUK_OPT_GC_TORTURE) -#error unsupported legacy feature option DUK_OPT_GC_TORTURE used -#endif -#if defined(DUK_OPT_HAVE_CUSTOM_H) -#error unsupported legacy feature option DUK_OPT_HAVE_CUSTOM_H used -#endif -#if defined(DUK_OPT_HEAPPTR16) -#error unsupported legacy feature option DUK_OPT_HEAPPTR16 used -#endif -#if defined(DUK_OPT_HEAPPTR_DEC16) -#error unsupported legacy feature option DUK_OPT_HEAPPTR_DEC16 used -#endif -#if defined(DUK_OPT_HEAPPTR_ENC16) -#error unsupported legacy feature option DUK_OPT_HEAPPTR_ENC16 used -#endif -#if defined(DUK_OPT_INTERRUPT_COUNTER) -#error unsupported legacy feature option DUK_OPT_INTERRUPT_COUNTER used -#endif -#if defined(DUK_OPT_JSON_STRINGIFY_FASTPATH) -#error unsupported legacy feature option DUK_OPT_JSON_STRINGIFY_FASTPATH used -#endif -#if defined(DUK_OPT_LIGHTFUNC_BUILTINS) -#error unsupported legacy feature option DUK_OPT_LIGHTFUNC_BUILTINS used -#endif -#if defined(DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY) -#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY used -#endif -#if defined(DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY) -#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY used -#endif -#if defined(DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT) -#error unsupported legacy feature option DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT used -#endif -#if defined(DUK_OPT_NO_AUGMENT_ERRORS) -#error unsupported legacy feature option DUK_OPT_NO_AUGMENT_ERRORS used -#endif -#if defined(DUK_OPT_NO_BROWSER_LIKE) -#error unsupported legacy feature option DUK_OPT_NO_BROWSER_LIKE used -#endif -#if defined(DUK_OPT_NO_BUFFEROBJECT_SUPPORT) -#error unsupported legacy feature option DUK_OPT_NO_BUFFEROBJECT_SUPPORT used -#endif -#if defined(DUK_OPT_NO_BYTECODE_DUMP_SUPPORT) -#error unsupported legacy feature option DUK_OPT_NO_BYTECODE_DUMP_SUPPORT used -#endif -#if defined(DUK_OPT_NO_COMMONJS_MODULES) -#error unsupported legacy feature option DUK_OPT_NO_COMMONJS_MODULES used -#endif -#if defined(DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY) -#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY used -#endif -#if defined(DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF) -#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF used -#endif -#if defined(DUK_OPT_NO_ES6_PROXY) -#error unsupported legacy feature option DUK_OPT_NO_ES6_PROXY used -#endif -#if defined(DUK_OPT_NO_FILE_IO) -#error unsupported legacy feature option DUK_OPT_NO_FILE_IO used -#endif -#if defined(DUK_OPT_NO_FUNC_STMT) -#error unsupported legacy feature option DUK_OPT_NO_FUNC_STMT used -#endif -#if defined(DUK_OPT_NO_JC) -#error unsupported legacy feature option DUK_OPT_NO_JC used -#endif -#if defined(DUK_OPT_NO_JSONC) -#error unsupported legacy feature option DUK_OPT_NO_JSONC used -#endif -#if defined(DUK_OPT_NO_JSONX) -#error unsupported legacy feature option DUK_OPT_NO_JSONX used -#endif -#if defined(DUK_OPT_NO_JX) -#error unsupported legacy feature option DUK_OPT_NO_JX used -#endif -#if defined(DUK_OPT_NO_MARK_AND_SWEEP) -#error unsupported legacy feature option DUK_OPT_NO_MARK_AND_SWEEP used -#endif -#if defined(DUK_OPT_NO_MS_STRINGTABLE_RESIZE) -#error unsupported legacy feature option DUK_OPT_NO_MS_STRINGTABLE_RESIZE used -#endif -#if defined(DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT used -#endif -#if defined(DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER used -#endif -#if defined(DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER used -#endif -#if defined(DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT used -#endif -#if defined(DUK_OPT_NO_NONSTD_FUNC_STMT) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_FUNC_STMT used -#endif -#if defined(DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029 used -#endif -#if defined(DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT) -#error unsupported legacy feature option DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT used -#endif -#if defined(DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY) -#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY used -#endif -#if defined(DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF) -#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF used -#endif -#if defined(DUK_OPT_NO_OCTAL_SUPPORT) -#error unsupported legacy feature option DUK_OPT_NO_OCTAL_SUPPORT used -#endif -#if defined(DUK_OPT_NO_PACKED_TVAL) -#error unsupported legacy feature option DUK_OPT_NO_PACKED_TVAL used -#endif -#if defined(DUK_OPT_NO_PC2LINE) -#error unsupported legacy feature option DUK_OPT_NO_PC2LINE used -#endif -#if defined(DUK_OPT_NO_REFERENCE_COUNTING) -#error unsupported legacy feature option DUK_OPT_NO_REFERENCE_COUNTING used -#endif -#if defined(DUK_OPT_NO_REGEXP_SUPPORT) -#error unsupported legacy feature option DUK_OPT_NO_REGEXP_SUPPORT used -#endif -#if defined(DUK_OPT_NO_SECTION_B) -#error unsupported legacy feature option DUK_OPT_NO_SECTION_B used -#endif -#if defined(DUK_OPT_NO_SOURCE_NONBMP) -#error unsupported legacy feature option DUK_OPT_NO_SOURCE_NONBMP used -#endif -#if defined(DUK_OPT_NO_STRICT_DECL) -#error unsupported legacy feature option DUK_OPT_NO_STRICT_DECL used -#endif -#if defined(DUK_OPT_NO_TRACEBACKS) -#error unsupported legacy feature option DUK_OPT_NO_TRACEBACKS used -#endif -#if defined(DUK_OPT_NO_VERBOSE_ERRORS) -#error unsupported legacy feature option DUK_OPT_NO_VERBOSE_ERRORS used -#endif -#if defined(DUK_OPT_NO_VOLUNTARY_GC) -#error unsupported legacy feature option DUK_OPT_NO_VOLUNTARY_GC used -#endif -#if defined(DUK_OPT_NO_ZERO_BUFFER_DATA) -#error unsupported legacy feature option DUK_OPT_NO_ZERO_BUFFER_DATA used -#endif -#if defined(DUK_OPT_OBJSIZES16) -#error unsupported legacy feature option DUK_OPT_OBJSIZES16 used -#endif -#if defined(DUK_OPT_PANIC_HANDLER) -#error unsupported legacy feature option DUK_OPT_PANIC_HANDLER used -#endif -#if defined(DUK_OPT_REFCOUNT16) -#error unsupported legacy feature option DUK_OPT_REFCOUNT16 used -#endif -#if defined(DUK_OPT_SEGFAULT_ON_PANIC) -#error unsupported legacy feature option DUK_OPT_SEGFAULT_ON_PANIC used -#endif -#if defined(DUK_OPT_SELF_TESTS) -#error unsupported legacy feature option DUK_OPT_SELF_TESTS used -#endif -#if defined(DUK_OPT_SETJMP) -#error unsupported legacy feature option DUK_OPT_SETJMP used -#endif -#if defined(DUK_OPT_SHUFFLE_TORTURE) -#error unsupported legacy feature option DUK_OPT_SHUFFLE_TORTURE used -#endif -#if defined(DUK_OPT_SIGSETJMP) -#error unsupported legacy feature option DUK_OPT_SIGSETJMP used -#endif -#if defined(DUK_OPT_STRHASH16) -#error unsupported legacy feature option DUK_OPT_STRHASH16 used -#endif -#if defined(DUK_OPT_STRICT_UTF8_SOURCE) -#error unsupported legacy feature option DUK_OPT_STRICT_UTF8_SOURCE used -#endif -#if defined(DUK_OPT_STRLEN16) -#error unsupported legacy feature option DUK_OPT_STRLEN16 used -#endif -#if defined(DUK_OPT_STRTAB_CHAIN) -#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN used -#endif -#if defined(DUK_OPT_STRTAB_CHAIN_SIZE) -#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN_SIZE used -#endif -#if defined(DUK_OPT_TARGET_INFO) -#error unsupported legacy feature option DUK_OPT_TARGET_INFO used -#endif -#if defined(DUK_OPT_TRACEBACK_DEPTH) -#error unsupported legacy feature option DUK_OPT_TRACEBACK_DEPTH used -#endif -#if defined(DUK_OPT_UNDERSCORE_SETJMP) -#error unsupported legacy feature option DUK_OPT_UNDERSCORE_SETJMP used -#endif -#if defined(DUK_OPT_USER_INITJS) -#error unsupported legacy feature option DUK_OPT_USER_INITJS used -#endif - -/* - * Checks for config option consistency (DUK_USE_xxx) - */ - -#if defined(DUK_USE_32BIT_PTRS) -#error unsupported config option used (option has been removed): DUK_USE_32BIT_PTRS -#endif -#if defined(DUK_USE_ALIGN_4) -#error unsupported config option used (option has been removed): DUK_USE_ALIGN_4 -#endif -#if defined(DUK_USE_ALIGN_8) -#error unsupported config option used (option has been removed): DUK_USE_ALIGN_8 -#endif -#if defined(DUK_USE_BROWSER_LIKE) -#error unsupported config option used (option has been removed): DUK_USE_BROWSER_LIKE -#endif -#if defined(DUK_USE_BUILTIN_INITJS) -#error unsupported config option used (option has been removed): DUK_USE_BUILTIN_INITJS -#endif -#if defined(DUK_USE_BYTEORDER_FORCED) -#error unsupported config option used (option has been removed): DUK_USE_BYTEORDER_FORCED -#endif -#if defined(DUK_USE_DATAPTR_DEC16) && !defined(DUK_USE_DATAPTR16) -#error config option DUK_USE_DATAPTR_DEC16 requires option DUK_USE_DATAPTR16 (which is missing) -#endif -#if defined(DUK_USE_DATAPTR_ENC16) && !defined(DUK_USE_DATAPTR16) -#error config option DUK_USE_DATAPTR_ENC16 requires option DUK_USE_DATAPTR16 (which is missing) -#endif -#if defined(DUK_USE_DDDPRINT) -#error unsupported config option used (option has been removed): DUK_USE_DDDPRINT -#endif -#if defined(DUK_USE_DDPRINT) -#error unsupported config option used (option has been removed): DUK_USE_DDPRINT -#endif -#if defined(DUK_USE_DEBUGGER_FWD_LOGGING) -#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_LOGGING -#endif -#if defined(DUK_USE_DEBUGGER_FWD_PRINTALERT) -#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_PRINTALERT -#endif -#if defined(DUK_USE_DEBUGGER_SUPPORT) && !defined(DUK_USE_INTERRUPT_COUNTER) -#error config option DUK_USE_DEBUGGER_SUPPORT requires option DUK_USE_INTERRUPT_COUNTER (which is missing) -#endif -#if defined(DUK_USE_DEEP_C_STACK) -#error unsupported config option used (option has been removed): DUK_USE_DEEP_C_STACK -#endif -#if defined(DUK_USE_DOUBLE_BE) -#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_BE -#endif -#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_LE) -#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_LE (which is also defined) -#endif -#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_ME) -#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_ME (which is also defined) -#endif -#if defined(DUK_USE_DOUBLE_LE) -#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_LE -#endif -#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_BE) -#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_BE (which is also defined) -#endif -#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_ME) -#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_ME (which is also defined) -#endif -#if defined(DUK_USE_DOUBLE_ME) -#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_ME -#endif -#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_LE) -#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_LE (which is also defined) -#endif -#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_BE) -#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_BE (which is also defined) -#endif -#if defined(DUK_USE_DPRINT) -#error unsupported config option used (option has been removed): DUK_USE_DPRINT -#endif -#if defined(DUK_USE_DPRINT) && !defined(DUK_USE_DEBUG) -#error config option DUK_USE_DPRINT requires option DUK_USE_DEBUG (which is missing) -#endif -#if defined(DUK_USE_DPRINT_COLORS) -#error unsupported config option used (option has been removed): DUK_USE_DPRINT_COLORS -#endif -#if defined(DUK_USE_DPRINT_RDTSC) -#error unsupported config option used (option has been removed): DUK_USE_DPRINT_RDTSC -#endif -#if defined(DUK_USE_ES6_REGEXP_BRACES) -#error unsupported config option used (option has been removed): DUK_USE_ES6_REGEXP_BRACES -#endif -#if defined(DUK_USE_ESBC_MAX_BYTES) && !defined(DUK_USE_ESBC_LIMITS) -#error config option DUK_USE_ESBC_MAX_BYTES requires option DUK_USE_ESBC_LIMITS (which is missing) -#endif -#if defined(DUK_USE_ESBC_MAX_LINENUMBER) && !defined(DUK_USE_ESBC_LIMITS) -#error config option DUK_USE_ESBC_MAX_LINENUMBER requires option DUK_USE_ESBC_LIMITS (which is missing) -#endif -#if defined(DUK_USE_EXEC_TIMEOUT_CHECK) && !defined(DUK_USE_INTERRUPT_COUNTER) -#error config option DUK_USE_EXEC_TIMEOUT_CHECK requires option DUK_USE_INTERRUPT_COUNTER (which is missing) -#endif -#if defined(DUK_USE_EXTSTR_FREE) && !defined(DUK_USE_HSTRING_EXTDATA) -#error config option DUK_USE_EXTSTR_FREE requires option DUK_USE_HSTRING_EXTDATA (which is missing) -#endif -#if defined(DUK_USE_EXTSTR_INTERN_CHECK) && !defined(DUK_USE_HSTRING_EXTDATA) -#error config option DUK_USE_EXTSTR_INTERN_CHECK requires option DUK_USE_HSTRING_EXTDATA (which is missing) -#endif -#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_64BIT_OPS) -#error config option DUK_USE_FASTINT requires option DUK_USE_64BIT_OPS (which is missing) -#endif -#if defined(DUK_USE_FILE_IO) -#error unsupported config option used (option has been removed): DUK_USE_FILE_IO -#endif -#if defined(DUK_USE_FULL_TVAL) -#error unsupported config option used (option has been removed): DUK_USE_FULL_TVAL -#endif -#if defined(DUK_USE_FUNCPTR_DEC16) && !defined(DUK_USE_FUNCPTR16) -#error config option DUK_USE_FUNCPTR_DEC16 requires option DUK_USE_FUNCPTR16 (which is missing) -#endif -#if defined(DUK_USE_FUNCPTR_ENC16) && !defined(DUK_USE_FUNCPTR16) -#error config option DUK_USE_FUNCPTR_ENC16 requires option DUK_USE_FUNCPTR16 (which is missing) -#endif -#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS) -#error unsupported config option used (option has been removed): DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS -#endif -#if defined(DUK_USE_HEAPPTR16) && defined(DUK_USE_DEBUG) -#error config option DUK_USE_HEAPPTR16 conflicts with option DUK_USE_DEBUG (which is also defined) -#endif -#if defined(DUK_USE_HEAPPTR_DEC16) && !defined(DUK_USE_HEAPPTR16) -#error config option DUK_USE_HEAPPTR_DEC16 requires option DUK_USE_HEAPPTR16 (which is missing) -#endif -#if defined(DUK_USE_HEAPPTR_ENC16) && !defined(DUK_USE_HEAPPTR16) -#error config option DUK_USE_HEAPPTR_ENC16 requires option DUK_USE_HEAPPTR16 (which is missing) -#endif -#if defined(DUK_USE_INTEGER_BE) -#error unsupported config option used (option has been removed): DUK_USE_INTEGER_BE -#endif -#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_LE) -#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_LE (which is also defined) -#endif -#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_ME) -#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_ME (which is also defined) -#endif -#if defined(DUK_USE_INTEGER_LE) -#error unsupported config option used (option has been removed): DUK_USE_INTEGER_LE -#endif -#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_BE) -#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_BE (which is also defined) -#endif -#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_ME) -#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_ME (which is also defined) -#endif -#if defined(DUK_USE_INTEGER_ME) -#error unsupported config option used (option has been removed): DUK_USE_INTEGER_ME -#endif -#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_LE) -#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_LE (which is also defined) -#endif -#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_BE) -#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_BE (which is also defined) -#endif -#if defined(DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE) -#error unsupported config option used (option has been removed): DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE -#endif -#if defined(DUK_USE_MARK_AND_SWEEP) -#error unsupported config option used (option has been removed): DUK_USE_MARK_AND_SWEEP -#endif -#if defined(DUK_USE_MATH_FMAX) -#error unsupported config option used (option has been removed): DUK_USE_MATH_FMAX -#endif -#if defined(DUK_USE_MATH_FMIN) -#error unsupported config option used (option has been removed): DUK_USE_MATH_FMIN -#endif -#if defined(DUK_USE_MATH_ROUND) -#error unsupported config option used (option has been removed): DUK_USE_MATH_ROUND -#endif -#if defined(DUK_USE_MS_STRINGTABLE_RESIZE) -#error unsupported config option used (option has been removed): DUK_USE_MS_STRINGTABLE_RESIZE -#endif -#if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE) -#error unsupported config option used (option has been removed): DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE -#endif -#if defined(DUK_USE_NO_DOUBLE_ALIASING_SELFTEST) -#error unsupported config option used (option has been removed): DUK_USE_NO_DOUBLE_ALIASING_SELFTEST -#endif -#if defined(DUK_USE_OCTAL_SUPPORT) -#error unsupported config option used (option has been removed): DUK_USE_OCTAL_SUPPORT -#endif -#if defined(DUK_USE_PACKED_TVAL_POSSIBLE) -#error unsupported config option used (option has been removed): DUK_USE_PACKED_TVAL_POSSIBLE -#endif -#if defined(DUK_USE_PANIC_ABORT) -#error unsupported config option used (option has been removed): DUK_USE_PANIC_ABORT -#endif -#if defined(DUK_USE_PANIC_EXIT) -#error unsupported config option used (option has been removed): DUK_USE_PANIC_EXIT -#endif -#if defined(DUK_USE_PANIC_HANDLER) -#error unsupported config option used (option has been removed): DUK_USE_PANIC_HANDLER -#endif -#if defined(DUK_USE_PANIC_SEGFAULT) -#error unsupported config option used (option has been removed): DUK_USE_PANIC_SEGFAULT -#endif -#if defined(DUK_USE_POW_NETBSD_WORKAROUND) -#error unsupported config option used (option has been removed): DUK_USE_POW_NETBSD_WORKAROUND -#endif -#if defined(DUK_USE_RDTSC) -#error unsupported config option used (option has been removed): DUK_USE_RDTSC -#endif -#if defined(DUK_USE_REFZERO_FINALIZER_TORTURE) -#error unsupported config option used (option has been removed): DUK_USE_REFZERO_FINALIZER_TORTURE -#endif -#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_STRINGS) -#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_STRINGS (which is missing) -#endif -#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_OBJECTS) -#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_OBJECTS (which is missing) -#endif -#if defined(DUK_USE_ROM_GLOBAL_CLONE) && defined(DUK_USE_ROM_GLOBAL_INHERIT) -#error config option DUK_USE_ROM_GLOBAL_CLONE conflicts with option DUK_USE_ROM_GLOBAL_INHERIT (which is also defined) -#endif -#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_STRINGS) -#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_STRINGS (which is missing) -#endif -#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_OBJECTS) -#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_OBJECTS (which is missing) -#endif -#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && defined(DUK_USE_ROM_GLOBAL_CLONE) -#error config option DUK_USE_ROM_GLOBAL_INHERIT conflicts with option DUK_USE_ROM_GLOBAL_CLONE (which is also defined) -#endif -#if defined(DUK_USE_ROM_OBJECTS) && !defined(DUK_USE_ROM_STRINGS) -#error config option DUK_USE_ROM_OBJECTS requires option DUK_USE_ROM_STRINGS (which is missing) -#endif -#if defined(DUK_USE_ROM_STRINGS) && !defined(DUK_USE_ROM_OBJECTS) -#error config option DUK_USE_ROM_STRINGS requires option DUK_USE_ROM_OBJECTS (which is missing) -#endif -#if defined(DUK_USE_SETJMP) -#error unsupported config option used (option has been removed): DUK_USE_SETJMP -#endif -#if defined(DUK_USE_SIGSETJMP) -#error unsupported config option used (option has been removed): DUK_USE_SIGSETJMP -#endif -#if defined(DUK_USE_STRTAB_CHAIN) -#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN -#endif -#if defined(DUK_USE_STRTAB_CHAIN_SIZE) -#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN_SIZE -#endif -#if defined(DUK_USE_STRTAB_CHAIN_SIZE) && !defined(DUK_USE_STRTAB_CHAIN) -#error config option DUK_USE_STRTAB_CHAIN_SIZE requires option DUK_USE_STRTAB_CHAIN (which is missing) -#endif -#if defined(DUK_USE_STRTAB_PROBE) -#error unsupported config option used (option has been removed): DUK_USE_STRTAB_PROBE -#endif -#if defined(DUK_USE_STRTAB_PTRCOMP) && !defined(DUK_USE_HEAPPTR16) -#error config option DUK_USE_STRTAB_PTRCOMP requires option DUK_USE_HEAPPTR16 (which is missing) -#endif -#if defined(DUK_USE_TAILCALL) && defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) -#error config option DUK_USE_TAILCALL conflicts with option DUK_USE_NONSTD_FUNC_CALLER_PROPERTY (which is also defined) -#endif -#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) -#error unsupported config option used (option has been removed): DUK_USE_UNALIGNED_ACCESSES_POSSIBLE -#endif -#if defined(DUK_USE_UNDERSCORE_SETJMP) -#error unsupported config option used (option has been removed): DUK_USE_UNDERSCORE_SETJMP -#endif -#if defined(DUK_USE_USER_INITJS) -#error unsupported config option used (option has been removed): DUK_USE_USER_INITJS -#endif - -#if defined(DUK_USE_CPP_EXCEPTIONS) && !defined(__cplusplus) -#error DUK_USE_CPP_EXCEPTIONS enabled but not compiling with a C++ compiler -#endif - -/* - * Convert DUK_USE_BYTEORDER, from whatever source, into currently used - * internal defines. If detection failed, #error out. - */ - -#if defined(DUK_USE_BYTEORDER) -#if (DUK_USE_BYTEORDER == 1) -#define DUK_USE_INTEGER_LE -#define DUK_USE_DOUBLE_LE -#elif (DUK_USE_BYTEORDER == 2) -#define DUK_USE_INTEGER_LE /* integer endianness is little on purpose */ -#define DUK_USE_DOUBLE_ME -#elif (DUK_USE_BYTEORDER == 3) -#define DUK_USE_INTEGER_BE -#define DUK_USE_DOUBLE_BE -#else -#error unsupported: byte order invalid -#endif /* byte order */ -#else -#error unsupported: byte order detection failed -#endif /* defined(DUK_USE_BYTEORDER) */ - -#endif /* DUK_CONFIG_H_INCLUDED */ diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.c b/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.c deleted file mode 100644 index ba55550e..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.c +++ /dev/null @@ -1,95142 +0,0 @@ -/* - * Single source autogenerated distributable for Duktape 2.2.1. - * - * Git commit 25420e773c5fbc50d5b46bf487fc45717e35b94f (v2.2.1). - * Git branch v2.2-maintenance. - * - * See Duktape AUTHORS.rst and LICENSE.txt for copyright and - * licensing information. - */ - -/* LICENSE.txt */ -/* -* =============== -* Duktape license -* =============== -* -* (http://opensource.org/licenses/MIT) -* -* Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -*/ - -/* AUTHORS.rst */ -/* -* =============== -* Duktape authors -* =============== -* -* Copyright -* ========= -* -* Duktape copyrights are held by its authors. Each author has a copyright -* to their contribution, and agrees to irrevocably license the contribution -* under the Duktape ``LICENSE.txt``. -* -* Authors -* ======= -* -* Please include an e-mail address, a link to your GitHub profile, or something -* similar to allow your contribution to be identified accurately. -* -* The following people have contributed code, website contents, or Wiki contents, -* and agreed to irrevocably license their contributions under the Duktape -* ``LICENSE.txt`` (in order of appearance): -* -* * Sami Vaarala -* * Niki Dobrev -* * Andreas \u00d6man -* * L\u00e1szl\u00f3 Lang\u00f3 -* * Legimet -* * Karl Skomski -* * Bruce Pascoe -* * Ren\u00e9 Hollander -* * Julien Hamaide (https://github.com/crazyjul) -* * Sebastian G\u00f6tte (https://github.com/jaseg) -* * Tomasz Magulski (https://github.com/magul) -* * \D. Bohdan (https://github.com/dbohdan) -* * Ond\u0159ej Jirman (https://github.com/megous) -* * Sa\u00fal Ibarra Corretg\u00e9 -* * Jeremy HU -* * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) -* * Harold Brenes (https://github.com/harold-b) -* * Oliver Crow (https://github.com/ocrow) -* * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski) -* * Brett Vickers (https://github.com/beevik) -* * Dominik Okwieka (https://github.com/okitec) -* * Remko Tron\u00e7on (https://el-tramo.be) -* * Romero Malaquias (rbsm@ic.ufal.br) -* * Michael Drake -* * Steven Don (https://github.com/shdon) -* * Simon Stone (https://github.com/sstone1) -* * \J. McC. (https://github.com/jmhmccr) -* -* Other contributions -* =================== -* -* The following people have contributed something other than code (e.g. reported -* bugs, provided ideas, etc; roughly in order of appearance): -* -* * Greg Burns -* * Anthony Rabine -* * Carlos Costa -* * Aur\u00e9lien Bouilland -* * Preet Desai (Pris Matic) -* * judofyr (http://www.reddit.com/user/judofyr) -* * Jason Woofenden -* * Micha\u0142 Przyby\u015b -* * Anthony Howe -* * Conrad Pankoff -* * Jim Schimpf -* * Rajaran Gaunker (https://github.com/zimbabao) -* * Andreas \u00d6man -* * Doug Sanden -* * Josh Engebretson (https://github.com/JoshEngebretson) -* * Remo Eichenberger (https://github.com/remoe) -* * Mamod Mehyar (https://github.com/mamod) -* * David Demelier (https://github.com/markand) -* * Tim Caswell (https://github.com/creationix) -* * Mitchell Blank Jr (https://github.com/mitchblank) -* * https://github.com/yushli -* * Seo Sanghyeon (https://github.com/sanxiyn) -* * Han ChoongWoo (https://github.com/tunz) -* * Joshua Peek (https://github.com/josh) -* * Bruce E. Pascoe (https://github.com/fatcerberus) -* * https://github.com/Kelledin -* * https://github.com/sstruchtrup -* * Michael Drake (https://github.com/tlsa) -* * https://github.com/chris-y -* * Laurent Zubiaur (https://github.com/lzubiaur) -* * Neil Kolban (https://github.com/nkolban) -* -* If you are accidentally missing from this list, send me an e-mail -* (``sami.vaarala@iki.fi``) and I'll fix the omission. -*/ - -#line 1 "duk_replacements.c" -/* - * Replacements for missing platform functions. - * - * Unlike the originals, fpclassify() and signbit() replacements don't - * work on any floating point types, only doubles. The C typing here - * mimics the standard prototypes. - */ - -/* #include duk_internal.h */ -#line 1 "duk_internal.h" -/* - * Top-level include file to be used for all (internal) source files. - * - * Source files should not include individual header files, as they - * have not been designed to be individually included. - */ - -#if !defined(DUK_INTERNAL_H_INCLUDED) -#define DUK_INTERNAL_H_INCLUDED - -/* - * The 'duktape.h' header provides the public API, but also handles all - * compiler and platform specific feature detection, Duktape feature - * resolution, inclusion of system headers, etc. These have been merged - * because the public API is also dependent on e.g. detecting appropriate - * C types which is quite platform/compiler specific especially for a non-C99 - * build. The public API is also dependent on the resolved feature set. - * - * Some actions taken by the merged header (such as including system headers) - * are not appropriate for building a user application. The define - * DUK_COMPILING_DUKTAPE allows the merged header to skip/include some - * sections depending on what is being built. - */ - -#define DUK_COMPILING_DUKTAPE -#include "duktape.h" - -/* - * User declarations, e.g. prototypes for user functions used by Duktape - * macros. - */ - -DUK_USE_USER_DECLARE() - -/* - * Duktape includes (other than duk_features.h) - * - * The header files expect to be included in an order which satisfies header - * dependencies correctly (the headers themselves don't include any other - * includes). Forward declarations are used to break circular struct/typedef - * dependencies. - */ - -/* #include duk_dblunion.h */ -#line 1 "duk_dblunion.h" -/* - * Union to access IEEE double memory representation, indexes for double - * memory representation, and some macros for double manipulation. - * - * Also used by packed duk_tval. Use a union for bit manipulation to - * minimize aliasing issues in practice. The C99 standard does not - * guarantee that this should work, but it's a very widely supported - * practice for low level manipulation. - * - * IEEE double format summary: - * - * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff - * A B C D E F G H - * - * s sign bit - * eee... exponent field - * fff... fraction - * - * See http://en.wikipedia.org/wiki/Double_precision_floating-point_format. - * - * NaNs are represented as exponent 0x7ff and mantissa != 0. The NaN is a - * signaling NaN when the highest bit of the mantissa is zero, and a quiet - * NaN when the highest bit is set. - * - * At least three memory layouts are relevant here: - * - * A B C D E F G H Big endian (e.g. 68k) DUK_USE_DOUBLE_BE - * H G F E D C B A Little endian (e.g. x86) DUK_USE_DOUBLE_LE - * D C B A H G F E Mixed/cross endian (e.g. ARM) DUK_USE_DOUBLE_ME - * - * ARM is a special case: ARM double values are in mixed/cross endian - * format while ARM duk_uint64_t values are in standard little endian - * format (H G F E D C B A). When a double is read as a duk_uint64_t - * from memory, the register will contain the (logical) value - * E F G H A B C D. This requires some special handling below. - * - * Indexes of various types (8-bit, 16-bit, 32-bit) in memory relative to - * the logical (big endian) order: - * - * byte order duk_uint8_t duk_uint16_t duk_uint32_t - * BE 01234567 0123 01 - * LE 76543210 3210 10 - * ME (ARM) 32107654 1032 01 - * - * Some processors may alter NaN values in a floating point load+store. - * For instance, on X86 a FLD + FSTP may convert a signaling NaN to a - * quiet one. This is catastrophic when NaN space is used in packed - * duk_tval values. See: misc/clang_aliasing.c. - */ - -#if !defined(DUK_DBLUNION_H_INCLUDED) -#define DUK_DBLUNION_H_INCLUDED - -/* - * Union for accessing double parts, also serves as packed duk_tval - */ - -union duk_double_union { - double d; - float f[2]; -#if defined(DUK_USE_64BIT_OPS) - duk_uint64_t ull[1]; -#endif - duk_uint32_t ui[2]; - duk_uint16_t us[4]; - duk_uint8_t uc[8]; -#if defined(DUK_USE_PACKED_TVAL) - void *vp[2]; /* used by packed duk_tval, assumes sizeof(void *) == 4 */ -#endif -}; - -typedef union duk_double_union duk_double_union; - -/* - * Indexes of various types with respect to big endian (logical) layout - */ - -#if defined(DUK_USE_DOUBLE_LE) -#if defined(DUK_USE_64BIT_OPS) -#define DUK_DBL_IDX_ULL0 0 -#endif -#define DUK_DBL_IDX_UI0 1 -#define DUK_DBL_IDX_UI1 0 -#define DUK_DBL_IDX_US0 3 -#define DUK_DBL_IDX_US1 2 -#define DUK_DBL_IDX_US2 1 -#define DUK_DBL_IDX_US3 0 -#define DUK_DBL_IDX_UC0 7 -#define DUK_DBL_IDX_UC1 6 -#define DUK_DBL_IDX_UC2 5 -#define DUK_DBL_IDX_UC3 4 -#define DUK_DBL_IDX_UC4 3 -#define DUK_DBL_IDX_UC5 2 -#define DUK_DBL_IDX_UC6 1 -#define DUK_DBL_IDX_UC7 0 -#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ -#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ -#elif defined(DUK_USE_DOUBLE_BE) -#if defined(DUK_USE_64BIT_OPS) -#define DUK_DBL_IDX_ULL0 0 -#endif -#define DUK_DBL_IDX_UI0 0 -#define DUK_DBL_IDX_UI1 1 -#define DUK_DBL_IDX_US0 0 -#define DUK_DBL_IDX_US1 1 -#define DUK_DBL_IDX_US2 2 -#define DUK_DBL_IDX_US3 3 -#define DUK_DBL_IDX_UC0 0 -#define DUK_DBL_IDX_UC1 1 -#define DUK_DBL_IDX_UC2 2 -#define DUK_DBL_IDX_UC3 3 -#define DUK_DBL_IDX_UC4 4 -#define DUK_DBL_IDX_UC5 5 -#define DUK_DBL_IDX_UC6 6 -#define DUK_DBL_IDX_UC7 7 -#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ -#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ -#elif defined(DUK_USE_DOUBLE_ME) -#if defined(DUK_USE_64BIT_OPS) -#define DUK_DBL_IDX_ULL0 0 /* not directly applicable, byte order differs from a double */ -#endif -#define DUK_DBL_IDX_UI0 0 -#define DUK_DBL_IDX_UI1 1 -#define DUK_DBL_IDX_US0 1 -#define DUK_DBL_IDX_US1 0 -#define DUK_DBL_IDX_US2 3 -#define DUK_DBL_IDX_US3 2 -#define DUK_DBL_IDX_UC0 3 -#define DUK_DBL_IDX_UC1 2 -#define DUK_DBL_IDX_UC2 1 -#define DUK_DBL_IDX_UC3 0 -#define DUK_DBL_IDX_UC4 7 -#define DUK_DBL_IDX_UC5 6 -#define DUK_DBL_IDX_UC6 5 -#define DUK_DBL_IDX_UC7 4 -#define DUK_DBL_IDX_VP0 DUK_DBL_IDX_UI0 /* packed tval */ -#define DUK_DBL_IDX_VP1 DUK_DBL_IDX_UI1 /* packed tval */ -#else -#error internal error -#endif - -/* - * Helper macros for reading/writing memory representation parts, used - * by duk_numconv.c and duk_tval.h. - */ - -#define DUK_DBLUNION_SET_DOUBLE(u,v) do { \ - (u)->d = (v); \ - } while (0) - -#define DUK_DBLUNION_SET_HIGH32(u,v) do { \ - (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \ - } while (0) - -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) -#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ - (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \ - } while (0) -#else -#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ - (u)->ull[DUK_DBL_IDX_ULL0] = ((duk_uint64_t) (v)) << 32; \ - } while (0) -#endif -#else /* DUK_USE_64BIT_OPS */ -#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v) do { \ - (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \ - (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0; \ - } while (0) -#endif /* DUK_USE_64BIT_OPS */ - -#define DUK_DBLUNION_SET_LOW32(u,v) do { \ - (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \ - } while (0) - -#define DUK_DBLUNION_GET_DOUBLE(u) ((u)->d) -#define DUK_DBLUNION_GET_HIGH32(u) ((u)->ui[DUK_DBL_IDX_UI0]) -#define DUK_DBLUNION_GET_LOW32(u) ((u)->ui[DUK_DBL_IDX_UI1]) - -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) -#define DUK_DBLUNION_SET_UINT64(u,v) do { \ - (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \ - (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \ - } while (0) -#define DUK_DBLUNION_GET_UINT64(u) \ - ((((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI0]) << 32) | \ - ((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI1])) -#else -#define DUK_DBLUNION_SET_UINT64(u,v) do { \ - (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \ - } while (0) -#define DUK_DBLUNION_GET_UINT64(u) ((u)->ull[DUK_DBL_IDX_ULL0]) -#endif -#define DUK_DBLUNION_SET_INT64(u,v) DUK_DBLUNION_SET_UINT64((u), (duk_uint64_t) (v)) -#define DUK_DBLUNION_GET_INT64(u) ((duk_int64_t) DUK_DBLUNION_GET_UINT64((u))) -#endif /* DUK_USE_64BIT_OPS */ - -/* - * Double NaN manipulation macros related to NaN normalization needed when - * using the packed duk_tval representation. NaN normalization is necessary - * to keep double values compatible with the duk_tval format. - * - * When packed duk_tval is used, the NaN space is used to store pointers - * and other tagged values in addition to NaNs. Actual NaNs are normalized - * to a specific quiet NaN. The macros below are used by the implementation - * to check and normalize NaN values when they might be created. The macros - * are essentially NOPs when the non-packed duk_tval representation is used. - * - * A FULL check is exact and checks all bits. A NOTFULL check is used by - * the packed duk_tval and works correctly for all NaNs except those that - * begin with 0x7ff0. Since the 'normalized NaN' values used with packed - * duk_tval begin with 0x7ff8, the partial check is reliable when packed - * duk_tval is used. The 0x7ff8 prefix means the normalized NaN will be a - * quiet NaN regardless of its remaining lower bits. - * - * The ME variant below is specifically for ARM byte order, which has the - * feature that while doubles have a mixed byte order (32107654), unsigned - * long long values has a little endian byte order (76543210). When writing - * a logical double value through a ULL pointer, the 32-bit words need to be - * swapped; hence the #if defined()s below for ULL writes with DUK_USE_DOUBLE_ME. - * This is not full ARM support but suffices for some environments. - */ - -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) -/* Macros for 64-bit ops + mixed endian doubles. */ -#define DUK__DBLUNION_SET_NAN_FULL(u) do { \ - (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x000000007ff80000); \ - } while (0) -#define DUK__DBLUNION_IS_NAN_FULL(u) \ - ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000)) && \ - ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0xffffffff000fffff)) != 0)) -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff80000)) -#define DUK__DBLUNION_IS_ANYINF(u) \ - (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x000000007ff00000)) -#define DUK__DBLUNION_IS_POSINF(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff00000)) -#define DUK__DBLUNION_IS_NEGINF(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x00000000fff00000)) -#define DUK__DBLUNION_IS_ANYZERO(u) \ - (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x0000000000000000)) -#define DUK__DBLUNION_IS_POSZERO(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000)) -#define DUK__DBLUNION_IS_NEGZERO(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000080000000)) -#else -/* Macros for 64-bit ops + big/little endian doubles. */ -#define DUK__DBLUNION_SET_NAN_FULL(u) do { \ - (u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x7ff8000000000000); \ - } while (0) -#define DUK__DBLUNION_IS_NAN_FULL(u) \ - ((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000)) && \ - ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0x000fffffffffffff)) != 0)) -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff8000000000000)) -#define DUK__DBLUNION_IS_ANYINF(u) \ - (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x7ff0000000000000)) -#define DUK__DBLUNION_IS_POSINF(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff0000000000000)) -#define DUK__DBLUNION_IS_NEGINF(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0xfff0000000000000)) -#define DUK__DBLUNION_IS_ANYZERO(u) \ - (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x0000000000000000)) -#define DUK__DBLUNION_IS_POSZERO(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000)) -#define DUK__DBLUNION_IS_NEGZERO(u) \ - ((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x8000000000000000)) -#endif -#else /* DUK_USE_64BIT_OPS */ -/* Macros for no 64-bit ops, any endianness. */ -#define DUK__DBLUNION_SET_NAN_FULL(u) do { \ - (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) 0x7ff80000UL; \ - (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0x00000000UL; \ - } while (0) -#define DUK__DBLUNION_IS_NAN_FULL(u) \ - ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL) && \ - (((u)->ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) != 0 || \ - (u)->ui[DUK_DBL_IDX_UI1] != 0)) -#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_ANYINF(u) \ - ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x7ff00000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_POSINF(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff00000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_NEGINF(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0xfff00000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_ANYZERO(u) \ - ((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x00000000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_POSZERO(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0x00000000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#define DUK__DBLUNION_IS_NEGZERO(u) \ - (((u)->ui[DUK_DBL_IDX_UI0] == 0x80000000UL) && \ - ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL)) -#endif /* DUK_USE_64BIT_OPS */ - -#define DUK__DBLUNION_SET_NAN_NOTFULL(u) do { \ - (u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \ - } while (0) - -#define DUK__DBLUNION_IS_NAN_NOTFULL(u) \ - /* E == 0x7ff, topmost four bits of F != 0 => assume NaN */ \ - ((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \ - (((u)->us[DUK_DBL_IDX_US0] & 0x000fUL) != 0x0000UL)) - -#define DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL(u) \ - /* E == 0x7ff, F == 8 => normalized NaN */ \ - ((u)->us[DUK_DBL_IDX_US0] == 0x7ff8UL) - -#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL(u) do { \ - if (DUK__DBLUNION_IS_NAN_FULL((u))) { \ - DUK__DBLUNION_SET_NAN_FULL((u)); \ - } \ - } while (0) - -#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL(u) do { \ - if (DUK__DBLUNION_IS_NAN_NOTFULL((u))) { \ - DUK__DBLUNION_SET_NAN_NOTFULL((u)); \ - } \ - } while (0) - -/* Concrete macros for NaN handling used by the implementation internals. - * Chosen so that they match the duk_tval representation: with a packed - * duk_tval, ensure NaNs are properly normalized; with a non-packed duk_tval - * these are essentially NOPs. - */ - -#if defined(DUK_USE_PACKED_TVAL) -#if defined(DUK_USE_FULL_TVAL) -#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL((u)) -#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) -#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_FULL((u)) -#define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_FULL((d)) -#else -#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL((u)) -#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_NOTFULL((u)) -#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL((u)) -#define DUK_DBLUNION_SET_NAN(d) DUK__DBLUNION_SET_NAN_NOTFULL((d)) -#endif -#define DUK_DBLUNION_IS_NORMALIZED(u) \ - (!DUK_DBLUNION_IS_NAN((u)) || /* either not a NaN */ \ - DUK_DBLUNION_IS_NORMALIZED_NAN((u))) /* or is a normalized NaN */ -#else /* DUK_USE_PACKED_TVAL */ -#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u) /* nop: no need to normalize */ -#define DUK_DBLUNION_IS_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ -#define DUK_DBLUNION_IS_NORMALIZED_NAN(u) DUK__DBLUNION_IS_NAN_FULL((u)) /* (DUK_ISNAN((u)->d)) */ -#define DUK_DBLUNION_IS_NORMALIZED(u) 1 /* all doubles are considered normalized */ -#define DUK_DBLUNION_SET_NAN(u) do { \ - /* in non-packed representation we don't care about which NaN is used */ \ - (u)->d = DUK_DOUBLE_NAN; \ - } while (0) -#endif /* DUK_USE_PACKED_TVAL */ - -#define DUK_DBLUNION_IS_ANYINF(u) DUK__DBLUNION_IS_ANYINF((u)) -#define DUK_DBLUNION_IS_POSINF(u) DUK__DBLUNION_IS_POSINF((u)) -#define DUK_DBLUNION_IS_NEGINF(u) DUK__DBLUNION_IS_NEGINF((u)) - -#define DUK_DBLUNION_IS_ANYZERO(u) DUK__DBLUNION_IS_ANYZERO((u)) -#define DUK_DBLUNION_IS_POSZERO(u) DUK__DBLUNION_IS_POSZERO((u)) -#define DUK_DBLUNION_IS_NEGZERO(u) DUK__DBLUNION_IS_NEGZERO((u)) - -/* XXX: native 64-bit byteswaps when available */ - -/* 64-bit byteswap, same operation independent of target endianness. */ -#define DUK_DBLUNION_BSWAP64(u) do { \ - duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ - duk__bswaptmp1 = (u)->ui[0]; \ - duk__bswaptmp2 = (u)->ui[1]; \ - duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ - duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ - (u)->ui[0] = duk__bswaptmp2; \ - (u)->ui[1] = duk__bswaptmp1; \ - } while (0) - -/* Byteswap an IEEE double in the duk_double_union from host to network - * order. For a big endian target this is a no-op. - */ -#if defined(DUK_USE_DOUBLE_LE) -#define DUK_DBLUNION_DOUBLE_HTON(u) do { \ - duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ - duk__bswaptmp1 = (u)->ui[0]; \ - duk__bswaptmp2 = (u)->ui[1]; \ - duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ - duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ - (u)->ui[0] = duk__bswaptmp2; \ - (u)->ui[1] = duk__bswaptmp1; \ - } while (0) -#elif defined(DUK_USE_DOUBLE_ME) -#define DUK_DBLUNION_DOUBLE_HTON(u) do { \ - duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \ - duk__bswaptmp1 = (u)->ui[0]; \ - duk__bswaptmp2 = (u)->ui[1]; \ - duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \ - duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \ - (u)->ui[0] = duk__bswaptmp1; \ - (u)->ui[1] = duk__bswaptmp2; \ - } while (0) -#elif defined(DUK_USE_DOUBLE_BE) -#define DUK_DBLUNION_DOUBLE_HTON(u) do { } while (0) -#else -#error internal error, double endianness insane -#endif - -/* Reverse operation is the same. */ -#define DUK_DBLUNION_DOUBLE_NTOH(u) DUK_DBLUNION_DOUBLE_HTON((u)) - -/* Some sign bit helpers. */ -#if defined(DUK_USE_64BIT_OPS) -#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000)) != 0) -#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] >> 63U)) -#else -#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] & 0x80000000UL) != 0) -#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] >> 31U)) -#endif - -#endif /* DUK_DBLUNION_H_INCLUDED */ -/* #include duk_replacements.h */ -#line 1 "duk_replacements.h" -#if !defined(DUK_REPLACEMENTS_H_INCLUDED) -#define DUK_REPLACEMENTS_H_INCLUDED - -#if !defined(DUK_SINGLE_FILE) -#if defined(DUK_USE_COMPUTED_INFINITY) -DUK_INTERNAL_DECL double duk_computed_infinity; -#endif -#if defined(DUK_USE_COMPUTED_NAN) -DUK_INTERNAL_DECL double duk_computed_nan; -#endif -#endif /* !DUK_SINGLE_FILE */ - -#if defined(DUK_USE_REPL_FPCLASSIFY) -DUK_INTERNAL_DECL int duk_repl_fpclassify(double x); -#endif -#if defined(DUK_USE_REPL_SIGNBIT) -DUK_INTERNAL_DECL int duk_repl_signbit(double x); -#endif -#if defined(DUK_USE_REPL_ISFINITE) -DUK_INTERNAL_DECL int duk_repl_isfinite(double x); -#endif -#if defined(DUK_USE_REPL_ISNAN) -DUK_INTERNAL_DECL int duk_repl_isnan(double x); -#endif -#if defined(DUK_USE_REPL_ISINF) -DUK_INTERNAL_DECL int duk_repl_isinf(double x); -#endif - -#endif /* DUK_REPLACEMENTS_H_INCLUDED */ -/* #include duk_jmpbuf.h */ -#line 1 "duk_jmpbuf.h" -/* - * Wrapper for jmp_buf. - * - * This is used because jmp_buf is an array type for backward compatibility. - * Wrapping jmp_buf in a struct makes pointer references, sizeof, etc, - * behave more intuitively. - * - * http://en.wikipedia.org/wiki/Setjmp.h#Member_types - */ - -#if !defined(DUK_JMPBUF_H_INCLUDED) -#define DUK_JMPBUF_H_INCLUDED - -#if defined(DUK_USE_CPP_EXCEPTIONS) -struct duk_jmpbuf { - duk_small_int_t dummy; /* unused */ -}; -#else -struct duk_jmpbuf { - DUK_JMPBUF_TYPE jb; -}; -#endif - -#endif /* DUK_JMPBUF_H_INCLUDED */ -/* #include duk_exception.h */ -#line 1 "duk_exception.h" -/* - * Exception for Duktape internal throws when C++ exceptions are used - * for long control transfers. - * - * Doesn't inherit from any exception base class to minimize the chance - * that user code would accidentally catch this exception. - */ - -#if !defined(DUK_EXCEPTION_H_INCLUDED) -#define DUK_EXCEPTION_H_INCLUDED - -#if defined(DUK_USE_CPP_EXCEPTIONS) -class duk_internal_exception { - /* intentionally empty */ -}; -#endif - -#endif /* DUK_EXCEPTION_H_INCLUDED */ -/* #include duk_forwdecl.h */ -#line 1 "duk_forwdecl.h" -/* - * Forward declarations for all Duktape structures. - */ - -#if !defined(DUK_FORWDECL_H_INCLUDED) -#define DUK_FORWDECL_H_INCLUDED - -/* - * Forward declarations - */ - -#if defined(DUK_USE_CPP_EXCEPTIONS) -class duk_internal_exception; -#else -struct duk_jmpbuf; -#endif - -/* duk_tval intentionally skipped */ -struct duk_heaphdr; -struct duk_heaphdr_string; -struct duk_harray; -struct duk_hstring; -struct duk_hstring_external; -struct duk_hobject; -struct duk_hcompfunc; -struct duk_hnatfunc; -struct duk_hboundfunc; -struct duk_hthread; -struct duk_hbufobj; -struct duk_hdecenv; -struct duk_hobjenv; -struct duk_hproxy; -struct duk_hbuffer; -struct duk_hbuffer_fixed; -struct duk_hbuffer_dynamic; -struct duk_hbuffer_external; - -struct duk_propaccessor; -union duk_propvalue; -struct duk_propdesc; - -struct duk_heap; -struct duk_breakpoint; - -struct duk_activation; -struct duk_catcher; -struct duk_strcache; -struct duk_ljstate; -struct duk_strtab_entry; - -#if defined(DUK_USE_DEBUG) -struct duk_fixedbuffer; -#endif - -struct duk_bitdecoder_ctx; -struct duk_bitencoder_ctx; -struct duk_bufwriter_ctx; - -struct duk_token; -struct duk_re_token; -struct duk_lexer_point; -struct duk_lexer_ctx; -struct duk_lexer_codepoint; - -struct duk_compiler_instr; -struct duk_compiler_func; -struct duk_compiler_ctx; - -struct duk_re_matcher_ctx; -struct duk_re_compiler_ctx; - -#if defined(DUK_USE_CPP_EXCEPTIONS) -/* no typedef */ -#else -typedef struct duk_jmpbuf duk_jmpbuf; -#endif - -/* duk_tval intentionally skipped */ -typedef struct duk_heaphdr duk_heaphdr; -typedef struct duk_heaphdr_string duk_heaphdr_string; -typedef struct duk_harray duk_harray; -typedef struct duk_hstring duk_hstring; -typedef struct duk_hstring_external duk_hstring_external; -typedef struct duk_hobject duk_hobject; -typedef struct duk_hcompfunc duk_hcompfunc; -typedef struct duk_hnatfunc duk_hnatfunc; -typedef struct duk_hboundfunc duk_hboundfunc; -typedef struct duk_hthread duk_hthread; -typedef struct duk_hbufobj duk_hbufobj; -typedef struct duk_hdecenv duk_hdecenv; -typedef struct duk_hobjenv duk_hobjenv; -typedef struct duk_hproxy duk_hproxy; -typedef struct duk_hbuffer duk_hbuffer; -typedef struct duk_hbuffer_fixed duk_hbuffer_fixed; -typedef struct duk_hbuffer_dynamic duk_hbuffer_dynamic; -typedef struct duk_hbuffer_external duk_hbuffer_external; - -typedef struct duk_propaccessor duk_propaccessor; -typedef union duk_propvalue duk_propvalue; -typedef struct duk_propdesc duk_propdesc; - -typedef struct duk_heap duk_heap; -typedef struct duk_breakpoint duk_breakpoint; - -typedef struct duk_activation duk_activation; -typedef struct duk_catcher duk_catcher; -typedef struct duk_strcache duk_strcache; -typedef struct duk_ljstate duk_ljstate; -typedef struct duk_strtab_entry duk_strtab_entry; - -#if defined(DUK_USE_DEBUG) -typedef struct duk_fixedbuffer duk_fixedbuffer; -#endif - -typedef struct duk_bitdecoder_ctx duk_bitdecoder_ctx; -typedef struct duk_bitencoder_ctx duk_bitencoder_ctx; -typedef struct duk_bufwriter_ctx duk_bufwriter_ctx; - -typedef struct duk_token duk_token; -typedef struct duk_re_token duk_re_token; -typedef struct duk_lexer_point duk_lexer_point; -typedef struct duk_lexer_ctx duk_lexer_ctx; -typedef struct duk_lexer_codepoint duk_lexer_codepoint; - -typedef struct duk_compiler_instr duk_compiler_instr; -typedef struct duk_compiler_func duk_compiler_func; -typedef struct duk_compiler_ctx duk_compiler_ctx; - -typedef struct duk_re_matcher_ctx duk_re_matcher_ctx; -typedef struct duk_re_compiler_ctx duk_re_compiler_ctx; - -#endif /* DUK_FORWDECL_H_INCLUDED */ -/* #include duk_tval.h */ -#line 1 "duk_tval.h" -/* - * Tagged type definition (duk_tval) and accessor macros. - * - * Access all fields through the accessor macros, as the representation - * is quite tricky. - * - * There are two packed type alternatives: an 8-byte representation - * based on an IEEE double (preferred for compactness), and a 12-byte - * representation (portability). The latter is needed also in e.g. - * 64-bit environments (it usually pads to 16 bytes per value). - * - * Selecting the tagged type format involves many trade-offs (memory - * use, size and performance of generated code, portability, etc). - * - * NB: because macro arguments are often expressions, macros should - * avoid evaluating their argument more than once. - */ - -#if !defined(DUK_TVAL_H_INCLUDED) -#define DUK_TVAL_H_INCLUDED - -/* sanity */ -#if !defined(DUK_USE_DOUBLE_LE) && !defined(DUK_USE_DOUBLE_ME) && !defined(DUK_USE_DOUBLE_BE) -#error unsupported: cannot determine byte order variant -#endif - -#if defined(DUK_USE_PACKED_TVAL) -/* ======================================================================== */ - -/* - * Packed 8-byte representation - */ - -/* use duk_double_union as duk_tval directly */ -typedef union duk_double_union duk_tval; -typedef struct { - duk_uint16_t a; - duk_uint16_t b; - duk_uint16_t c; - duk_uint16_t d; -} duk_tval_unused; - -/* tags */ -#define DUK_TAG_NORMALIZED_NAN 0x7ff8UL /* the NaN variant we use */ -/* avoid tag 0xfff0, no risk of confusion with negative infinity */ -#define DUK_TAG_MIN 0xfff1UL -#if defined(DUK_USE_FASTINT) -#define DUK_TAG_FASTINT 0xfff1UL /* embed: integer value */ -#endif -#define DUK_TAG_UNUSED 0xfff2UL /* marker; not actual tagged value */ -#define DUK_TAG_UNDEFINED 0xfff3UL /* embed: nothing */ -#define DUK_TAG_NULL 0xfff4UL /* embed: nothing */ -#define DUK_TAG_BOOLEAN 0xfff5UL /* embed: 0 or 1 (false or true) */ -/* DUK_TAG_NUMBER would logically go here, but it has multiple 'tags' */ -#define DUK_TAG_POINTER 0xfff6UL /* embed: void ptr */ -#define DUK_TAG_LIGHTFUNC 0xfff7UL /* embed: func ptr */ -#define DUK_TAG_STRING 0xfff8UL /* embed: duk_hstring ptr */ -#define DUK_TAG_OBJECT 0xfff9UL /* embed: duk_hobject ptr */ -#define DUK_TAG_BUFFER 0xfffaUL /* embed: duk_hbuffer ptr */ -#define DUK_TAG_MAX 0xfffaUL - -/* for convenience */ -#define DUK_XTAG_BOOLEAN_FALSE 0xfff50000UL -#define DUK_XTAG_BOOLEAN_TRUE 0xfff50001UL - -#define DUK_TVAL_IS_VALID_TAG(tv) \ - (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN) - -/* DUK_TVAL_UNUSED initializer for duk_tval_unused, works for any endianness. */ -#define DUK_TVAL_UNUSED_INITIALIZER() \ - { DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED } - -/* two casts to avoid gcc warning: "warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]" */ -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) -#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 16) | (((duk_uint64_t) (duk_uint32_t) (h)) << 32); \ - } while (0) -#else -#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 48) | ((duk_uint64_t) (duk_uint32_t) (h)); \ - } while (0) -#endif -#else /* DUK_USE_64BIT_OPS */ -#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) (tag)) << 16; \ - duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (h); \ - } while (0) -#endif /* DUK_USE_64BIT_OPS */ - -#if defined(DUK_USE_64BIT_OPS) -/* Double casting for pointer to avoid gcc warning (cast from pointer to integer of different size) */ -#if defined(DUK_USE_DOUBLE_ME) -#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 16) | \ - ((duk_uint64_t) (flags)) | \ - (((duk_uint64_t) (duk_uint32_t) (fp)) << 32); \ - } while (0) -#else -#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 48) | \ - (((duk_uint64_t) (flags)) << 32) | \ - ((duk_uint64_t) (duk_uint32_t) (fp)); \ - } while (0) -#endif -#else /* DUK_USE_64BIT_OPS */ -#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->ui[DUK_DBL_IDX_UI0] = (((duk_uint32_t) DUK_TAG_LIGHTFUNC) << 16) | ((duk_uint32_t) (flags)); \ - duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (fp); \ - } while (0) -#endif /* DUK_USE_64BIT_OPS */ - -#if defined(DUK_USE_FASTINT) -/* Note: masking is done for 'i' to deal with negative numbers correctly */ -#if defined(DUK_USE_DOUBLE_ME) -#define DUK__TVAL_SET_I48(tv,i) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16 | (((duk_uint32_t) ((i) >> 32)) & 0x0000ffffUL); \ - duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \ - } while (0) -#define DUK__TVAL_SET_U32(tv,i) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16; \ - duk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \ - } while (0) -#else -#define DUK__TVAL_SET_I48(tv,i) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (((duk_uint64_t) (i)) & DUK_U64_CONSTANT(0x0000ffffffffffff)); \ - } while (0) -#define DUK__TVAL_SET_U32(tv,i) do { \ - (tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (duk_uint64_t) (i); \ - } while (0) -#endif - -/* This needs to go through a cast because sign extension is needed. */ -#define DUK__TVAL_SET_I32(tv,i) do { \ - duk_int64_t duk__tmp = (duk_int64_t) (i); \ - DUK_TVAL_SET_I48((tv), duk__tmp); \ - } while (0) - -/* XXX: Clumsy sign extend and masking of 16 topmost bits. */ -#if defined(DUK_USE_DOUBLE_ME) -#define DUK__TVAL_GET_FASTINT(tv) (((duk_int64_t) ((((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI0]) << 32) | ((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI1]))) << 16 >> 16) -#else -#define DUK__TVAL_GET_FASTINT(tv) ((((duk_int64_t) (tv)->ull[DUK_DBL_IDX_ULL0]) << 16) >> 16) -#endif -#define DUK__TVAL_GET_FASTINT_U32(tv) ((tv)->ui[DUK_DBL_IDX_UI1]) -#define DUK__TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) (tv)->ui[DUK_DBL_IDX_UI1]) -#endif /* DUK_USE_FASTINT */ - -#define DUK_TVAL_SET_UNDEFINED(tv) do { \ - (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNDEFINED; \ - } while (0) -#define DUK_TVAL_SET_UNUSED(tv) do { \ - (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNUSED; \ - } while (0) -#define DUK_TVAL_SET_NULL(tv) do { \ - (tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_NULL; \ - } while (0) - -#define DUK_TVAL_SET_BOOLEAN(tv,val) DUK_DBLUNION_SET_HIGH32((tv), (((duk_uint32_t) DUK_TAG_BOOLEAN) << 16) | ((duk_uint32_t) (val))) - -#define DUK_TVAL_SET_NAN(tv) DUK_DBLUNION_SET_NAN_FULL((tv)) - -/* Assumes that caller has normalized NaNs, otherwise trouble ahead. */ -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_DOUBLE(tv,d) do { \ - duk_double_t duk__dblval; \ - duk__dblval = (d); \ - DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \ - DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \ - } while (0) -#define DUK_TVAL_SET_I48(tv,i) DUK__TVAL_SET_I48((tv), (i)) -#define DUK_TVAL_SET_I32(tv,i) DUK__TVAL_SET_I32((tv), (i)) -#define DUK_TVAL_SET_U32(tv,i) DUK__TVAL_SET_U32((tv), (i)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) duk_tval_set_number_chkfast_fast((tv), (d)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) duk_tval_set_number_chkfast_slow((tv), (d)) -#define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) -#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__d; \ - duk__tv = (tv); \ - if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ - duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ - DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \ - } \ - } while (0) -#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__d; \ - duk__tv = (tv); \ - if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ - duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ - DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \ - } \ - } while (0) -#else /* DUK_USE_FASTINT */ -#define DUK_TVAL_SET_DOUBLE(tv,d) do { \ - duk_double_t duk__dblval; \ - duk__dblval = (d); \ - DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \ - DUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \ - } while (0) -#define DUK_TVAL_SET_I48(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) /* XXX: fast int-to-double */ -#define DUK_TVAL_SET_I32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) -#define DUK_TVAL_SET_U32(tv,i) DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) -#define DUK_TVAL_SET_NUMBER(tv,d) DUK_TVAL_SET_DOUBLE((tv), (d)) -#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0) -#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0) -#endif /* DUK_USE_FASTINT */ - -#define DUK_TVAL_SET_FASTINT(tv,i) DUK_TVAL_SET_I48((tv), (i)) /* alias */ - -#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) DUK__TVAL_SET_LIGHTFUNC((tv), (fp), (flags)) -#define DUK_TVAL_SET_STRING(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_STRING) -#define DUK_TVAL_SET_OBJECT(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_OBJECT) -#define DUK_TVAL_SET_BUFFER(tv,h) DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_BUFFER) -#define DUK_TVAL_SET_POINTER(tv,p) DUK__TVAL_SET_TAGGEDPOINTER((tv), (p), DUK_TAG_POINTER) - -#define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0) - -/* getters */ -#define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US1]) -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d) -#define DUK_TVAL_GET_FASTINT(tv) DUK__TVAL_GET_FASTINT((tv)) -#define DUK_TVAL_GET_FASTINT_U32(tv) DUK__TVAL_GET_FASTINT_U32((tv)) -#define DUK_TVAL_GET_FASTINT_I32(tv) DUK__TVAL_GET_FASTINT_I32((tv)) -#define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_packed((tv)) -#else -#define DUK_TVAL_GET_NUMBER(tv) ((tv)->d) -#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->d) -#endif -#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \ - (out_flags) = (tv)->ui[DUK_DBL_IDX_UI0] & 0xffffUL; \ - (out_fp) = (duk_c_function) (tv)->ui[DUK_DBL_IDX_UI1]; \ - } while (0) -#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((duk_c_function) ((tv)->ui[DUK_DBL_IDX_UI1])) -#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) (((duk_small_uint_t) (tv)->ui[DUK_DBL_IDX_UI0]) & 0xffffUL) -#define DUK_TVAL_GET_STRING(tv) ((duk_hstring *) (tv)->vp[DUK_DBL_IDX_VP1]) -#define DUK_TVAL_GET_OBJECT(tv) ((duk_hobject *) (tv)->vp[DUK_DBL_IDX_VP1]) -#define DUK_TVAL_GET_BUFFER(tv) ((duk_hbuffer *) (tv)->vp[DUK_DBL_IDX_VP1]) -#define DUK_TVAL_GET_POINTER(tv) ((void *) (tv)->vp[DUK_DBL_IDX_VP1]) -#define DUK_TVAL_GET_HEAPHDR(tv) ((duk_heaphdr *) (tv)->vp[DUK_DBL_IDX_VP1]) - -/* decoding */ -#define DUK_TVAL_GET_TAG(tv) ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US0]) - -#define DUK_TVAL_IS_UNDEFINED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNDEFINED) -#define DUK_TVAL_IS_UNUSED(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNUSED) -#define DUK_TVAL_IS_NULL(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_NULL) -#define DUK_TVAL_IS_BOOLEAN(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BOOLEAN) -#define DUK_TVAL_IS_BOOLEAN_TRUE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_TRUE) -#define DUK_TVAL_IS_BOOLEAN_FALSE(tv) ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_FALSE) -#define DUK_TVAL_IS_LIGHTFUNC(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_LIGHTFUNC) -#define DUK_TVAL_IS_STRING(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_STRING) -#define DUK_TVAL_IS_OBJECT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_OBJECT) -#define DUK_TVAL_IS_BUFFER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BUFFER) -#define DUK_TVAL_IS_POINTER(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_POINTER) -#if defined(DUK_USE_FASTINT) -/* 0xfff0 is -Infinity */ -#define DUK_TVAL_IS_DOUBLE(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL) -#define DUK_TVAL_IS_FASTINT(tv) (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_FASTINT) -#define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff1UL) -#else -#define DUK_TVAL_IS_NUMBER(tv) (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL) -#define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv)) -#endif - -/* This is performance critical because it appears in every DECREF. */ -#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) (DUK_TVAL_GET_TAG((tv)) >= DUK_TAG_STRING) - -#if defined(DUK_USE_FASTINT) -DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_packed(duk_tval *tv); -#endif - -#else /* DUK_USE_PACKED_TVAL */ -/* ======================================================================== */ - -/* - * Portable 12-byte representation - */ - -/* Note: not initializing all bytes is normally not an issue: Duktape won't - * read or use the uninitialized bytes so valgrind won't issue warnings. - * In some special cases a harmless valgrind warning may be issued though. - * For example, the DumpHeap debugger command writes out a compiled function's - * 'data' area as is, including any uninitialized bytes, which causes a - * valgrind warning. - */ - -typedef struct duk_tval_struct duk_tval; - -struct duk_tval_struct { - duk_small_uint_t t; - duk_small_uint_t v_extra; - union { - duk_double_t d; - duk_small_int_t i; -#if defined(DUK_USE_FASTINT) - duk_int64_t fi; /* if present, forces 16-byte duk_tval */ -#endif - void *voidptr; - duk_hstring *hstring; - duk_hobject *hobject; - duk_hcompfunc *hcompfunc; - duk_hnatfunc *hnatfunc; - duk_hthread *hthread; - duk_hbuffer *hbuffer; - duk_heaphdr *heaphdr; - duk_c_function lightfunc; - } v; -}; - -typedef struct { - duk_small_uint_t t; - duk_small_uint_t v_extra; - /* The rest of the fields don't matter except for debug dumps and such - * for which a partial initializer may trigger out-ot-bounds memory - * reads. Include a double field which is usually as large or larger - * than pointers (not always however). - */ - duk_double_t d; -} duk_tval_unused; - -#define DUK_TVAL_UNUSED_INITIALIZER() \ - { DUK_TAG_UNUSED, 0, 0.0 } - -#define DUK_TAG_MIN 0 -#define DUK_TAG_NUMBER 0 /* DUK_TAG_NUMBER only defined for non-packed duk_tval */ -#if defined(DUK_USE_FASTINT) -#define DUK_TAG_FASTINT 1 -#endif -#define DUK_TAG_UNDEFINED 2 -#define DUK_TAG_NULL 3 -#define DUK_TAG_BOOLEAN 4 -#define DUK_TAG_POINTER 5 -#define DUK_TAG_LIGHTFUNC 6 -#define DUK_TAG_UNUSED 7 /* marker; not actual tagged type */ -#define DUK_TAG_STRING 8 /* first heap allocated, match bit boundary */ -#define DUK_TAG_OBJECT 9 -#define DUK_TAG_BUFFER 10 -#define DUK_TAG_MAX 10 - -#define DUK_TVAL_IS_VALID_TAG(tv) \ - (DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN) - -/* DUK_TAG_NUMBER is intentionally first, as it is the default clause in code - * to support the 8-byte representation. Further, it is a non-heap-allocated - * type so it should come before DUK_TAG_STRING. Finally, it should not break - * the tag value ranges covered by case-clauses in a switch-case. - */ - -/* setters */ -#define DUK_TVAL_SET_UNDEFINED(tv) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_UNDEFINED; \ - } while (0) - -#define DUK_TVAL_SET_UNUSED(tv) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_UNUSED; \ - } while (0) - -#define DUK_TVAL_SET_NULL(tv) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_NULL; \ - } while (0) - -#define DUK_TVAL_SET_BOOLEAN(tv,val) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_BOOLEAN; \ - duk__tv->v.i = (duk_small_int_t) (val); \ - } while (0) - -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_DOUBLE(tv,val) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__dblval; \ - duk__dblval = (val); \ - DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_NUMBER; \ - duk__tv->v.d = duk__dblval; \ - } while (0) -#define DUK_TVAL_SET_I48(tv,val) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_FASTINT; \ - duk__tv->v.fi = (val); \ - } while (0) -#define DUK_TVAL_SET_U32(tv,val) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_FASTINT; \ - duk__tv->v.fi = (duk_int64_t) (val); \ - } while (0) -#define DUK_TVAL_SET_I32(tv,val) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_FASTINT; \ - duk__tv->v.fi = (duk_int64_t) (val); \ - } while (0) -#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \ - duk_tval_set_number_chkfast_fast((tv), (d)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \ - duk_tval_set_number_chkfast_slow((tv), (d)) -#define DUK_TVAL_SET_NUMBER(tv,val) \ - DUK_TVAL_SET_DOUBLE((tv), (val)) -#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__d; \ - duk__tv = (tv); \ - if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ - duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ - DUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \ - } \ - } while (0) -#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__d; \ - duk__tv = (tv); \ - if (DUK_TVAL_IS_DOUBLE(duk__tv)) { \ - duk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \ - DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \ - } \ - } while (0) -#else /* DUK_USE_FASTINT */ -#define DUK_TVAL_SET_DOUBLE(tv,d) \ - DUK_TVAL_SET_NUMBER((tv), (d)) -#define DUK_TVAL_SET_I48(tv,val) \ - DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) /* XXX: fast int-to-double */ -#define DUK_TVAL_SET_U32(tv,val) \ - DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) -#define DUK_TVAL_SET_I32(tv,val) \ - DUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val)) -#define DUK_TVAL_SET_NUMBER(tv,val) do { \ - duk_tval *duk__tv; \ - duk_double_t duk__dblval; \ - duk__dblval = (val); \ - DUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_NUMBER; \ - duk__tv->v.d = duk__dblval; \ - } while (0) -#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \ - DUK_TVAL_SET_NUMBER((tv), (d)) -#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \ - DUK_TVAL_SET_NUMBER((tv), (d)) -#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv) do { } while (0) -#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv) do { } while (0) -#endif /* DUK_USE_FASTINT */ - -#define DUK_TVAL_SET_FASTINT(tv,i) \ - DUK_TVAL_SET_I48((tv), (i)) /* alias */ - -#define DUK_TVAL_SET_POINTER(tv,hptr) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_POINTER; \ - duk__tv->v.voidptr = (hptr); \ - } while (0) - -#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_LIGHTFUNC; \ - duk__tv->v_extra = (flags); \ - duk__tv->v.lightfunc = (duk_c_function) (fp); \ - } while (0) - -#define DUK_TVAL_SET_STRING(tv,hptr) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_STRING; \ - duk__tv->v.hstring = (hptr); \ - } while (0) - -#define DUK_TVAL_SET_OBJECT(tv,hptr) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_OBJECT; \ - duk__tv->v.hobject = (hptr); \ - } while (0) - -#define DUK_TVAL_SET_BUFFER(tv,hptr) do { \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_BUFFER; \ - duk__tv->v.hbuffer = (hptr); \ - } while (0) - -#define DUK_TVAL_SET_NAN(tv) do { \ - /* in non-packed representation we don't care about which NaN is used */ \ - duk_tval *duk__tv; \ - duk__tv = (tv); \ - duk__tv->t = DUK_TAG_NUMBER; \ - duk__tv->v.d = DUK_DOUBLE_NAN; \ - } while (0) - -#define DUK_TVAL_SET_TVAL(tv,x) do { *(tv) = *(x); } while (0) - -/* getters */ -#define DUK_TVAL_GET_BOOLEAN(tv) ((duk_small_uint_t) (tv)->v.i) -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d) -#define DUK_TVAL_GET_FASTINT(tv) ((tv)->v.fi) -#define DUK_TVAL_GET_FASTINT_U32(tv) ((duk_uint32_t) ((tv)->v.fi)) -#define DUK_TVAL_GET_FASTINT_I32(tv) ((duk_int32_t) ((tv)->v.fi)) -#if 0 -#define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \ - (duk_double_t) DUK_TVAL_GET_FASTINT((tv)) : \ - DUK_TVAL_GET_DOUBLE((tv))) -#define DUK_TVAL_GET_NUMBER(tv) duk_tval_get_number_unpacked((tv)) -#else -/* This seems reasonable overall. */ -#define DUK_TVAL_GET_NUMBER(tv) (DUK_TVAL_IS_FASTINT((tv)) ? \ - duk_tval_get_number_unpacked_fastint((tv)) : \ - DUK_TVAL_GET_DOUBLE((tv))) -#endif -#else -#define DUK_TVAL_GET_NUMBER(tv) ((tv)->v.d) -#define DUK_TVAL_GET_DOUBLE(tv) ((tv)->v.d) -#endif /* DUK_USE_FASTINT */ -#define DUK_TVAL_GET_POINTER(tv) ((tv)->v.voidptr) -#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags) do { \ - (out_flags) = (duk_uint32_t) (tv)->v_extra; \ - (out_fp) = (tv)->v.lightfunc; \ - } while (0) -#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((tv)->v.lightfunc) -#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv) ((duk_small_uint_t) ((tv)->v_extra)) -#define DUK_TVAL_GET_STRING(tv) ((tv)->v.hstring) -#define DUK_TVAL_GET_OBJECT(tv) ((tv)->v.hobject) -#define DUK_TVAL_GET_BUFFER(tv) ((tv)->v.hbuffer) -#define DUK_TVAL_GET_HEAPHDR(tv) ((tv)->v.heaphdr) - -/* decoding */ -#define DUK_TVAL_GET_TAG(tv) ((tv)->t) -#define DUK_TVAL_IS_UNDEFINED(tv) ((tv)->t == DUK_TAG_UNDEFINED) -#define DUK_TVAL_IS_UNUSED(tv) ((tv)->t == DUK_TAG_UNUSED) -#define DUK_TVAL_IS_NULL(tv) ((tv)->t == DUK_TAG_NULL) -#define DUK_TVAL_IS_BOOLEAN(tv) ((tv)->t == DUK_TAG_BOOLEAN) -#define DUK_TVAL_IS_BOOLEAN_TRUE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i != 0)) -#define DUK_TVAL_IS_BOOLEAN_FALSE(tv) (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i == 0)) -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_IS_DOUBLE(tv) ((tv)->t == DUK_TAG_NUMBER) -#define DUK_TVAL_IS_FASTINT(tv) ((tv)->t == DUK_TAG_FASTINT) -#define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER || \ - (tv)->t == DUK_TAG_FASTINT) -#else -#define DUK_TVAL_IS_NUMBER(tv) ((tv)->t == DUK_TAG_NUMBER) -#define DUK_TVAL_IS_DOUBLE(tv) DUK_TVAL_IS_NUMBER((tv)) -#endif /* DUK_USE_FASTINT */ -#define DUK_TVAL_IS_POINTER(tv) ((tv)->t == DUK_TAG_POINTER) -#define DUK_TVAL_IS_LIGHTFUNC(tv) ((tv)->t == DUK_TAG_LIGHTFUNC) -#define DUK_TVAL_IS_STRING(tv) ((tv)->t == DUK_TAG_STRING) -#define DUK_TVAL_IS_OBJECT(tv) ((tv)->t == DUK_TAG_OBJECT) -#define DUK_TVAL_IS_BUFFER(tv) ((tv)->t == DUK_TAG_BUFFER) - -/* This is performance critical because it's needed for every DECREF. - * Take advantage of the fact that the first heap allocated tag is 8, - * so that bit 3 is set for all heap allocated tags (and never set for - * non-heap-allocated tags). - */ -#if 0 -#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t >= DUK_TAG_STRING) -#endif -#define DUK_TVAL_IS_HEAP_ALLOCATED(tv) ((tv)->t & 0x08) - -#if defined(DUK_USE_FASTINT) -#if 0 -DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked(duk_tval *tv); -#endif -DUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv); -#endif - -#endif /* DUK_USE_PACKED_TVAL */ - -/* - * Convenience (independent of representation) - */ - -#define DUK_TVAL_SET_BOOLEAN_TRUE(tv) DUK_TVAL_SET_BOOLEAN((tv), 1) -#define DUK_TVAL_SET_BOOLEAN_FALSE(tv) DUK_TVAL_SET_BOOLEAN((tv), 0) - -#define DUK_TVAL_STRING_IS_SYMBOL(tv) \ - DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING((tv))) - -/* Lightfunc flags packing and unpacking. */ -/* Sign extend: 0x0000##00 -> 0x##000000 -> sign extend to 0xssssss##. - * Avoid signed shifts due to portability limitations. - */ -#define DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags) \ - ((duk_int32_t) (duk_int8_t) (((duk_uint16_t) (lf_flags)) >> 8)) -#define DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags) \ - (((lf_flags) >> 4) & 0x0fU) -#define DUK_LFUNC_FLAGS_GET_NARGS(lf_flags) \ - ((lf_flags) & 0x0fU) -#define DUK_LFUNC_FLAGS_PACK(magic,length,nargs) \ - ((((duk_small_uint_t) (magic)) & 0xffU) << 8) | ((length) << 4) | (nargs) - -#define DUK_LFUNC_NARGS_VARARGS 0x0f /* varargs marker */ -#define DUK_LFUNC_NARGS_MIN 0x00 -#define DUK_LFUNC_NARGS_MAX 0x0e /* max, excl. varargs marker */ -#define DUK_LFUNC_LENGTH_MIN 0x00 -#define DUK_LFUNC_LENGTH_MAX 0x0f -#define DUK_LFUNC_MAGIC_MIN (-0x80) -#define DUK_LFUNC_MAGIC_MAX 0x7f - -/* fastint constants etc */ -#if defined(DUK_USE_FASTINT) -#define DUK_FASTINT_MIN (DUK_I64_CONSTANT(-0x800000000000)) -#define DUK_FASTINT_MAX (DUK_I64_CONSTANT(0x7fffffffffff)) -#define DUK_FASTINT_BITS 48 - -DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x); -DUK_INTERNAL_DECL void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x); -#endif - -#endif /* DUK_TVAL_H_INCLUDED */ -/* #include duk_builtins.h */ -#line 1 "duk_builtins.h" -/* - * Automatically generated by genbuiltins.py, do not edit! - */ - -#if !defined(DUK_BUILTINS_H_INCLUDED) -#define DUK_BUILTINS_H_INCLUDED - -#if defined(DUK_USE_ROM_STRINGS) -#error ROM support not enabled, rerun configure.py with --rom-support -#else /* DUK_USE_ROM_STRINGS */ -#define DUK_STRIDX_UC_UNDEFINED 0 /* 'Undefined' */ -#define DUK_HEAP_STRING_UC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_UNDEFINED) -#define DUK_HTHREAD_STRING_UC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_UNDEFINED) -#define DUK_STRIDX_UC_NULL 1 /* 'Null' */ -#define DUK_HEAP_STRING_UC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NULL) -#define DUK_HTHREAD_STRING_UC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NULL) -#define DUK_STRIDX_UC_SYMBOL 2 /* 'Symbol' */ -#define DUK_HEAP_STRING_UC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_SYMBOL) -#define DUK_HTHREAD_STRING_UC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_SYMBOL) -#define DUK_STRIDX_UC_ARGUMENTS 3 /* 'Arguments' */ -#define DUK_HEAP_STRING_UC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ARGUMENTS) -#define DUK_HTHREAD_STRING_UC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ARGUMENTS) -#define DUK_STRIDX_UC_OBJECT 4 /* 'Object' */ -#define DUK_HEAP_STRING_UC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_OBJECT) -#define DUK_HTHREAD_STRING_UC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_OBJECT) -#define DUK_STRIDX_UC_FUNCTION 5 /* 'Function' */ -#define DUK_HEAP_STRING_UC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_FUNCTION) -#define DUK_HTHREAD_STRING_UC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_FUNCTION) -#define DUK_STRIDX_ARRAY 6 /* 'Array' */ -#define DUK_HEAP_STRING_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY) -#define DUK_HTHREAD_STRING_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY) -#define DUK_STRIDX_UC_STRING 7 /* 'String' */ -#define DUK_HEAP_STRING_UC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_STRING) -#define DUK_HTHREAD_STRING_UC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_STRING) -#define DUK_STRIDX_UC_BOOLEAN 8 /* 'Boolean' */ -#define DUK_HEAP_STRING_UC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BOOLEAN) -#define DUK_HTHREAD_STRING_UC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BOOLEAN) -#define DUK_STRIDX_UC_NUMBER 9 /* 'Number' */ -#define DUK_HEAP_STRING_UC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NUMBER) -#define DUK_HTHREAD_STRING_UC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NUMBER) -#define DUK_STRIDX_DATE 10 /* 'Date' */ -#define DUK_HEAP_STRING_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATE) -#define DUK_HTHREAD_STRING_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATE) -#define DUK_STRIDX_REG_EXP 11 /* 'RegExp' */ -#define DUK_HEAP_STRING_REG_EXP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_REG_EXP) -#define DUK_HTHREAD_STRING_REG_EXP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_REG_EXP) -#define DUK_STRIDX_UC_ERROR 12 /* 'Error' */ -#define DUK_HEAP_STRING_UC_ERROR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ERROR) -#define DUK_HTHREAD_STRING_UC_ERROR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ERROR) -#define DUK_STRIDX_MATH 13 /* 'Math' */ -#define DUK_HEAP_STRING_MATH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MATH) -#define DUK_HTHREAD_STRING_MATH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MATH) -#define DUK_STRIDX_JSON 14 /* 'JSON' */ -#define DUK_HEAP_STRING_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON) -#define DUK_HTHREAD_STRING_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON) -#define DUK_STRIDX_EMPTY_STRING 15 /* '' */ -#define DUK_HEAP_STRING_EMPTY_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EMPTY_STRING) -#define DUK_HTHREAD_STRING_EMPTY_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EMPTY_STRING) -#define DUK_STRIDX_ARRAY_BUFFER 16 /* 'ArrayBuffer' */ -#define DUK_HEAP_STRING_ARRAY_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY_BUFFER) -#define DUK_HTHREAD_STRING_ARRAY_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY_BUFFER) -#define DUK_STRIDX_DATA_VIEW 17 /* 'DataView' */ -#define DUK_HEAP_STRING_DATA_VIEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA_VIEW) -#define DUK_HTHREAD_STRING_DATA_VIEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA_VIEW) -#define DUK_STRIDX_INT8_ARRAY 18 /* 'Int8Array' */ -#define DUK_HEAP_STRING_INT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT8_ARRAY) -#define DUK_HTHREAD_STRING_INT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT8_ARRAY) -#define DUK_STRIDX_UINT8_ARRAY 19 /* 'Uint8Array' */ -#define DUK_HEAP_STRING_UINT8_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_ARRAY) -#define DUK_HTHREAD_STRING_UINT8_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_ARRAY) -#define DUK_STRIDX_UINT8_CLAMPED_ARRAY 20 /* 'Uint8ClampedArray' */ -#define DUK_HEAP_STRING_UINT8_CLAMPED_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_CLAMPED_ARRAY) -#define DUK_HTHREAD_STRING_UINT8_CLAMPED_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_CLAMPED_ARRAY) -#define DUK_STRIDX_INT16_ARRAY 21 /* 'Int16Array' */ -#define DUK_HEAP_STRING_INT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT16_ARRAY) -#define DUK_HTHREAD_STRING_INT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT16_ARRAY) -#define DUK_STRIDX_UINT16_ARRAY 22 /* 'Uint16Array' */ -#define DUK_HEAP_STRING_UINT16_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT16_ARRAY) -#define DUK_HTHREAD_STRING_UINT16_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT16_ARRAY) -#define DUK_STRIDX_INT32_ARRAY 23 /* 'Int32Array' */ -#define DUK_HEAP_STRING_INT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT32_ARRAY) -#define DUK_HTHREAD_STRING_INT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT32_ARRAY) -#define DUK_STRIDX_UINT32_ARRAY 24 /* 'Uint32Array' */ -#define DUK_HEAP_STRING_UINT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT32_ARRAY) -#define DUK_HTHREAD_STRING_UINT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT32_ARRAY) -#define DUK_STRIDX_FLOAT32_ARRAY 25 /* 'Float32Array' */ -#define DUK_HEAP_STRING_FLOAT32_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT32_ARRAY) -#define DUK_HTHREAD_STRING_FLOAT32_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT32_ARRAY) -#define DUK_STRIDX_FLOAT64_ARRAY 26 /* 'Float64Array' */ -#define DUK_HEAP_STRING_FLOAT64_ARRAY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT64_ARRAY) -#define DUK_HTHREAD_STRING_FLOAT64_ARRAY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT64_ARRAY) -#define DUK_STRIDX_GLOBAL 27 /* 'global' */ -#define DUK_HEAP_STRING_GLOBAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GLOBAL) -#define DUK_HTHREAD_STRING_GLOBAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GLOBAL) -#define DUK_STRIDX_OBJ_ENV 28 /* 'ObjEnv' */ -#define DUK_HEAP_STRING_OBJ_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OBJ_ENV) -#define DUK_HTHREAD_STRING_OBJ_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OBJ_ENV) -#define DUK_STRIDX_DEC_ENV 29 /* 'DecEnv' */ -#define DUK_HEAP_STRING_DEC_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEC_ENV) -#define DUK_HTHREAD_STRING_DEC_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEC_ENV) -#define DUK_STRIDX_UC_BUFFER 30 /* 'Buffer' */ -#define DUK_HEAP_STRING_UC_BUFFER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BUFFER) -#define DUK_HTHREAD_STRING_UC_BUFFER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BUFFER) -#define DUK_STRIDX_UC_POINTER 31 /* 'Pointer' */ -#define DUK_HEAP_STRING_UC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_POINTER) -#define DUK_HTHREAD_STRING_UC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_POINTER) -#define DUK_STRIDX_UC_THREAD 32 /* 'Thread' */ -#define DUK_HEAP_STRING_UC_THREAD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_THREAD) -#define DUK_HTHREAD_STRING_UC_THREAD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_THREAD) -#define DUK_STRIDX_EVAL 33 /* 'eval' */ -#define DUK_HEAP_STRING_EVAL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EVAL) -#define DUK_HTHREAD_STRING_EVAL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EVAL) -#define DUK_STRIDX_VALUE 34 /* 'value' */ -#define DUK_HEAP_STRING_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE) -#define DUK_HTHREAD_STRING_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE) -#define DUK_STRIDX_WRITABLE 35 /* 'writable' */ -#define DUK_HEAP_STRING_WRITABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WRITABLE) -#define DUK_HTHREAD_STRING_WRITABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WRITABLE) -#define DUK_STRIDX_CONFIGURABLE 36 /* 'configurable' */ -#define DUK_HEAP_STRING_CONFIGURABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONFIGURABLE) -#define DUK_HTHREAD_STRING_CONFIGURABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONFIGURABLE) -#define DUK_STRIDX_ENUMERABLE 37 /* 'enumerable' */ -#define DUK_HEAP_STRING_ENUMERABLE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUMERABLE) -#define DUK_HTHREAD_STRING_ENUMERABLE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUMERABLE) -#define DUK_STRIDX_JOIN 38 /* 'join' */ -#define DUK_HEAP_STRING_JOIN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JOIN) -#define DUK_HTHREAD_STRING_JOIN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JOIN) -#define DUK_STRIDX_TO_LOCALE_STRING 39 /* 'toLocaleString' */ -#define DUK_HEAP_STRING_TO_LOCALE_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_LOCALE_STRING) -#define DUK_HTHREAD_STRING_TO_LOCALE_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_LOCALE_STRING) -#define DUK_STRIDX_VALUE_OF 40 /* 'valueOf' */ -#define DUK_HEAP_STRING_VALUE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE_OF) -#define DUK_HTHREAD_STRING_VALUE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE_OF) -#define DUK_STRIDX_TO_UTC_STRING 41 /* 'toUTCString' */ -#define DUK_HEAP_STRING_TO_UTC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_UTC_STRING) -#define DUK_HTHREAD_STRING_TO_UTC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_UTC_STRING) -#define DUK_STRIDX_TO_ISO_STRING 42 /* 'toISOString' */ -#define DUK_HEAP_STRING_TO_ISO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_ISO_STRING) -#define DUK_HTHREAD_STRING_TO_ISO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_ISO_STRING) -#define DUK_STRIDX_TO_GMT_STRING 43 /* 'toGMTString' */ -#define DUK_HEAP_STRING_TO_GMT_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_GMT_STRING) -#define DUK_HTHREAD_STRING_TO_GMT_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_GMT_STRING) -#define DUK_STRIDX_SOURCE 44 /* 'source' */ -#define DUK_HEAP_STRING_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SOURCE) -#define DUK_HTHREAD_STRING_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SOURCE) -#define DUK_STRIDX_IGNORE_CASE 45 /* 'ignoreCase' */ -#define DUK_HEAP_STRING_IGNORE_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IGNORE_CASE) -#define DUK_HTHREAD_STRING_IGNORE_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IGNORE_CASE) -#define DUK_STRIDX_MULTILINE 46 /* 'multiline' */ -#define DUK_HEAP_STRING_MULTILINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MULTILINE) -#define DUK_HTHREAD_STRING_MULTILINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MULTILINE) -#define DUK_STRIDX_LAST_INDEX 47 /* 'lastIndex' */ -#define DUK_HEAP_STRING_LAST_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LAST_INDEX) -#define DUK_HTHREAD_STRING_LAST_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LAST_INDEX) -#define DUK_STRIDX_FLAGS 48 /* 'flags' */ -#define DUK_HEAP_STRING_FLAGS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLAGS) -#define DUK_HTHREAD_STRING_FLAGS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLAGS) -#define DUK_STRIDX_INDEX 49 /* 'index' */ -#define DUK_HEAP_STRING_INDEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INDEX) -#define DUK_HTHREAD_STRING_INDEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INDEX) -#define DUK_STRIDX_PROTOTYPE 50 /* 'prototype' */ -#define DUK_HEAP_STRING_PROTOTYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTOTYPE) -#define DUK_HTHREAD_STRING_PROTOTYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTOTYPE) -#define DUK_STRIDX_CONSTRUCTOR 51 /* 'constructor' */ -#define DUK_HEAP_STRING_CONSTRUCTOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCTOR) -#define DUK_HTHREAD_STRING_CONSTRUCTOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCTOR) -#define DUK_STRIDX_MESSAGE 52 /* 'message' */ -#define DUK_HEAP_STRING_MESSAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MESSAGE) -#define DUK_HTHREAD_STRING_MESSAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MESSAGE) -#define DUK_STRIDX_LC_BOOLEAN 53 /* 'boolean' */ -#define DUK_HEAP_STRING_LC_BOOLEAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_BOOLEAN) -#define DUK_HTHREAD_STRING_LC_BOOLEAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_BOOLEAN) -#define DUK_STRIDX_LC_NUMBER 54 /* 'number' */ -#define DUK_HEAP_STRING_LC_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NUMBER) -#define DUK_HTHREAD_STRING_LC_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NUMBER) -#define DUK_STRIDX_LC_STRING 55 /* 'string' */ -#define DUK_HEAP_STRING_LC_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_STRING) -#define DUK_HTHREAD_STRING_LC_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_STRING) -#define DUK_STRIDX_LC_SYMBOL 56 /* 'symbol' */ -#define DUK_HEAP_STRING_LC_SYMBOL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_SYMBOL) -#define DUK_HTHREAD_STRING_LC_SYMBOL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_SYMBOL) -#define DUK_STRIDX_LC_OBJECT 57 /* 'object' */ -#define DUK_HEAP_STRING_LC_OBJECT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_OBJECT) -#define DUK_HTHREAD_STRING_LC_OBJECT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_OBJECT) -#define DUK_STRIDX_LC_UNDEFINED 58 /* 'undefined' */ -#define DUK_HEAP_STRING_LC_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_UNDEFINED) -#define DUK_HTHREAD_STRING_LC_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_UNDEFINED) -#define DUK_STRIDX_NAN 59 /* 'NaN' */ -#define DUK_HEAP_STRING_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAN) -#define DUK_HTHREAD_STRING_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAN) -#define DUK_STRIDX_INFINITY 60 /* 'Infinity' */ -#define DUK_HEAP_STRING_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INFINITY) -#define DUK_HTHREAD_STRING_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INFINITY) -#define DUK_STRIDX_MINUS_INFINITY 61 /* '-Infinity' */ -#define DUK_HEAP_STRING_MINUS_INFINITY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_INFINITY) -#define DUK_HTHREAD_STRING_MINUS_INFINITY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_INFINITY) -#define DUK_STRIDX_MINUS_ZERO 62 /* '-0' */ -#define DUK_HEAP_STRING_MINUS_ZERO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_ZERO) -#define DUK_HTHREAD_STRING_MINUS_ZERO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_ZERO) -#define DUK_STRIDX_COMMA 63 /* ',' */ -#define DUK_HEAP_STRING_COMMA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMMA) -#define DUK_HTHREAD_STRING_COMMA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMMA) -#define DUK_STRIDX_NEWLINE_4SPACE 64 /* '\n ' */ -#define DUK_HEAP_STRING_NEWLINE_4SPACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEWLINE_4SPACE) -#define DUK_HTHREAD_STRING_NEWLINE_4SPACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEWLINE_4SPACE) -#define DUK_STRIDX_BRACKETED_ELLIPSIS 65 /* '[...]' */ -#define DUK_HEAP_STRING_BRACKETED_ELLIPSIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BRACKETED_ELLIPSIS) -#define DUK_HTHREAD_STRING_BRACKETED_ELLIPSIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BRACKETED_ELLIPSIS) -#define DUK_STRIDX_INVALID_DATE 66 /* 'Invalid Date' */ -#define DUK_HEAP_STRING_INVALID_DATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INVALID_DATE) -#define DUK_HTHREAD_STRING_INVALID_DATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INVALID_DATE) -#define DUK_STRIDX_LC_ARGUMENTS 67 /* 'arguments' */ -#define DUK_HEAP_STRING_LC_ARGUMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_ARGUMENTS) -#define DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_ARGUMENTS) -#define DUK_STRIDX_CALLEE 68 /* 'callee' */ -#define DUK_HEAP_STRING_CALLEE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLEE) -#define DUK_HTHREAD_STRING_CALLEE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLEE) -#define DUK_STRIDX_CALLER 69 /* 'caller' */ -#define DUK_HEAP_STRING_CALLER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLER) -#define DUK_HTHREAD_STRING_CALLER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLER) -#define DUK_STRIDX_APPLY 70 /* 'apply' */ -#define DUK_HEAP_STRING_APPLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_APPLY) -#define DUK_HTHREAD_STRING_APPLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_APPLY) -#define DUK_STRIDX_CONSTRUCT 71 /* 'construct' */ -#define DUK_HEAP_STRING_CONSTRUCT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCT) -#define DUK_HTHREAD_STRING_CONSTRUCT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCT) -#define DUK_STRIDX_DELETE_PROPERTY 72 /* 'deleteProperty' */ -#define DUK_HEAP_STRING_DELETE_PROPERTY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE_PROPERTY) -#define DUK_HTHREAD_STRING_DELETE_PROPERTY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE_PROPERTY) -#define DUK_STRIDX_GET 73 /* 'get' */ -#define DUK_HEAP_STRING_GET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GET) -#define DUK_HTHREAD_STRING_GET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GET) -#define DUK_STRIDX_HAS 74 /* 'has' */ -#define DUK_HEAP_STRING_HAS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HAS) -#define DUK_HTHREAD_STRING_HAS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HAS) -#define DUK_STRIDX_OWN_KEYS 75 /* 'ownKeys' */ -#define DUK_HEAP_STRING_OWN_KEYS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OWN_KEYS) -#define DUK_HTHREAD_STRING_OWN_KEYS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OWN_KEYS) -#define DUK_STRIDX_SET_PROTOTYPE_OF 76 /* 'setPrototypeOf' */ -#define DUK_HEAP_STRING_SET_PROTOTYPE_OF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET_PROTOTYPE_OF) -#define DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET_PROTOTYPE_OF) -#define DUK_STRIDX___PROTO__ 77 /* '__proto__' */ -#define DUK_HEAP_STRING___PROTO__(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX___PROTO__) -#define DUK_HTHREAD_STRING___PROTO__(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX___PROTO__) -#define DUK_STRIDX_TO_STRING 78 /* 'toString' */ -#define DUK_HEAP_STRING_TO_STRING(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_STRING) -#define DUK_HTHREAD_STRING_TO_STRING(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_STRING) -#define DUK_STRIDX_TO_JSON 79 /* 'toJSON' */ -#define DUK_HEAP_STRING_TO_JSON(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_JSON) -#define DUK_HTHREAD_STRING_TO_JSON(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_JSON) -#define DUK_STRIDX_TYPE 80 /* 'type' */ -#define DUK_HEAP_STRING_TYPE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPE) -#define DUK_HTHREAD_STRING_TYPE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPE) -#define DUK_STRIDX_DATA 81 /* 'data' */ -#define DUK_HEAP_STRING_DATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA) -#define DUK_HTHREAD_STRING_DATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA) -#define DUK_STRIDX_LENGTH 82 /* 'length' */ -#define DUK_HEAP_STRING_LENGTH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LENGTH) -#define DUK_HTHREAD_STRING_LENGTH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LENGTH) -#define DUK_STRIDX_SET 83 /* 'set' */ -#define DUK_HEAP_STRING_SET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET) -#define DUK_HTHREAD_STRING_SET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET) -#define DUK_STRIDX_STACK 84 /* 'stack' */ -#define DUK_HEAP_STRING_STACK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STACK) -#define DUK_HTHREAD_STRING_STACK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STACK) -#define DUK_STRIDX_PC 85 /* 'pc' */ -#define DUK_HEAP_STRING_PC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PC) -#define DUK_HTHREAD_STRING_PC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PC) -#define DUK_STRIDX_LINE_NUMBER 86 /* 'lineNumber' */ -#define DUK_HEAP_STRING_LINE_NUMBER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LINE_NUMBER) -#define DUK_HTHREAD_STRING_LINE_NUMBER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LINE_NUMBER) -#define DUK_STRIDX_INT_TRACEDATA 87 /* '\x82Tracedata' */ -#define DUK_HEAP_STRING_INT_TRACEDATA(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TRACEDATA) -#define DUK_HTHREAD_STRING_INT_TRACEDATA(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TRACEDATA) -#define DUK_STRIDX_NAME 88 /* 'name' */ -#define DUK_HEAP_STRING_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAME) -#define DUK_HTHREAD_STRING_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAME) -#define DUK_STRIDX_FILE_NAME 89 /* 'fileName' */ -#define DUK_HEAP_STRING_FILE_NAME(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FILE_NAME) -#define DUK_HTHREAD_STRING_FILE_NAME(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FILE_NAME) -#define DUK_STRIDX_LC_POINTER 90 /* 'pointer' */ -#define DUK_HEAP_STRING_LC_POINTER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_POINTER) -#define DUK_HTHREAD_STRING_LC_POINTER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_POINTER) -#define DUK_STRIDX_INT_TARGET 91 /* '\x82Target' */ -#define DUK_HEAP_STRING_INT_TARGET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TARGET) -#define DUK_HTHREAD_STRING_INT_TARGET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TARGET) -#define DUK_STRIDX_INT_NEXT 92 /* '\x82Next' */ -#define DUK_HEAP_STRING_INT_NEXT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_NEXT) -#define DUK_HTHREAD_STRING_INT_NEXT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_NEXT) -#define DUK_STRIDX_INT_BYTECODE 93 /* '\x82Bytecode' */ -#define DUK_HEAP_STRING_INT_BYTECODE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_BYTECODE) -#define DUK_HTHREAD_STRING_INT_BYTECODE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_BYTECODE) -#define DUK_STRIDX_INT_FORMALS 94 /* '\x82Formals' */ -#define DUK_HEAP_STRING_INT_FORMALS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FORMALS) -#define DUK_HTHREAD_STRING_INT_FORMALS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FORMALS) -#define DUK_STRIDX_INT_VARMAP 95 /* '\x82Varmap' */ -#define DUK_HEAP_STRING_INT_VARMAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARMAP) -#define DUK_HTHREAD_STRING_INT_VARMAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARMAP) -#define DUK_STRIDX_INT_SOURCE 96 /* '\x82Source' */ -#define DUK_HEAP_STRING_INT_SOURCE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_SOURCE) -#define DUK_HTHREAD_STRING_INT_SOURCE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_SOURCE) -#define DUK_STRIDX_INT_PC2LINE 97 /* '\x82Pc2line' */ -#define DUK_HEAP_STRING_INT_PC2LINE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_PC2LINE) -#define DUK_HTHREAD_STRING_INT_PC2LINE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_PC2LINE) -#define DUK_STRIDX_INT_MAP 98 /* '\x82Map' */ -#define DUK_HEAP_STRING_INT_MAP(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_MAP) -#define DUK_HTHREAD_STRING_INT_MAP(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_MAP) -#define DUK_STRIDX_INT_VARENV 99 /* '\x82Varenv' */ -#define DUK_HEAP_STRING_INT_VARENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARENV) -#define DUK_HTHREAD_STRING_INT_VARENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARENV) -#define DUK_STRIDX_INT_FINALIZER 100 /* '\x82Finalizer' */ -#define DUK_HEAP_STRING_INT_FINALIZER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FINALIZER) -#define DUK_HTHREAD_STRING_INT_FINALIZER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FINALIZER) -#define DUK_STRIDX_INT_VALUE 101 /* '\x82Value' */ -#define DUK_HEAP_STRING_INT_VALUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VALUE) -#define DUK_HTHREAD_STRING_INT_VALUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VALUE) -#define DUK_STRIDX_COMPILE 102 /* 'compile' */ -#define DUK_HEAP_STRING_COMPILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMPILE) -#define DUK_HTHREAD_STRING_COMPILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMPILE) -#define DUK_STRIDX_INPUT 103 /* 'input' */ -#define DUK_HEAP_STRING_INPUT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INPUT) -#define DUK_HTHREAD_STRING_INPUT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INPUT) -#define DUK_STRIDX_ERR_CREATE 104 /* 'errCreate' */ -#define DUK_HEAP_STRING_ERR_CREATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_CREATE) -#define DUK_HTHREAD_STRING_ERR_CREATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_CREATE) -#define DUK_STRIDX_ERR_THROW 105 /* 'errThrow' */ -#define DUK_HEAP_STRING_ERR_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_THROW) -#define DUK_HTHREAD_STRING_ERR_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_THROW) -#define DUK_STRIDX_ENV 106 /* 'env' */ -#define DUK_HEAP_STRING_ENV(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENV) -#define DUK_HTHREAD_STRING_ENV(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENV) -#define DUK_STRIDX_HEX 107 /* 'hex' */ -#define DUK_HEAP_STRING_HEX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HEX) -#define DUK_HTHREAD_STRING_HEX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HEX) -#define DUK_STRIDX_BASE64 108 /* 'base64' */ -#define DUK_HEAP_STRING_BASE64(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BASE64) -#define DUK_HTHREAD_STRING_BASE64(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BASE64) -#define DUK_STRIDX_JX 109 /* 'jx' */ -#define DUK_HEAP_STRING_JX(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JX) -#define DUK_HTHREAD_STRING_JX(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JX) -#define DUK_STRIDX_JC 110 /* 'jc' */ -#define DUK_HEAP_STRING_JC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JC) -#define DUK_HTHREAD_STRING_JC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JC) -#define DUK_STRIDX_JSON_EXT_UNDEFINED 111 /* '{"_undef":true}' */ -#define DUK_HEAP_STRING_JSON_EXT_UNDEFINED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_UNDEFINED) -#define DUK_HTHREAD_STRING_JSON_EXT_UNDEFINED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_UNDEFINED) -#define DUK_STRIDX_JSON_EXT_NAN 112 /* '{"_nan":true}' */ -#define DUK_HEAP_STRING_JSON_EXT_NAN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NAN) -#define DUK_HTHREAD_STRING_JSON_EXT_NAN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NAN) -#define DUK_STRIDX_JSON_EXT_POSINF 113 /* '{"_inf":true}' */ -#define DUK_HEAP_STRING_JSON_EXT_POSINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_POSINF) -#define DUK_HTHREAD_STRING_JSON_EXT_POSINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_POSINF) -#define DUK_STRIDX_JSON_EXT_NEGINF 114 /* '{"_ninf":true}' */ -#define DUK_HEAP_STRING_JSON_EXT_NEGINF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NEGINF) -#define DUK_HTHREAD_STRING_JSON_EXT_NEGINF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NEGINF) -#define DUK_STRIDX_JSON_EXT_FUNCTION1 115 /* '{"_func":true}' */ -#define DUK_HEAP_STRING_JSON_EXT_FUNCTION1(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION1) -#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION1(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION1) -#define DUK_STRIDX_JSON_EXT_FUNCTION2 116 /* '{_func:true}' */ -#define DUK_HEAP_STRING_JSON_EXT_FUNCTION2(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION2) -#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION2(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION2) -#define DUK_STRIDX_BREAK 117 /* 'break' */ -#define DUK_HEAP_STRING_BREAK(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BREAK) -#define DUK_HTHREAD_STRING_BREAK(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BREAK) -#define DUK_STRIDX_CASE 118 /* 'case' */ -#define DUK_HEAP_STRING_CASE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CASE) -#define DUK_HTHREAD_STRING_CASE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CASE) -#define DUK_STRIDX_CATCH 119 /* 'catch' */ -#define DUK_HEAP_STRING_CATCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CATCH) -#define DUK_HTHREAD_STRING_CATCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CATCH) -#define DUK_STRIDX_CONTINUE 120 /* 'continue' */ -#define DUK_HEAP_STRING_CONTINUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONTINUE) -#define DUK_HTHREAD_STRING_CONTINUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONTINUE) -#define DUK_STRIDX_DEBUGGER 121 /* 'debugger' */ -#define DUK_HEAP_STRING_DEBUGGER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEBUGGER) -#define DUK_HTHREAD_STRING_DEBUGGER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEBUGGER) -#define DUK_STRIDX_DEFAULT 122 /* 'default' */ -#define DUK_HEAP_STRING_DEFAULT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEFAULT) -#define DUK_HTHREAD_STRING_DEFAULT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEFAULT) -#define DUK_STRIDX_DELETE 123 /* 'delete' */ -#define DUK_HEAP_STRING_DELETE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE) -#define DUK_HTHREAD_STRING_DELETE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE) -#define DUK_STRIDX_DO 124 /* 'do' */ -#define DUK_HEAP_STRING_DO(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DO) -#define DUK_HTHREAD_STRING_DO(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DO) -#define DUK_STRIDX_ELSE 125 /* 'else' */ -#define DUK_HEAP_STRING_ELSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ELSE) -#define DUK_HTHREAD_STRING_ELSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ELSE) -#define DUK_STRIDX_FINALLY 126 /* 'finally' */ -#define DUK_HEAP_STRING_FINALLY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FINALLY) -#define DUK_HTHREAD_STRING_FINALLY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FINALLY) -#define DUK_STRIDX_FOR 127 /* 'for' */ -#define DUK_HEAP_STRING_FOR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FOR) -#define DUK_HTHREAD_STRING_FOR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FOR) -#define DUK_STRIDX_LC_FUNCTION 128 /* 'function' */ -#define DUK_HEAP_STRING_LC_FUNCTION(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_FUNCTION) -#define DUK_HTHREAD_STRING_LC_FUNCTION(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_FUNCTION) -#define DUK_STRIDX_IF 129 /* 'if' */ -#define DUK_HEAP_STRING_IF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IF) -#define DUK_HTHREAD_STRING_IF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IF) -#define DUK_STRIDX_IN 130 /* 'in' */ -#define DUK_HEAP_STRING_IN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IN) -#define DUK_HTHREAD_STRING_IN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IN) -#define DUK_STRIDX_INSTANCEOF 131 /* 'instanceof' */ -#define DUK_HEAP_STRING_INSTANCEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INSTANCEOF) -#define DUK_HTHREAD_STRING_INSTANCEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INSTANCEOF) -#define DUK_STRIDX_NEW 132 /* 'new' */ -#define DUK_HEAP_STRING_NEW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEW) -#define DUK_HTHREAD_STRING_NEW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEW) -#define DUK_STRIDX_RETURN 133 /* 'return' */ -#define DUK_HEAP_STRING_RETURN(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_RETURN) -#define DUK_HTHREAD_STRING_RETURN(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_RETURN) -#define DUK_STRIDX_SWITCH 134 /* 'switch' */ -#define DUK_HEAP_STRING_SWITCH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SWITCH) -#define DUK_HTHREAD_STRING_SWITCH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SWITCH) -#define DUK_STRIDX_THIS 135 /* 'this' */ -#define DUK_HEAP_STRING_THIS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THIS) -#define DUK_HTHREAD_STRING_THIS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THIS) -#define DUK_STRIDX_THROW 136 /* 'throw' */ -#define DUK_HEAP_STRING_THROW(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THROW) -#define DUK_HTHREAD_STRING_THROW(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THROW) -#define DUK_STRIDX_TRY 137 /* 'try' */ -#define DUK_HEAP_STRING_TRY(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRY) -#define DUK_HTHREAD_STRING_TRY(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRY) -#define DUK_STRIDX_TYPEOF 138 /* 'typeof' */ -#define DUK_HEAP_STRING_TYPEOF(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPEOF) -#define DUK_HTHREAD_STRING_TYPEOF(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPEOF) -#define DUK_STRIDX_VAR 139 /* 'var' */ -#define DUK_HEAP_STRING_VAR(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VAR) -#define DUK_HTHREAD_STRING_VAR(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VAR) -#define DUK_STRIDX_CONST 140 /* 'const' */ -#define DUK_HEAP_STRING_CONST(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONST) -#define DUK_HTHREAD_STRING_CONST(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONST) -#define DUK_STRIDX_VOID 141 /* 'void' */ -#define DUK_HEAP_STRING_VOID(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VOID) -#define DUK_HTHREAD_STRING_VOID(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VOID) -#define DUK_STRIDX_WHILE 142 /* 'while' */ -#define DUK_HEAP_STRING_WHILE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WHILE) -#define DUK_HTHREAD_STRING_WHILE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WHILE) -#define DUK_STRIDX_WITH 143 /* 'with' */ -#define DUK_HEAP_STRING_WITH(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WITH) -#define DUK_HTHREAD_STRING_WITH(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WITH) -#define DUK_STRIDX_CLASS 144 /* 'class' */ -#define DUK_HEAP_STRING_CLASS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CLASS) -#define DUK_HTHREAD_STRING_CLASS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CLASS) -#define DUK_STRIDX_ENUM 145 /* 'enum' */ -#define DUK_HEAP_STRING_ENUM(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUM) -#define DUK_HTHREAD_STRING_ENUM(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUM) -#define DUK_STRIDX_EXPORT 146 /* 'export' */ -#define DUK_HEAP_STRING_EXPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXPORT) -#define DUK_HTHREAD_STRING_EXPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXPORT) -#define DUK_STRIDX_EXTENDS 147 /* 'extends' */ -#define DUK_HEAP_STRING_EXTENDS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXTENDS) -#define DUK_HTHREAD_STRING_EXTENDS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXTENDS) -#define DUK_STRIDX_IMPORT 148 /* 'import' */ -#define DUK_HEAP_STRING_IMPORT(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPORT) -#define DUK_HTHREAD_STRING_IMPORT(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPORT) -#define DUK_STRIDX_SUPER 149 /* 'super' */ -#define DUK_HEAP_STRING_SUPER(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SUPER) -#define DUK_HTHREAD_STRING_SUPER(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SUPER) -#define DUK_STRIDX_LC_NULL 150 /* 'null' */ -#define DUK_HEAP_STRING_LC_NULL(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NULL) -#define DUK_HTHREAD_STRING_LC_NULL(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NULL) -#define DUK_STRIDX_TRUE 151 /* 'true' */ -#define DUK_HEAP_STRING_TRUE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRUE) -#define DUK_HTHREAD_STRING_TRUE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRUE) -#define DUK_STRIDX_FALSE 152 /* 'false' */ -#define DUK_HEAP_STRING_FALSE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FALSE) -#define DUK_HTHREAD_STRING_FALSE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FALSE) -#define DUK_STRIDX_IMPLEMENTS 153 /* 'implements' */ -#define DUK_HEAP_STRING_IMPLEMENTS(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPLEMENTS) -#define DUK_HTHREAD_STRING_IMPLEMENTS(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPLEMENTS) -#define DUK_STRIDX_INTERFACE 154 /* 'interface' */ -#define DUK_HEAP_STRING_INTERFACE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INTERFACE) -#define DUK_HTHREAD_STRING_INTERFACE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INTERFACE) -#define DUK_STRIDX_LET 155 /* 'let' */ -#define DUK_HEAP_STRING_LET(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LET) -#define DUK_HTHREAD_STRING_LET(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LET) -#define DUK_STRIDX_PACKAGE 156 /* 'package' */ -#define DUK_HEAP_STRING_PACKAGE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PACKAGE) -#define DUK_HTHREAD_STRING_PACKAGE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PACKAGE) -#define DUK_STRIDX_PRIVATE 157 /* 'private' */ -#define DUK_HEAP_STRING_PRIVATE(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PRIVATE) -#define DUK_HTHREAD_STRING_PRIVATE(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PRIVATE) -#define DUK_STRIDX_PROTECTED 158 /* 'protected' */ -#define DUK_HEAP_STRING_PROTECTED(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTECTED) -#define DUK_HTHREAD_STRING_PROTECTED(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTECTED) -#define DUK_STRIDX_PUBLIC 159 /* 'public' */ -#define DUK_HEAP_STRING_PUBLIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PUBLIC) -#define DUK_HTHREAD_STRING_PUBLIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PUBLIC) -#define DUK_STRIDX_STATIC 160 /* 'static' */ -#define DUK_HEAP_STRING_STATIC(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STATIC) -#define DUK_HTHREAD_STRING_STATIC(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STATIC) -#define DUK_STRIDX_YIELD 161 /* 'yield' */ -#define DUK_HEAP_STRING_YIELD(heap) DUK_HEAP_GET_STRING((heap),DUK_STRIDX_YIELD) -#define DUK_HTHREAD_STRING_YIELD(thr) DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_YIELD) - -#define DUK_HEAP_NUM_STRINGS 162 -#define DUK_STRIDX_START_RESERVED 117 -#define DUK_STRIDX_START_STRICT_RESERVED 153 -#define DUK_STRIDX_END_RESERVED 162 /* exclusive endpoint */ - -/* To convert a heap stridx to a token number, subtract - * DUK_STRIDX_START_RESERVED and add DUK_TOK_START_RESERVED. - */ -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_strings_data[892]; -#endif /* !DUK_SINGLE_FILE */ -#define DUK_STRDATA_MAX_STRLEN 17 -#define DUK_STRDATA_DATA_LENGTH 892 -#endif /* DUK_USE_ROM_STRINGS */ - -#if defined(DUK_USE_ROM_OBJECTS) -#error RAM support not enabled, rerun configure.py with --ram-support -#else /* DUK_USE_ROM_OBJECTS */ -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_constructor_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_type_error_thrower(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_proxy_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_constructor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_eval(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_int(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_float(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_nan(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_finite(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri_component(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri_component(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_escape(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_getprototype_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_setprototype_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_keys_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_assign(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_create(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_property(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_properties(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_extensible(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_value_of(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_has_own_property(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_apply(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_call(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_bind(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_length(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_name(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor_is_array(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_concat(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_pop(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_push(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reverse(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_shift(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_slice(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_sort(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_unshift(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_iter_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_char_code(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_code_point(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_at(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_code_at(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_concat(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_locale_compare(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_match(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_replace(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_search(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_slice(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_split(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substring(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_trim(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_repeat(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_includes(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substr(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_value_of(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_fixed(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_exponential(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_precision(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_exec(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_test(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_tostring(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_flags(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_setter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_setter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_to_string(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_onearg_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_twoarg_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_clz32(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_hypot(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_imul(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_max(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_min(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_random(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_sign(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_parse(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_stringify(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_info(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_act(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_gc(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_enc(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_dec(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_compact(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_yield(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_resume(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_thread_current(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_apply(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_construct(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_delete_property(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_get(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_has(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_set(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_buffer_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_set(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_allocplain(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_plainof(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encode(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_context *ctx); -DUK_INTERNAL_DECL duk_ret_t duk_bi_performance_now(duk_context *ctx); -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_c_function duk_bi_native_functions[176]; -#endif /* !DUK_SINGLE_FILE */ -#define DUK_BIDX_GLOBAL 0 -#define DUK_BIDX_GLOBAL_ENV 1 -#define DUK_BIDX_OBJECT_CONSTRUCTOR 2 -#define DUK_BIDX_OBJECT_PROTOTYPE 3 -#define DUK_BIDX_FUNCTION_CONSTRUCTOR 4 -#define DUK_BIDX_FUNCTION_PROTOTYPE 5 -#define DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE 6 -#define DUK_BIDX_ARRAY_CONSTRUCTOR 7 -#define DUK_BIDX_ARRAY_PROTOTYPE 8 -#define DUK_BIDX_STRING_CONSTRUCTOR 9 -#define DUK_BIDX_STRING_PROTOTYPE 10 -#define DUK_BIDX_BOOLEAN_CONSTRUCTOR 11 -#define DUK_BIDX_BOOLEAN_PROTOTYPE 12 -#define DUK_BIDX_NUMBER_CONSTRUCTOR 13 -#define DUK_BIDX_NUMBER_PROTOTYPE 14 -#define DUK_BIDX_DATE_CONSTRUCTOR 15 -#define DUK_BIDX_DATE_PROTOTYPE 16 -#define DUK_BIDX_REGEXP_CONSTRUCTOR 17 -#define DUK_BIDX_REGEXP_PROTOTYPE 18 -#define DUK_BIDX_ERROR_CONSTRUCTOR 19 -#define DUK_BIDX_ERROR_PROTOTYPE 20 -#define DUK_BIDX_EVAL_ERROR_CONSTRUCTOR 21 -#define DUK_BIDX_EVAL_ERROR_PROTOTYPE 22 -#define DUK_BIDX_RANGE_ERROR_CONSTRUCTOR 23 -#define DUK_BIDX_RANGE_ERROR_PROTOTYPE 24 -#define DUK_BIDX_REFERENCE_ERROR_CONSTRUCTOR 25 -#define DUK_BIDX_REFERENCE_ERROR_PROTOTYPE 26 -#define DUK_BIDX_SYNTAX_ERROR_CONSTRUCTOR 27 -#define DUK_BIDX_SYNTAX_ERROR_PROTOTYPE 28 -#define DUK_BIDX_TYPE_ERROR_CONSTRUCTOR 29 -#define DUK_BIDX_TYPE_ERROR_PROTOTYPE 30 -#define DUK_BIDX_URI_ERROR_CONSTRUCTOR 31 -#define DUK_BIDX_URI_ERROR_PROTOTYPE 32 -#define DUK_BIDX_TYPE_ERROR_THROWER 33 -#define DUK_BIDX_DUKTAPE 34 -#define DUK_BIDX_THREAD_PROTOTYPE 35 -#define DUK_BIDX_POINTER_PROTOTYPE 36 -#define DUK_BIDX_DOUBLE_ERROR 37 -#define DUK_BIDX_SYMBOL_PROTOTYPE 38 -#define DUK_BIDX_ARRAYBUFFER_PROTOTYPE 39 -#define DUK_BIDX_DATAVIEW_PROTOTYPE 40 -#define DUK_BIDX_INT8ARRAY_PROTOTYPE 41 -#define DUK_BIDX_UINT8ARRAY_PROTOTYPE 42 -#define DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE 43 -#define DUK_BIDX_INT16ARRAY_PROTOTYPE 44 -#define DUK_BIDX_UINT16ARRAY_PROTOTYPE 45 -#define DUK_BIDX_INT32ARRAY_PROTOTYPE 46 -#define DUK_BIDX_UINT32ARRAY_PROTOTYPE 47 -#define DUK_BIDX_FLOAT32ARRAY_PROTOTYPE 48 -#define DUK_BIDX_FLOAT64ARRAY_PROTOTYPE 49 -#define DUK_BIDX_NODEJS_BUFFER_PROTOTYPE 50 -#define DUK_NUM_BUILTINS 51 -#define DUK_NUM_BIDX_BUILTINS 51 -#define DUK_NUM_ALL_BUILTINS 76 -#if defined(DUK_USE_DOUBLE_LE) -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; -#endif /* !DUK_SINGLE_FILE */ -#define DUK_BUILTINS_DATA_LENGTH 3972 -#elif defined(DUK_USE_DOUBLE_BE) -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; -#endif /* !DUK_SINGLE_FILE */ -#define DUK_BUILTINS_DATA_LENGTH 3972 -#elif defined(DUK_USE_DOUBLE_ME) -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972]; -#endif /* !DUK_SINGLE_FILE */ -#define DUK_BUILTINS_DATA_LENGTH 3972 -#else -#error invalid endianness defines -#endif -#endif /* DUK_USE_ROM_OBJECTS */ -#endif /* DUK_BUILTINS_H_INCLUDED */ -#line 51 "duk_internal.h" - -/* #include duk_util.h */ -#line 1 "duk_util.h" -/* - * Utilities - */ - -#if !defined(DUK_UTIL_H_INCLUDED) -#define DUK_UTIL_H_INCLUDED - -#if defined(DUK_USE_GET_RANDOM_DOUBLE) -#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) DUK_USE_GET_RANDOM_DOUBLE((thr)->heap_udata) -#else -#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) duk_util_tinyrandom_get_double(thr) -#endif - -/* - * Some useful constants - */ - -#define DUK_DOUBLE_2TO32 4294967296.0 -#define DUK_DOUBLE_2TO31 2147483648.0 -#define DUK_DOUBLE_LOG2E 1.4426950408889634 -#define DUK_DOUBLE_LOG10E 0.4342944819032518 - -/* - * Endian conversion - */ - -#if defined(DUK_USE_INTEGER_LE) -#define DUK_HTON32(x) DUK_BSWAP32((x)) -#define DUK_NTOH32(x) DUK_BSWAP32((x)) -#define DUK_HTON16(x) DUK_BSWAP16((x)) -#define DUK_NTOH16(x) DUK_BSWAP16((x)) -#elif defined(DUK_USE_INTEGER_BE) -#define DUK_HTON32(x) (x) -#define DUK_NTOH32(x) (x) -#define DUK_HTON16(x) (x) -#define DUK_NTOH16(x) (x) -#else -#error internal error, endianness defines broken -#endif - -/* - * Bitstream decoder - */ - -struct duk_bitdecoder_ctx { - const duk_uint8_t *data; - duk_size_t offset; - duk_size_t length; - duk_uint32_t currval; - duk_small_int_t currbits; -}; - -#define DUK_BD_BITPACKED_STRING_MAXLEN 256 - -/* - * Bitstream encoder - */ - -struct duk_bitencoder_ctx { - duk_uint8_t *data; - duk_size_t offset; - duk_size_t length; - duk_uint32_t currval; - duk_small_int_t currbits; - duk_small_int_t truncated; -}; - -/* - * Raw write/read macros for big endian, unaligned basic values. - * Caller ensures there's enough space. The macros update the pointer - * argument automatically on resizes. The idiom seems a bit odd, but - * leads to compact code. - */ - -#define DUK_RAW_WRITE_U8(ptr,val) do { \ - *(ptr)++ = (duk_uint8_t) (val); \ - } while (0) -#define DUK_RAW_WRITE_U16_BE(ptr,val) duk_raw_write_u16_be(&(ptr), (duk_uint16_t) (val)) -#define DUK_RAW_WRITE_U32_BE(ptr,val) duk_raw_write_u32_be(&(ptr), (duk_uint32_t) (val)) -#define DUK_RAW_WRITE_DOUBLE_BE(ptr,val) duk_raw_write_double_be(&(ptr), (duk_double_t) (val)) -#define DUK_RAW_WRITE_XUTF8(ptr,val) do { \ - /* 'ptr' is evaluated both as LHS and RHS. */ \ - duk_uint8_t *duk__ptr; \ - duk_small_int_t duk__len; \ - duk__ptr = (duk_uint8_t *) (ptr); \ - duk__len = duk_unicode_encode_xutf8((duk_ucodepoint_t) (val), duk__ptr); \ - duk__ptr += duk__len; \ - (ptr) = duk__ptr; \ - } while (0) -#define DUK_RAW_WRITE_CESU8(ptr,val) do { \ - /* 'ptr' is evaluated both as LHS and RHS. */ \ - duk_uint8_t *duk__ptr; \ - duk_small_int_t duk__len; \ - duk__ptr = (duk_uint8_t *) (ptr); \ - duk__len = duk_unicode_encode_cesu8((duk_ucodepoint_t) (val), duk__ptr); \ - duk__ptr += duk__len; \ - (ptr) = duk__ptr; \ - } while (0) - -#define DUK_RAW_READ_U8(ptr) ((duk_uint8_t) (*(ptr)++)) -#define DUK_RAW_READ_U16_BE(ptr) duk_raw_read_u16_be(&(ptr)); -#define DUK_RAW_READ_U32_BE(ptr) duk_raw_read_u32_be(&(ptr)); -#define DUK_RAW_READ_DOUBLE_BE(ptr) duk_raw_read_double_be(&(ptr)); - -/* - * Buffer writer (dynamic buffer only) - * - * Helper for writing to a dynamic buffer with a concept of a "slack" area - * to reduce resizes. You can ensure there is enough space beforehand and - * then write for a while without further checks, relying on a stable data - * pointer. Slack handling is automatic so call sites only indicate how - * much data they need right now. - * - * There are several ways to write using bufwriter. The best approach - * depends mainly on how much performance matters over code footprint. - * The key issues are (1) ensuring there is space and (2) keeping the - * pointers consistent. Fast code should ensure space for multiple writes - * with one ensure call. Fastest inner loop code can temporarily borrow - * the 'p' pointer but must write it back eventually. - * - * Be careful to ensure all macro arguments (other than static pointers like - * 'thr' and 'bw_ctx') are evaluated exactly once, using temporaries if - * necessary (if that's not possible, there should be a note near the macro). - * Buffer write arguments often contain arithmetic etc so this is - * particularly important here. - */ - -/* XXX: Migrate bufwriter and other read/write helpers to its own header? */ - -struct duk_bufwriter_ctx { - duk_uint8_t *p; - duk_uint8_t *p_base; - duk_uint8_t *p_limit; - duk_hbuffer_dynamic *buf; -}; - -#if defined(DUK_USE_PREFER_SIZE) -#define DUK_BW_SLACK_ADD 64 -#define DUK_BW_SLACK_SHIFT 4 /* 2^4 -> 1/16 = 6.25% slack */ -#else -#define DUK_BW_SLACK_ADD 64 -#define DUK_BW_SLACK_SHIFT 2 /* 2^2 -> 1/4 = 25% slack */ -#endif - -/* Initialization and finalization (compaction), converting to other types. */ - -#define DUK_BW_INIT_PUSHBUF(thr,bw_ctx,sz) do { \ - duk_bw_init_pushbuf((thr), (bw_ctx), (sz)); \ - } while (0) -#define DUK_BW_INIT_WITHBUF(thr,bw_ctx,buf) do { \ - duk_bw_init((thr), (bw_ctx), (buf)); \ - } while (0) -#define DUK_BW_COMPACT(thr,bw_ctx) do { \ - /* Make underlying buffer compact to match DUK_BW_GET_SIZE(). */ \ - duk_bw_compact((thr), (bw_ctx)); \ - } while (0) -#define DUK_BW_PUSH_AS_STRING(thr,bw_ctx) do { \ - duk_push_lstring((thr), \ - (const char *) (bw_ctx)->p_base, \ - (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \ - } while (0) -/* Pointers may be NULL for a while when 'buf' size is zero and before any - * ENSURE calls have been made. Once an ENSURE has been made, the pointers - * are required to be non-NULL so that it's always valid to use memcpy() and - * memmove(), even for zero size. - */ -#define DUK_BW_ASSERT_VALID_EXPR(thr,bw_ctx) \ - DUK_ASSERT_EXPR((bw_ctx) != NULL && \ - (bw_ctx)->buf != NULL && \ - ((DUK_HBUFFER_DYNAMIC_GET_SIZE((bw_ctx)->buf) == 0) || \ - ((bw_ctx)->p != NULL && \ - (bw_ctx)->p_base != NULL && \ - (bw_ctx)->p_limit != NULL && \ - (bw_ctx)->p_limit >= (bw_ctx)->p_base && \ - (bw_ctx)->p >= (bw_ctx)->p_base && \ - (bw_ctx)->p <= (bw_ctx)->p_limit))) -#define DUK_BW_ASSERT_VALID(thr,bw_ctx) do { \ - DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)); \ - } while (0) - -/* Working with the pointer and current size. */ - -#define DUK_BW_GET_PTR(thr,bw_ctx) \ - ((bw_ctx)->p) -#define DUK_BW_SET_PTR(thr,bw_ctx,ptr) do { \ - (bw_ctx)->p = (ptr); \ - } while (0) -#define DUK_BW_ADD_PTR(thr,bw_ctx,delta) do { \ - (bw_ctx)->p += (delta); \ - } while (0) -#define DUK_BW_GET_BASEPTR(thr,bw_ctx) \ - ((bw_ctx)->p_base) -#define DUK_BW_GET_LIMITPTR(thr,bw_ctx) \ - ((bw_ctx)->p_limit) -#define DUK_BW_GET_SIZE(thr,bw_ctx) \ - ((duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)) -#define DUK_BW_SET_SIZE(thr,bw_ctx,sz) do { \ - DUK_ASSERT((duk_size_t) (sz) <= (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \ - (bw_ctx)->p = (bw_ctx)->p_base + (sz); \ - } while (0) -#define DUK_BW_RESET_SIZE(thr,bw_ctx) do { \ - /* Reset to zero size, keep current limit. */ \ - (bw_ctx)->p = (bw_ctx)->p_base; \ - } while (0) -#define DUK_BW_GET_BUFFER(thr,bw_ctx) \ - ((bw_ctx)->buf) - -/* Ensuring (reserving) space. */ - -#define DUK_BW_ENSURE(thr,bw_ctx,sz) do { \ - duk_size_t duk__sz, duk__space; \ - DUK_BW_ASSERT_VALID((thr), (bw_ctx)); \ - duk__sz = (sz); \ - duk__space = (duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p); \ - if (duk__space < duk__sz) { \ - (void) duk_bw_resize((thr), (bw_ctx), duk__sz); \ - } \ - } while (0) -/* NOTE: Multiple evaluation of 'ptr' in this macro. */ -/* XXX: Rework to use an always-inline function? */ -#define DUK_BW_ENSURE_RAW(thr,bw_ctx,sz,ptr) \ - (((duk_size_t) ((bw_ctx)->p_limit - (ptr)) >= (sz)) ? \ - (ptr) : \ - ((bw_ctx)->p = (ptr), duk_bw_resize((thr),(bw_ctx),(sz)))) -#define DUK_BW_ENSURE_GETPTR(thr,bw_ctx,sz) \ - DUK_BW_ENSURE_RAW((thr), (bw_ctx), (sz), (bw_ctx)->p) -#define DUK_BW_ASSERT_SPACE_EXPR(thr,bw_ctx,sz) \ - (DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)), \ - DUK_ASSERT_EXPR((duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p) >= (duk_size_t) (sz))) -#define DUK_BW_ASSERT_SPACE(thr,bw_ctx,sz) do { \ - DUK_BW_ASSERT_SPACE_EXPR((thr), (bw_ctx), (sz)); \ - } while (0) - -/* Miscellaneous. */ - -#define DUK_BW_SETPTR_AND_COMPACT(thr,bw_ctx,ptr) do { \ - (bw_ctx)->p = (ptr); \ - duk_bw_compact((thr), (bw_ctx)); \ - } while (0) - -/* Fast write calls which assume you control the slack beforehand. - * Multibyte write variants exist and use a temporary write pointer - * because byte writes alias with anything: with a stored pointer - * explicit pointer load/stores get generated (e.g. gcc -Os). - */ - -#define DUK_BW_WRITE_RAW_U8(thr,bw_ctx,val) do { \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 1); \ - *(bw_ctx)->p++ = (duk_uint8_t) (val); \ - } while (0) -#define DUK_BW_WRITE_RAW_U8_2(thr,bw_ctx,val1,val2) do { \ - duk_uint8_t *duk__p; \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 2); \ - duk__p = (bw_ctx)->p; \ - *duk__p++ = (duk_uint8_t) (val1); \ - *duk__p++ = (duk_uint8_t) (val2); \ - (bw_ctx)->p = duk__p; \ - } while (0) -#define DUK_BW_WRITE_RAW_U8_3(thr,bw_ctx,val1,val2,val3) do { \ - duk_uint8_t *duk__p; \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 3); \ - duk__p = (bw_ctx)->p; \ - *duk__p++ = (duk_uint8_t) (val1); \ - *duk__p++ = (duk_uint8_t) (val2); \ - *duk__p++ = (duk_uint8_t) (val3); \ - (bw_ctx)->p = duk__p; \ - } while (0) -#define DUK_BW_WRITE_RAW_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \ - duk_uint8_t *duk__p; \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 4); \ - duk__p = (bw_ctx)->p; \ - *duk__p++ = (duk_uint8_t) (val1); \ - *duk__p++ = (duk_uint8_t) (val2); \ - *duk__p++ = (duk_uint8_t) (val3); \ - *duk__p++ = (duk_uint8_t) (val4); \ - (bw_ctx)->p = duk__p; \ - } while (0) -#define DUK_BW_WRITE_RAW_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \ - duk_uint8_t *duk__p; \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 5); \ - duk__p = (bw_ctx)->p; \ - *duk__p++ = (duk_uint8_t) (val1); \ - *duk__p++ = (duk_uint8_t) (val2); \ - *duk__p++ = (duk_uint8_t) (val3); \ - *duk__p++ = (duk_uint8_t) (val4); \ - *duk__p++ = (duk_uint8_t) (val5); \ - (bw_ctx)->p = duk__p; \ - } while (0) -#define DUK_BW_WRITE_RAW_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \ - duk_uint8_t *duk__p; \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), 6); \ - duk__p = (bw_ctx)->p; \ - *duk__p++ = (duk_uint8_t) (val1); \ - *duk__p++ = (duk_uint8_t) (val2); \ - *duk__p++ = (duk_uint8_t) (val3); \ - *duk__p++ = (duk_uint8_t) (val4); \ - *duk__p++ = (duk_uint8_t) (val5); \ - *duk__p++ = (duk_uint8_t) (val6); \ - (bw_ctx)->p = duk__p; \ - } while (0) -#define DUK_BW_WRITE_RAW_XUTF8(thr,bw_ctx,cp) do { \ - duk_ucodepoint_t duk__cp; \ - duk_small_int_t duk__enc_len; \ - duk__cp = (duk_ucodepoint_t) (cp); \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_xutf8_length(duk__cp)); \ - duk__enc_len = duk_unicode_encode_xutf8(duk__cp, (bw_ctx)->p); \ - (bw_ctx)->p += duk__enc_len; \ - } while (0) -#define DUK_BW_WRITE_RAW_CESU8(thr,bw_ctx,cp) do { \ - duk_ucodepoint_t duk__cp; \ - duk_small_int_t duk__enc_len; \ - duk__cp = (duk_ucodepoint_t) (cp); \ - DUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_cesu8_length(duk__cp)); \ - duk__enc_len = duk_unicode_encode_cesu8(duk__cp, (bw_ctx)->p); \ - (bw_ctx)->p += duk__enc_len; \ - } while (0) -/* XXX: add temporary duk__p pointer here too; sharing */ -#define DUK_BW_WRITE_RAW_BYTES(thr,bw_ctx,valptr,valsz) do { \ - const void *duk__valptr; \ - duk_size_t duk__valsz; \ - duk__valptr = (const void *) (valptr); \ - duk__valsz = (duk_size_t) (valsz); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \ - (bw_ctx)->p += duk__valsz; \ - } while (0) -#define DUK_BW_WRITE_RAW_CSTRING(thr,bw_ctx,val) do { \ - const duk_uint8_t *duk__val; \ - duk_size_t duk__val_len; \ - duk__val = (const duk_uint8_t *) (val); \ - duk__val_len = DUK_STRLEN((const char *) duk__val); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_RAW_HSTRING(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_RAW_HBUFFER(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_RAW_HBUFFER_FIXED(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_RAW_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) - -/* Append bytes from a slice already in the buffer. */ -#define DUK_BW_WRITE_RAW_SLICE(thr,bw,dst_off,dst_len) \ - duk_bw_write_raw_slice((thr), (bw), (dst_off), (dst_len)) - -/* Insert bytes in the middle of the buffer from an external buffer. */ -#define DUK_BW_INSERT_RAW_BYTES(thr,bw,dst_off,buf,len) \ - duk_bw_insert_raw_bytes((thr), (bw), (dst_off), (buf), (len)) - -/* Insert bytes in the middle of the buffer from a slice already - * in the buffer. Source offset is interpreted "before" the operation. - */ -#define DUK_BW_INSERT_RAW_SLICE(thr,bw,dst_off,src_off,len) \ - duk_bw_insert_raw_slice((thr), (bw), (dst_off), (src_off), (len)) - -/* Insert a reserved area somewhere in the buffer; caller fills it. - * Evaluates to a (duk_uint_t *) pointing to the start of the reserved - * area for convenience. - */ -#define DUK_BW_INSERT_RAW_AREA(thr,bw,off,len) \ - duk_bw_insert_raw_area((thr), (bw), (off), (len)) - -/* Remove a slice from inside buffer. */ -#define DUK_BW_REMOVE_RAW_SLICE(thr,bw,off,len) \ - duk_bw_remove_raw_slice((thr), (bw), (off), (len)) - -/* Safe write calls which will ensure space first. */ - -#define DUK_BW_WRITE_ENSURE_U8(thr,bw_ctx,val) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 1); \ - DUK_BW_WRITE_RAW_U8((thr), (bw_ctx), (val)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_U8_2(thr,bw_ctx,val1,val2) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 2); \ - DUK_BW_WRITE_RAW_U8_2((thr), (bw_ctx), (val1), (val2)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_U8_3(thr,bw_ctx,val1,val2,val3) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 3); \ - DUK_BW_WRITE_RAW_U8_3((thr), (bw_ctx), (val1), (val2), (val3)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 4); \ - DUK_BW_WRITE_RAW_U8_4((thr), (bw_ctx), (val1), (val2), (val3), (val4)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 5); \ - DUK_BW_WRITE_RAW_U8_5((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), 6); \ - DUK_BW_WRITE_RAW_U8_6((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5), (val6)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_XUTF8(thr,bw_ctx,cp) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_XUTF8_LENGTH); \ - DUK_BW_WRITE_RAW_XUTF8((thr), (bw_ctx), (cp)); \ - } while (0) -#define DUK_BW_WRITE_ENSURE_CESU8(thr,bw_ctx,cp) do { \ - DUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_CESU8_LENGTH); \ - DUK_BW_WRITE_RAW_CESU8((thr), (bw_ctx), (cp)); \ - } while (0) -/* XXX: add temporary duk__p pointer here too; sharing */ -#define DUK_BW_WRITE_ENSURE_BYTES(thr,bw_ctx,valptr,valsz) do { \ - const void *duk__valptr; \ - duk_size_t duk__valsz; \ - duk__valptr = (const void *) (valptr); \ - duk__valsz = (duk_size_t) (valsz); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__valsz); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \ - (bw_ctx)->p += duk__valsz; \ - } while (0) -#define DUK_BW_WRITE_ENSURE_CSTRING(thr,bw_ctx,val) do { \ - const duk_uint8_t *duk__val; \ - duk_size_t duk__val_len; \ - duk__val = (const duk_uint8_t *) (val); \ - duk__val_len = DUK_STRLEN((const char *) duk__val); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_ENSURE_HSTRING(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_ENSURE_HBUFFER(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_GET_SIZE((val)); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_ENSURE_HBUFFER_FIXED(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) -#define DUK_BW_WRITE_ENSURE_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \ - duk_size_t duk__val_len; \ - duk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \ - DUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \ - DUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \ - (bw_ctx)->p += duk__val_len; \ - } while (0) - -#define DUK_BW_WRITE_ENSURE_SLICE(thr,bw,dst_off,dst_len) \ - duk_bw_write_ensure_slice((thr), (bw), (dst_off), (dst_len)) -#define DUK_BW_INSERT_ENSURE_BYTES(thr,bw,dst_off,buf,len) \ - duk_bw_insert_ensure_bytes((thr), (bw), (dst_off), (buf), (len)) -#define DUK_BW_INSERT_ENSURE_SLICE(thr,bw,dst_off,src_off,len) \ - duk_bw_insert_ensure_slice((thr), (bw), (dst_off), (src_off), (len)) -#define DUK_BW_INSERT_ENSURE_AREA(thr,bw,off,len) \ - /* Evaluates to (duk_uint8_t *) pointing to start of area. */ \ - duk_bw_insert_ensure_area((thr), (bw), (off), (len)) -#define DUK_BW_REMOVE_ENSURE_SLICE(thr,bw,off,len) \ - /* No difference between raw/ensure because the buffer shrinks. */ \ - DUK_BW_REMOVE_RAW_SLICE((thr), (bw), (off), (len)) - -/* - * Externs and prototypes - */ - -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_lc_digits[36]; -DUK_INTERNAL_DECL const duk_uint8_t duk_uc_nybbles[16]; -DUK_INTERNAL_DECL const duk_int8_t duk_hex_dectab[256]; -#if defined(DUK_USE_HEX_FASTPATH) -DUK_INTERNAL_DECL const duk_int16_t duk_hex_dectab_shift4[256]; -DUK_INTERNAL_DECL const duk_uint16_t duk_hex_enctab[256]; -#endif -#if defined(DUK_USE_BASE64_FASTPATH) -DUK_INTERNAL_DECL const duk_uint8_t duk_base64_enctab[64]; -DUK_INTERNAL_DECL const duk_int8_t duk_base64_dectab[256]; -#endif -#endif /* !DUK_SINGLE_FILE */ - -/* Note: assumes that duk_util_probe_steps size is 32 */ -#if defined(DUK_USE_HOBJECT_HASH_PART) -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL duk_uint8_t duk_util_probe_steps[32]; -#endif /* !DUK_SINGLE_FILE */ -#endif - -#if defined(DUK_USE_STRHASH_DENSE) -DUK_INTERNAL_DECL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed); -#endif - -DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits); -DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx); -DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value); -DUK_INTERNAL_DECL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value); -DUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx); -DUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out); - -DUK_INTERNAL_DECL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits); -DUK_INTERNAL_DECL void duk_be_finish(duk_bitencoder_ctx *ctx); - -#if !defined(DUK_USE_GET_RANDOM_DOUBLE) -DUK_INTERNAL_DECL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr); -#endif - -DUK_INTERNAL_DECL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf); -DUK_INTERNAL_DECL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size); -DUK_INTERNAL_DECL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz); -DUK_INTERNAL_DECL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx); -DUK_INTERNAL_DECL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len); -DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); -DUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); -DUK_INTERNAL_DECL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len); -/* No duk_bw_remove_ensure_slice(), functionality would be identical. */ - -DUK_INTERNAL_DECL duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p); -DUK_INTERNAL_DECL duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p); -DUK_INTERNAL_DECL duk_double_t duk_raw_read_double_be(duk_uint8_t **p); -DUK_INTERNAL_DECL void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val); -DUK_INTERNAL_DECL void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val); -DUK_INTERNAL_DECL void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val); - -#if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */ -DUK_INTERNAL_DECL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len); -#endif - -DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival); -DUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_anyinf(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_posinf(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_neginf(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x); -DUK_INTERNAL_DECL duk_small_uint_t duk_double_signbit(duk_double_t x); -DUK_INTERNAL_DECL duk_double_t duk_double_trunc_towards_zero(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y); -DUK_INTERNAL_DECL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y); -DUK_INTERNAL_DECL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y); - -#endif /* DUK_UTIL_H_INCLUDED */ -/* #include duk_strings.h */ -#line 1 "duk_strings.h" -/* - * Shared string macros. - * - * Using shared macros helps minimize strings data size because it's easy - * to check if an existing string could be used. String constants don't - * need to be all defined here; defining a string here makes sense if there's - * a high chance the string could be reused. Also, using macros allows - * a call site express the exact string needed, but the macro may map to an - * approximate string to reduce unique string count. Macros can also be - * more easily tuned for low memory targets than #if defined()s throughout - * the code base. - * - * Because format strings behave differently in the call site (they need to - * be followed by format arguments), they use a special prefix DUK_STR_FMT_. - * - * On some compilers using explicit shared strings is preferable; on others - * it may be better to use straight literals because the compiler will combine - * them anyway, and such strings won't end up unnecessarily in a symbol table. - */ - -#if !defined(DUK_ERRMSG_H_INCLUDED) -#define DUK_ERRMSG_H_INCLUDED - -/* Mostly API and built-in method related */ -#define DUK_STR_INTERNAL_ERROR "internal error" -#define DUK_STR_UNSUPPORTED "unsupported" -#define DUK_STR_INVALID_COUNT "invalid count" -#define DUK_STR_INVALID_ARGS "invalid args" -#define DUK_STR_INVALID_STATE "invalid state" -#define DUK_STR_INVALID_INPUT "invalid input" -#define DUK_STR_INVALID_LENGTH "invalid length" -#define DUK_STR_NOT_CONSTRUCTABLE "not constructable" -#define DUK_STR_CONSTRUCT_ONLY "constructor requires 'new'" -#define DUK_STR_NOT_CALLABLE "not callable" -#define DUK_STR_NOT_EXTENSIBLE "not extensible" -#define DUK_STR_NOT_WRITABLE "not writable" -#define DUK_STR_NOT_CONFIGURABLE "not configurable" -#define DUK_STR_INVALID_CONTEXT "invalid context" -#define DUK_STR_INVALID_INDEX "invalid args" -#define DUK_STR_PUSH_BEYOND_ALLOC_STACK "cannot push beyond allocated stack" -#define DUK_STR_NOT_UNDEFINED "unexpected type" -#define DUK_STR_NOT_NULL "unexpected type" -#define DUK_STR_NOT_BOOLEAN "unexpected type" -#define DUK_STR_NOT_NUMBER "unexpected type" -#define DUK_STR_NOT_STRING "unexpected type" -#define DUK_STR_NOT_OBJECT "unexpected type" -#define DUK_STR_NOT_POINTER "unexpected type" -#define DUK_STR_NOT_BUFFER "not buffer" /* still in use with verbose messages */ -#define DUK_STR_UNEXPECTED_TYPE "unexpected type" -#define DUK_STR_NOT_THREAD "unexpected type" -#define DUK_STR_NOT_COMPFUNC "unexpected type" -#define DUK_STR_NOT_NATFUNC "unexpected type" -#define DUK_STR_NOT_C_FUNCTION "unexpected type" -#define DUK_STR_NOT_FUNCTION "unexpected type" -#define DUK_STR_NOT_REGEXP "unexpected type" -#define DUK_STR_TOPRIMITIVE_FAILED "coercion to primitive failed" -#define DUK_STR_NUMBER_OUTSIDE_RANGE "number outside range" -#define DUK_STR_NOT_OBJECT_COERCIBLE "not object coercible" -#define DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL "cannot number coerce Symbol" -#define DUK_STR_CANNOT_STRING_COERCE_SYMBOL "cannot string coerce Symbol" -#define DUK_STR_STRING_TOO_LONG "string too long" -#define DUK_STR_BUFFER_TOO_LONG "buffer too long" -#define DUK_STR_ALLOC_FAILED "alloc failed" -#define DUK_STR_WRONG_BUFFER_TYPE "wrong buffer type" -#define DUK_STR_BASE64_ENCODE_FAILED "base64 encode failed" -#define DUK_STR_SOURCE_DECODE_FAILED "source decode failed" -#define DUK_STR_UTF8_DECODE_FAILED "utf-8 decode failed" -#define DUK_STR_BASE64_DECODE_FAILED "base64 decode failed" -#define DUK_STR_HEX_DECODE_FAILED "hex decode failed" -#define DUK_STR_INVALID_BYTECODE "invalid bytecode" -#define DUK_STR_NO_SOURCECODE "no sourcecode" -#define DUK_STR_RESULT_TOO_LONG "result too long" -#define DUK_STR_INVALID_CFUNC_RC "invalid C function rc" -#define DUK_STR_INVALID_INSTANCEOF_RVAL "invalid instanceof rval" -#define DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO "instanceof rval has no .prototype" - -/* JSON */ -#define DUK_STR_FMT_PTR "%p" -#define DUK_STR_FMT_INVALID_JSON "invalid json (at offset %ld)" -#define DUK_STR_JSONDEC_RECLIMIT "json decode recursion limit" -#define DUK_STR_JSONENC_RECLIMIT "json encode recursion limit" -#define DUK_STR_CYCLIC_INPUT "cyclic input" - -/* Object property access */ -#define DUK_STR_INVALID_BASE "invalid base value" -#define DUK_STR_STRICT_CALLER_READ "cannot read strict 'caller'" -#define DUK_STR_PROXY_REJECTED "proxy rejected" -#define DUK_STR_INVALID_ARRAY_LENGTH "invalid array length" -#define DUK_STR_SETTER_UNDEFINED "setter undefined" -#define DUK_STR_INVALID_DESCRIPTOR "invalid descriptor" - -/* Proxy */ -#define DUK_STR_PROXY_REVOKED "proxy revoked" -#define DUK_STR_INVALID_TRAP_RESULT "invalid trap result" - -/* Variables */ - -/* Lexer */ -#define DUK_STR_INVALID_ESCAPE "invalid escape" -#define DUK_STR_UNTERMINATED_STRING "unterminated string" -#define DUK_STR_UNTERMINATED_COMMENT "unterminated comment" -#define DUK_STR_UNTERMINATED_REGEXP "unterminated regexp" -#define DUK_STR_TOKEN_LIMIT "token limit" -#define DUK_STR_REGEXP_SUPPORT_DISABLED "regexp support disabled" -#define DUK_STR_INVALID_NUMBER_LITERAL "invalid number literal" -#define DUK_STR_INVALID_TOKEN "invalid token" - -/* Compiler */ -#define DUK_STR_PARSE_ERROR "parse error" -#define DUK_STR_DUPLICATE_LABEL "duplicate label" -#define DUK_STR_INVALID_LABEL "invalid label" -#define DUK_STR_INVALID_ARRAY_LITERAL "invalid array literal" -#define DUK_STR_INVALID_OBJECT_LITERAL "invalid object literal" -#define DUK_STR_INVALID_VAR_DECLARATION "invalid variable declaration" -#define DUK_STR_CANNOT_DELETE_IDENTIFIER "cannot delete identifier" -#define DUK_STR_INVALID_EXPRESSION "invalid expression" -#define DUK_STR_INVALID_LVALUE "invalid lvalue" -#define DUK_STR_INVALID_NEWTARGET "invalid new.target" -#define DUK_STR_EXPECTED_IDENTIFIER "expected identifier" -#define DUK_STR_EMPTY_EXPR_NOT_ALLOWED "empty expression not allowed" -#define DUK_STR_INVALID_FOR "invalid for statement" -#define DUK_STR_INVALID_SWITCH "invalid switch statement" -#define DUK_STR_INVALID_BREAK_CONT_LABEL "invalid break/continue label" -#define DUK_STR_INVALID_RETURN "invalid return" -#define DUK_STR_INVALID_TRY "invalid try" -#define DUK_STR_INVALID_THROW "invalid throw" -#define DUK_STR_WITH_IN_STRICT_MODE "with in strict mode" -#define DUK_STR_FUNC_STMT_NOT_ALLOWED "function statement not allowed" -#define DUK_STR_UNTERMINATED_STMT "unterminated statement" -#define DUK_STR_INVALID_ARG_NAME "invalid argument name" -#define DUK_STR_INVALID_FUNC_NAME "invalid function name" -#define DUK_STR_INVALID_GETSET_NAME "invalid getter/setter name" -#define DUK_STR_FUNC_NAME_REQUIRED "function name required" - -/* RegExp */ -#define DUK_STR_INVALID_QUANTIFIER "invalid regexp quantifier" -#define DUK_STR_INVALID_QUANTIFIER_NO_ATOM "quantifier without preceding atom" -#define DUK_STR_INVALID_QUANTIFIER_VALUES "quantifier values invalid (qmin > qmax)" -#define DUK_STR_QUANTIFIER_TOO_MANY_COPIES "quantifier requires too many atom copies" -#define DUK_STR_UNEXPECTED_CLOSING_PAREN "unexpected closing parenthesis" -#define DUK_STR_UNEXPECTED_END_OF_PATTERN "unexpected end of pattern" -#define DUK_STR_UNEXPECTED_REGEXP_TOKEN "unexpected token in regexp" -#define DUK_STR_INVALID_REGEXP_FLAGS "invalid regexp flags" -#define DUK_STR_INVALID_REGEXP_ESCAPE "invalid regexp escape" -#define DUK_STR_INVALID_BACKREFS "invalid backreference(s)" -#define DUK_STR_INVALID_REGEXP_CHARACTER "invalid regexp character" -#define DUK_STR_INVALID_REGEXP_GROUP "invalid regexp group" -#define DUK_STR_UNTERMINATED_CHARCLASS "unterminated character class" -#define DUK_STR_INVALID_RANGE "invalid range" - -/* Limits */ -#define DUK_STR_VALSTACK_LIMIT "valstack limit" -#define DUK_STR_CALLSTACK_LIMIT "callstack limit" -#define DUK_STR_PROTOTYPE_CHAIN_LIMIT "prototype chain limit" -#define DUK_STR_BOUND_CHAIN_LIMIT "function call bound chain limit" -#define DUK_STR_C_CALLSTACK_LIMIT "C call stack depth limit" -#define DUK_STR_COMPILER_RECURSION_LIMIT "compiler recursion limit" -#define DUK_STR_BYTECODE_LIMIT "bytecode limit" -#define DUK_STR_REG_LIMIT "register limit" -#define DUK_STR_TEMP_LIMIT "temp limit" -#define DUK_STR_CONST_LIMIT "const limit" -#define DUK_STR_FUNC_LIMIT "function limit" -#define DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT "regexp compiler recursion limit" -#define DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT "regexp executor recursion limit" -#define DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT "regexp step limit" - -#endif /* DUK_ERRMSG_H_INCLUDED */ -/* #include duk_js_bytecode.h */ -#line 1 "duk_js_bytecode.h" -/* - * Ecmascript bytecode - */ - -#if !defined(DUK_JS_BYTECODE_H_INCLUDED) -#define DUK_JS_BYTECODE_H_INCLUDED - -/* - * Bytecode instruction layout - * =========================== - * - * Instructions are unsigned 32-bit integers divided as follows: - * - * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! - * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! - * +-----------------------------------------------+---------------+ - * ! C ! B ! A ! OP ! - * +-----------------------------------------------+---------------+ - * - * OP (8 bits): opcode (DUK_OP_*), access should be fastest - * consecutive opcodes allocated when opcode needs flags - * A (8 bits): typically a target register number - * B (8 bits): typically first source register/constant number - * C (8 bits): typically second source register/constant number - * - * Some instructions combine BC or ABC together for larger parameter values. - * Signed integers (e.g. jump offsets) are encoded as unsigned, with an - * opcode specific bias. - * - * Some opcodes have flags which are handled by allocating consecutive - * opcodes to make space for 1-N flags. Flags can also be e.g. in the 'A' - * field when there's room for the specific opcode. - * - * For example, if three flags were needed, they could be allocated from - * the opcode field as follows: - * - * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! - * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! - * +-----------------------------------------------+---------------+ - * ! C ! B ! A ! OP !Z!Y!X! - * +-----------------------------------------------+---------------+ - * - * Some opcodes accept a reg/const argument which is handled by allocating - * flags in the OP field, see DUK_BC_ISREG() and DUK_BC_ISCONST(). The - * following convention is shared by most opcodes, so that the compiler - * can handle reg/const flagging without opcode specific code paths: - * - * !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! ! - * !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0! - * +-----------------------------------------------+---------------+ - * ! C ! B ! A ! OP !Y!X! - * +-----------------------------------------------+---------------+ - * - * X 1=B is const, 0=B is reg - * Y 1=C is const, 0=C is reg - * - * In effect OP, OP + 1, OP + 2, and OP + 3 are allocated from the - * 8-bit opcode space for a single logical opcode. The base opcode - * number should be divisible by 4. If the opcode is called 'FOO' - * the following opcode constants would be defined: - * - * DUK_OP_FOO 100 // base opcode number - * DUK_OP_FOO_RR 100 // FOO, B=reg, C=reg - * DUK_OP_FOO_CR 101 // FOO, B=const, C=reg - * DUK_OP_FOO_RC 102 // FOO, B=reg, C=const - * DUK_OP_FOO_CC 103 // FOO, B=const, C=const - * - * If only B or C is a reg/const, the unused opcode combinations can be - * used for other opcodes (which take no reg/const argument). However, - * such opcode values are initially reserved, at least while opcode space - * is available. For example, if 'BAR' uses B for a register field and - * C is a reg/const: - * - * DUK_OP_BAR 116 // base opcode number - * DUK_OP_BAR_RR 116 // BAR, B=reg, C=reg - * DUK_OP_BAR_CR_UNUSED 117 // unused, could be repurposed - * DUK_OP_BAR_RC 118 // BAR, B=reg, C=const - * DUK_OP_BAR_CC_UNUSED 119 // unused, could be repurposed - * - * Macro naming is a bit misleading, e.g. "ABC" in macro name but the - * field layout is concretely "CBA" in the register. - */ - -typedef duk_uint32_t duk_instr_t; - -#define DUK_BC_SHIFT_OP 0 -#define DUK_BC_SHIFT_A 8 -#define DUK_BC_SHIFT_B 16 -#define DUK_BC_SHIFT_C 24 -#define DUK_BC_SHIFT_BC DUK_BC_SHIFT_B -#define DUK_BC_SHIFT_ABC DUK_BC_SHIFT_A - -#define DUK_BC_UNSHIFTED_MASK_OP 0xffUL -#define DUK_BC_UNSHIFTED_MASK_A 0xffUL -#define DUK_BC_UNSHIFTED_MASK_B 0xffUL -#define DUK_BC_UNSHIFTED_MASK_C 0xffUL -#define DUK_BC_UNSHIFTED_MASK_BC 0xffffUL -#define DUK_BC_UNSHIFTED_MASK_ABC 0xffffffUL - -#define DUK_BC_SHIFTED_MASK_OP (DUK_BC_UNSHIFTED_MASK_OP << DUK_BC_SHIFT_OP) -#define DUK_BC_SHIFTED_MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK_BC_SHIFT_A) -#define DUK_BC_SHIFTED_MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK_BC_SHIFT_B) -#define DUK_BC_SHIFTED_MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK_BC_SHIFT_C) -#define DUK_BC_SHIFTED_MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK_BC_SHIFT_BC) -#define DUK_BC_SHIFTED_MASK_ABC (DUK_BC_UNSHIFTED_MASK_ABC << DUK_BC_SHIFT_ABC) - -#define DUK_DEC_OP(x) ((x) & 0xffUL) -#define DUK_DEC_A(x) (((x) >> 8) & 0xffUL) -#define DUK_DEC_B(x) (((x) >> 16) & 0xffUL) -#define DUK_DEC_C(x) (((x) >> 24) & 0xffUL) -#define DUK_DEC_BC(x) (((x) >> 16) & 0xffffUL) -#define DUK_DEC_ABC(x) (((x) >> 8) & 0xffffffUL) - -#define DUK_ENC_OP(op) ((duk_instr_t) (op)) -#define DUK_ENC_OP_ABC(op,abc) ((duk_instr_t) ( \ - (((duk_instr_t) (abc)) << 8) | \ - ((duk_instr_t) (op)) \ - )) -#define DUK_ENC_OP_A_BC(op,a,bc) ((duk_instr_t) ( \ - (((duk_instr_t) (bc)) << 16) | \ - (((duk_instr_t) (a)) << 8) | \ - ((duk_instr_t) (op)) \ - )) -#define DUK_ENC_OP_A_B_C(op,a,b,c) ((duk_instr_t) ( \ - (((duk_instr_t) (c)) << 24) | \ - (((duk_instr_t) (b)) << 16) | \ - (((duk_instr_t) (a)) << 8) | \ - ((duk_instr_t) (op)) \ - )) -#define DUK_ENC_OP_A_B(op,a,b) DUK_ENC_OP_A_B_C((op),(a),(b),0) -#define DUK_ENC_OP_A(op,a) DUK_ENC_OP_A_B_C((op),(a),0,0) -#define DUK_ENC_OP_BC(op,bc) DUK_ENC_OP_A_BC((op),0,(bc)) - -/* Get opcode base value with B/C reg/const flags cleared. */ -#define DUK_BC_NOREGCONST_OP(op) ((op) & 0xfc) - -/* Constants should be signed so that signed arithmetic involving them - * won't cause values to be coerced accidentally to unsigned. - */ -#define DUK_BC_OP_MIN 0 -#define DUK_BC_OP_MAX 0xffL -#define DUK_BC_A_MIN 0 -#define DUK_BC_A_MAX 0xffL -#define DUK_BC_B_MIN 0 -#define DUK_BC_B_MAX 0xffL -#define DUK_BC_C_MIN 0 -#define DUK_BC_C_MAX 0xffL -#define DUK_BC_BC_MIN 0 -#define DUK_BC_BC_MAX 0xffffL -#define DUK_BC_ABC_MIN 0 -#define DUK_BC_ABC_MAX 0xffffffL - -/* Masks for B/C reg/const indicator in opcode field. */ -#define DUK_BC_REGCONST_B (0x01UL) -#define DUK_BC_REGCONST_C (0x02UL) - -/* Misc. masks for opcode field. */ -#define DUK_BC_INCDECP_FLAG_DEC (0x04UL) -#define DUK_BC_INCDECP_FLAG_POST (0x08UL) - -/* Opcodes. */ -#define DUK_OP_LDREG 0 -#define DUK_OP_STREG 1 -#define DUK_OP_JUMP 2 -#define DUK_OP_LDCONST 3 -#define DUK_OP_LDINT 4 -#define DUK_OP_LDINTX 5 -#define DUK_OP_LDTHIS 6 -#define DUK_OP_LDUNDEF 7 -#define DUK_OP_LDNULL 8 -#define DUK_OP_LDTRUE 9 -#define DUK_OP_LDFALSE 10 -#define DUK_OP_GETVAR 11 -#define DUK_OP_BNOT 12 -#define DUK_OP_LNOT 13 -#define DUK_OP_UNM 14 -#define DUK_OP_UNP 15 -#define DUK_OP_EQ 16 -#define DUK_OP_EQ_RR 16 -#define DUK_OP_EQ_CR 17 -#define DUK_OP_EQ_RC 18 -#define DUK_OP_EQ_CC 19 -#define DUK_OP_NEQ 20 -#define DUK_OP_NEQ_RR 20 -#define DUK_OP_NEQ_CR 21 -#define DUK_OP_NEQ_RC 22 -#define DUK_OP_NEQ_CC 23 -#define DUK_OP_SEQ 24 -#define DUK_OP_SEQ_RR 24 -#define DUK_OP_SEQ_CR 25 -#define DUK_OP_SEQ_RC 26 -#define DUK_OP_SEQ_CC 27 -#define DUK_OP_SNEQ 28 -#define DUK_OP_SNEQ_RR 28 -#define DUK_OP_SNEQ_CR 29 -#define DUK_OP_SNEQ_RC 30 -#define DUK_OP_SNEQ_CC 31 -#define DUK_OP_GT 32 -#define DUK_OP_GT_RR 32 -#define DUK_OP_GT_CR 33 -#define DUK_OP_GT_RC 34 -#define DUK_OP_GT_CC 35 -#define DUK_OP_GE 36 -#define DUK_OP_GE_RR 36 -#define DUK_OP_GE_CR 37 -#define DUK_OP_GE_RC 38 -#define DUK_OP_GE_CC 39 -#define DUK_OP_LT 40 -#define DUK_OP_LT_RR 40 -#define DUK_OP_LT_CR 41 -#define DUK_OP_LT_RC 42 -#define DUK_OP_LT_CC 43 -#define DUK_OP_LE 44 -#define DUK_OP_LE_RR 44 -#define DUK_OP_LE_CR 45 -#define DUK_OP_LE_RC 46 -#define DUK_OP_LE_CC 47 -#define DUK_OP_IFTRUE 48 -#define DUK_OP_IFTRUE_R 48 -#define DUK_OP_IFTRUE_C 49 -#define DUK_OP_IFFALSE 50 -#define DUK_OP_IFFALSE_R 50 -#define DUK_OP_IFFALSE_C 51 -#define DUK_OP_ADD 52 -#define DUK_OP_ADD_RR 52 -#define DUK_OP_ADD_CR 53 -#define DUK_OP_ADD_RC 54 -#define DUK_OP_ADD_CC 55 -#define DUK_OP_SUB 56 -#define DUK_OP_SUB_RR 56 -#define DUK_OP_SUB_CR 57 -#define DUK_OP_SUB_RC 58 -#define DUK_OP_SUB_CC 59 -#define DUK_OP_MUL 60 -#define DUK_OP_MUL_RR 60 -#define DUK_OP_MUL_CR 61 -#define DUK_OP_MUL_RC 62 -#define DUK_OP_MUL_CC 63 -#define DUK_OP_DIV 64 -#define DUK_OP_DIV_RR 64 -#define DUK_OP_DIV_CR 65 -#define DUK_OP_DIV_RC 66 -#define DUK_OP_DIV_CC 67 -#define DUK_OP_MOD 68 -#define DUK_OP_MOD_RR 68 -#define DUK_OP_MOD_CR 69 -#define DUK_OP_MOD_RC 70 -#define DUK_OP_MOD_CC 71 -#define DUK_OP_EXP 72 -#define DUK_OP_EXP_RR 72 -#define DUK_OP_EXP_CR 73 -#define DUK_OP_EXP_RC 74 -#define DUK_OP_EXP_CC 75 -#define DUK_OP_BAND 76 -#define DUK_OP_BAND_RR 76 -#define DUK_OP_BAND_CR 77 -#define DUK_OP_BAND_RC 78 -#define DUK_OP_BAND_CC 79 -#define DUK_OP_BOR 80 -#define DUK_OP_BOR_RR 80 -#define DUK_OP_BOR_CR 81 -#define DUK_OP_BOR_RC 82 -#define DUK_OP_BOR_CC 83 -#define DUK_OP_BXOR 84 -#define DUK_OP_BXOR_RR 84 -#define DUK_OP_BXOR_CR 85 -#define DUK_OP_BXOR_RC 86 -#define DUK_OP_BXOR_CC 87 -#define DUK_OP_BASL 88 -#define DUK_OP_BASL_RR 88 -#define DUK_OP_BASL_CR 89 -#define DUK_OP_BASL_RC 90 -#define DUK_OP_BASL_CC 91 -#define DUK_OP_BLSR 92 -#define DUK_OP_BLSR_RR 92 -#define DUK_OP_BLSR_CR 93 -#define DUK_OP_BLSR_RC 94 -#define DUK_OP_BLSR_CC 95 -#define DUK_OP_BASR 96 -#define DUK_OP_BASR_RR 96 -#define DUK_OP_BASR_CR 97 -#define DUK_OP_BASR_RC 98 -#define DUK_OP_BASR_CC 99 -#define DUK_OP_INSTOF 100 -#define DUK_OP_INSTOF_RR 100 -#define DUK_OP_INSTOF_CR 101 -#define DUK_OP_INSTOF_RC 102 -#define DUK_OP_INSTOF_CC 103 -#define DUK_OP_IN 104 -#define DUK_OP_IN_RR 104 -#define DUK_OP_IN_CR 105 -#define DUK_OP_IN_RC 106 -#define DUK_OP_IN_CC 107 -#define DUK_OP_GETPROP 108 -#define DUK_OP_GETPROP_RR 108 -#define DUK_OP_GETPROP_CR 109 -#define DUK_OP_GETPROP_RC 110 -#define DUK_OP_GETPROP_CC 111 -#define DUK_OP_PUTPROP 112 -#define DUK_OP_PUTPROP_RR 112 -#define DUK_OP_PUTPROP_CR 113 -#define DUK_OP_PUTPROP_RC 114 -#define DUK_OP_PUTPROP_CC 115 -#define DUK_OP_DELPROP 116 -#define DUK_OP_DELPROP_RR 116 -#define DUK_OP_DELPROP_CR_UNUSED 117 /* unused now */ -#define DUK_OP_DELPROP_RC 118 -#define DUK_OP_DELPROP_CC_UNUSED 119 /* unused now */ -#define DUK_OP_PREINCR 120 /* pre/post opcode values have constraints, */ -#define DUK_OP_PREDECR 121 /* see duk_js_executor.c and duk_js_compiler.c. */ -#define DUK_OP_POSTINCR 122 -#define DUK_OP_POSTDECR 123 -#define DUK_OP_PREINCV 124 -#define DUK_OP_PREDECV 125 -#define DUK_OP_POSTINCV 126 -#define DUK_OP_POSTDECV 127 -#define DUK_OP_PREINCP 128 /* pre/post inc/dec prop opcodes have constraints */ -#define DUK_OP_PREINCP_RR 128 -#define DUK_OP_PREINCP_CR 129 -#define DUK_OP_PREINCP_RC 130 -#define DUK_OP_PREINCP_CC 131 -#define DUK_OP_PREDECP 132 -#define DUK_OP_PREDECP_RR 132 -#define DUK_OP_PREDECP_CR 133 -#define DUK_OP_PREDECP_RC 134 -#define DUK_OP_PREDECP_CC 135 -#define DUK_OP_POSTINCP 136 -#define DUK_OP_POSTINCP_RR 136 -#define DUK_OP_POSTINCP_CR 137 -#define DUK_OP_POSTINCP_RC 138 -#define DUK_OP_POSTINCP_CC 139 -#define DUK_OP_POSTDECP 140 -#define DUK_OP_POSTDECP_RR 140 -#define DUK_OP_POSTDECP_CR 141 -#define DUK_OP_POSTDECP_RC 142 -#define DUK_OP_POSTDECP_CC 143 -#define DUK_OP_DECLVAR 144 -#define DUK_OP_DECLVAR_RR 144 -#define DUK_OP_DECLVAR_CR 145 -#define DUK_OP_DECLVAR_RC 146 -#define DUK_OP_DECLVAR_CC 147 -#define DUK_OP_REGEXP 148 -#define DUK_OP_REGEXP_RR 148 -#define DUK_OP_REGEXP_CR 149 -#define DUK_OP_REGEXP_RC 150 -#define DUK_OP_REGEXP_CC 151 -#define DUK_OP_CLOSURE 152 -#define DUK_OP_TYPEOF 153 -#define DUK_OP_TYPEOFID 154 -#define DUK_OP_PUTVAR 155 -#define DUK_OP_DELVAR 156 -#define DUK_OP_RETREG 157 -#define DUK_OP_RETUNDEF 158 -#define DUK_OP_RETCONST 159 -#define DUK_OP_RETCONSTN 160 /* return const without incref (e.g. number) */ -#define DUK_OP_LABEL 161 -#define DUK_OP_ENDLABEL 162 -#define DUK_OP_BREAK 163 -#define DUK_OP_CONTINUE 164 -#define DUK_OP_TRYCATCH 165 -#define DUK_OP_ENDTRY 166 -#define DUK_OP_ENDCATCH 167 -#define DUK_OP_ENDFIN 168 -#define DUK_OP_THROW 169 -#define DUK_OP_INVLHS 170 -#define DUK_OP_CSREG 171 -#define DUK_OP_CSVAR 172 -#define DUK_OP_CSVAR_RR 172 -#define DUK_OP_CSVAR_CR 173 -#define DUK_OP_CSVAR_RC 174 -#define DUK_OP_CSVAR_CC 175 -#define DUK_OP_CALL0 176 /* DUK_OP_CALL0 & 0x0F must be zero. */ -#define DUK_OP_CALL1 177 -#define DUK_OP_CALL2 178 -#define DUK_OP_CALL3 179 -#define DUK_OP_CALL4 180 -#define DUK_OP_CALL5 181 -#define DUK_OP_CALL6 182 -#define DUK_OP_CALL7 183 -#define DUK_OP_CALL8 184 -#define DUK_OP_CALL9 185 -#define DUK_OP_CALL10 186 -#define DUK_OP_CALL11 187 -#define DUK_OP_CALL12 188 -#define DUK_OP_CALL13 189 -#define DUK_OP_CALL14 190 -#define DUK_OP_CALL15 191 -#define DUK_OP_NEWOBJ 192 -#define DUK_OP_NEWARR 193 -#define DUK_OP_MPUTOBJ 194 -#define DUK_OP_MPUTOBJI 195 -#define DUK_OP_INITSET 196 -#define DUK_OP_INITGET 197 -#define DUK_OP_MPUTARR 198 -#define DUK_OP_MPUTARRI 199 -#define DUK_OP_SETALEN 200 -#define DUK_OP_INITENUM 201 -#define DUK_OP_NEXTENUM 202 -#define DUK_OP_NEWTARGET 203 -#define DUK_OP_DEBUGGER 204 -#define DUK_OP_NOP 205 -#define DUK_OP_INVALID 206 -#define DUK_OP_UNUSED207 207 -#define DUK_OP_GETPROPC 208 -#define DUK_OP_GETPROPC_RR 208 -#define DUK_OP_GETPROPC_CR 209 -#define DUK_OP_GETPROPC_RC 210 -#define DUK_OP_GETPROPC_CC 211 -#define DUK_OP_UNUSED212 212 -#define DUK_OP_UNUSED213 213 -#define DUK_OP_UNUSED214 214 -#define DUK_OP_UNUSED215 215 -#define DUK_OP_UNUSED216 216 -#define DUK_OP_UNUSED217 217 -#define DUK_OP_UNUSED218 218 -#define DUK_OP_UNUSED219 219 -#define DUK_OP_UNUSED220 220 -#define DUK_OP_UNUSED221 221 -#define DUK_OP_UNUSED222 222 -#define DUK_OP_UNUSED223 223 -#define DUK_OP_UNUSED224 224 -#define DUK_OP_UNUSED225 225 -#define DUK_OP_UNUSED226 226 -#define DUK_OP_UNUSED227 227 -#define DUK_OP_UNUSED228 228 -#define DUK_OP_UNUSED229 229 -#define DUK_OP_UNUSED230 230 -#define DUK_OP_UNUSED231 231 -#define DUK_OP_UNUSED232 232 -#define DUK_OP_UNUSED233 233 -#define DUK_OP_UNUSED234 234 -#define DUK_OP_UNUSED235 235 -#define DUK_OP_UNUSED236 236 -#define DUK_OP_UNUSED237 237 -#define DUK_OP_UNUSED238 238 -#define DUK_OP_UNUSED239 239 -#define DUK_OP_UNUSED240 240 -#define DUK_OP_UNUSED241 241 -#define DUK_OP_UNUSED242 242 -#define DUK_OP_UNUSED243 243 -#define DUK_OP_UNUSED244 244 -#define DUK_OP_UNUSED245 245 -#define DUK_OP_UNUSED246 246 -#define DUK_OP_UNUSED247 247 -#define DUK_OP_UNUSED248 248 -#define DUK_OP_UNUSED249 249 -#define DUK_OP_UNUSED250 250 -#define DUK_OP_UNUSED251 251 -#define DUK_OP_UNUSED252 252 -#define DUK_OP_UNUSED253 253 -#define DUK_OP_UNUSED254 254 -#define DUK_OP_UNUSED255 255 -#define DUK_OP_NONE 256 /* dummy value used as marker (doesn't fit in 8-bit field) */ - -/* XXX: Allocate flags from opcode field? Would take 16 opcode slots - * but avoids shuffling in more cases. Maybe not worth it. - */ -/* DUK_OP_TRYCATCH flags in A. */ -#define DUK_BC_TRYCATCH_FLAG_HAVE_CATCH (1U << 0) -#define DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY (1U << 1) -#define DUK_BC_TRYCATCH_FLAG_CATCH_BINDING (1U << 2) -#define DUK_BC_TRYCATCH_FLAG_WITH_BINDING (1U << 3) - -/* DUK_OP_DECLVAR flags in A; bottom bits are reserved for propdesc flags - * (DUK_PROPDESC_FLAG_XXX). - */ -#define DUK_BC_DECLVAR_FLAG_FUNC_DECL (1U << 4) /* function declaration */ - -/* DUK_OP_CALLn flags, part of opcode field. Three lowest bits must match - * DUK_CALL_FLAG_xxx directly. - */ -#define DUK_BC_CALL_FLAG_TAILCALL (1U << 0) -#define DUK_BC_CALL_FLAG_CONSTRUCT (1U << 1) -#define DUK_BC_CALL_FLAG_CALLED_AS_EVAL (1U << 2) -#define DUK_BC_CALL_FLAG_INDIRECT (1U << 3) - -/* Misc constants and helper macros. */ -#define DUK_BC_LDINT_BIAS (1L << 15) -#define DUK_BC_LDINTX_SHIFT 16 -#define DUK_BC_JUMP_BIAS (1L << 23) - -#endif /* DUK_JS_BYTECODE_H_INCLUDED */ -/* #include duk_lexer.h */ -#line 1 "duk_lexer.h" -/* - * Lexer defines. - */ - -#if !defined(DUK_LEXER_H_INCLUDED) -#define DUK_LEXER_H_INCLUDED - -typedef void (*duk_re_range_callback)(void *user, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct); - -/* - * A token is interpreted as any possible production of InputElementDiv - * and InputElementRegExp, see E5 Section 7 in its entirety. Note that - * the E5 "Token" production does not cover all actual tokens of the - * language (which is explicitly stated in the specification, Section 7.5). - * Null and boolean literals are defined as part of both ReservedWord - * (E5 Section 7.6.1) and Literal (E5 Section 7.8) productions. Here, - * null and boolean values have literal tokens, and are not reserved - * words. - * - * Decimal literal negative/positive sign is -not- part of DUK_TOK_NUMBER. - * The number tokens always have a non-negative value. The unary minus - * operator in "-1.0" is optimized during compilation to yield a single - * negative constant. - * - * Token numbering is free except that reserved words are required to be - * in a continuous range and in a particular order. See genstrings.py. - */ - -#define DUK_LEXER_INITCTX(ctx) duk_lexer_initctx((ctx)) - -#define DUK_LEXER_SETPOINT(ctx,pt) duk_lexer_setpoint((ctx), (pt)) - -#define DUK_LEXER_GETPOINT(ctx,pt) duk_lexer_getpoint((ctx), (pt)) - -/* Currently 6 characters of lookup are actually needed (duk_lexer.c). */ -#define DUK_LEXER_WINDOW_SIZE 6 -#if defined(DUK_USE_LEXER_SLIDING_WINDOW) -#define DUK_LEXER_BUFFER_SIZE 64 -#endif - -#define DUK_TOK_MINVAL 0 - -/* returned after EOF (infinite amount) */ -#define DUK_TOK_EOF 0 - -/* identifier names (E5 Section 7.6) */ -#define DUK_TOK_IDENTIFIER 1 - -/* reserved words: keywords */ -#define DUK_TOK_START_RESERVED 2 -#define DUK_TOK_BREAK 2 -#define DUK_TOK_CASE 3 -#define DUK_TOK_CATCH 4 -#define DUK_TOK_CONTINUE 5 -#define DUK_TOK_DEBUGGER 6 -#define DUK_TOK_DEFAULT 7 -#define DUK_TOK_DELETE 8 -#define DUK_TOK_DO 9 -#define DUK_TOK_ELSE 10 -#define DUK_TOK_FINALLY 11 -#define DUK_TOK_FOR 12 -#define DUK_TOK_FUNCTION 13 -#define DUK_TOK_IF 14 -#define DUK_TOK_IN 15 -#define DUK_TOK_INSTANCEOF 16 -#define DUK_TOK_NEW 17 -#define DUK_TOK_RETURN 18 -#define DUK_TOK_SWITCH 19 -#define DUK_TOK_THIS 20 -#define DUK_TOK_THROW 21 -#define DUK_TOK_TRY 22 -#define DUK_TOK_TYPEOF 23 -#define DUK_TOK_VAR 24 -#define DUK_TOK_CONST 25 -#define DUK_TOK_VOID 26 -#define DUK_TOK_WHILE 27 -#define DUK_TOK_WITH 28 - -/* reserved words: future reserved words */ -#define DUK_TOK_CLASS 29 -#define DUK_TOK_ENUM 30 -#define DUK_TOK_EXPORT 31 -#define DUK_TOK_EXTENDS 32 -#define DUK_TOK_IMPORT 33 -#define DUK_TOK_SUPER 34 - -/* "null", "true", and "false" are always reserved words. - * Note that "get" and "set" are not! - */ -#define DUK_TOK_NULL 35 -#define DUK_TOK_TRUE 36 -#define DUK_TOK_FALSE 37 - -/* reserved words: additional future reserved words in strict mode */ -#define DUK_TOK_START_STRICT_RESERVED 38 /* inclusive */ -#define DUK_TOK_IMPLEMENTS 38 -#define DUK_TOK_INTERFACE 39 -#define DUK_TOK_LET 40 -#define DUK_TOK_PACKAGE 41 -#define DUK_TOK_PRIVATE 42 -#define DUK_TOK_PROTECTED 43 -#define DUK_TOK_PUBLIC 44 -#define DUK_TOK_STATIC 45 -#define DUK_TOK_YIELD 46 - -#define DUK_TOK_END_RESERVED 47 /* exclusive */ - -/* "get" and "set" are tokens but NOT ReservedWords. They are currently - * parsed and identifiers and these defines are actually now unused. - */ -#define DUK_TOK_GET 47 -#define DUK_TOK_SET 48 - -/* punctuators (unlike the spec, also includes "/" and "/=") */ -#define DUK_TOK_LCURLY 49 -#define DUK_TOK_RCURLY 50 -#define DUK_TOK_LBRACKET 51 -#define DUK_TOK_RBRACKET 52 -#define DUK_TOK_LPAREN 53 -#define DUK_TOK_RPAREN 54 -#define DUK_TOK_PERIOD 55 -#define DUK_TOK_SEMICOLON 56 -#define DUK_TOK_COMMA 57 -#define DUK_TOK_LT 58 -#define DUK_TOK_GT 59 -#define DUK_TOK_LE 60 -#define DUK_TOK_GE 61 -#define DUK_TOK_EQ 62 -#define DUK_TOK_NEQ 63 -#define DUK_TOK_SEQ 64 -#define DUK_TOK_SNEQ 65 -#define DUK_TOK_ADD 66 -#define DUK_TOK_SUB 67 -#define DUK_TOK_MUL 68 -#define DUK_TOK_DIV 69 -#define DUK_TOK_MOD 70 -#define DUK_TOK_EXP 71 -#define DUK_TOK_INCREMENT 72 -#define DUK_TOK_DECREMENT 73 -#define DUK_TOK_ALSHIFT 74 /* named "arithmetic" because result is signed */ -#define DUK_TOK_ARSHIFT 75 -#define DUK_TOK_RSHIFT 76 -#define DUK_TOK_BAND 77 -#define DUK_TOK_BOR 78 -#define DUK_TOK_BXOR 79 -#define DUK_TOK_LNOT 80 -#define DUK_TOK_BNOT 81 -#define DUK_TOK_LAND 82 -#define DUK_TOK_LOR 83 -#define DUK_TOK_QUESTION 84 -#define DUK_TOK_COLON 85 -#define DUK_TOK_EQUALSIGN 86 -#define DUK_TOK_ADD_EQ 87 -#define DUK_TOK_SUB_EQ 88 -#define DUK_TOK_MUL_EQ 89 -#define DUK_TOK_DIV_EQ 90 -#define DUK_TOK_MOD_EQ 91 -#define DUK_TOK_EXP_EQ 92 -#define DUK_TOK_ALSHIFT_EQ 93 -#define DUK_TOK_ARSHIFT_EQ 94 -#define DUK_TOK_RSHIFT_EQ 95 -#define DUK_TOK_BAND_EQ 96 -#define DUK_TOK_BOR_EQ 97 -#define DUK_TOK_BXOR_EQ 98 - -/* literals (E5 Section 7.8), except null, true, false, which are treated - * like reserved words (above). - */ -#define DUK_TOK_NUMBER 99 -#define DUK_TOK_STRING 100 -#define DUK_TOK_REGEXP 101 - -#define DUK_TOK_MAXVAL 101 /* inclusive */ - -#define DUK_TOK_INVALID DUK_SMALL_UINT_MAX - -/* Convert heap string index to a token (reserved words) */ -#define DUK_STRIDX_TO_TOK(x) ((x) - DUK_STRIDX_START_RESERVED + DUK_TOK_START_RESERVED) - -/* Sanity check */ -#if (DUK_TOK_MAXVAL > 255) -#error DUK_TOK_MAXVAL too large, code assumes it fits into 8 bits -#endif - -/* Sanity checks for string and token defines */ -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_BREAK) != DUK_TOK_BREAK) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CASE) != DUK_TOK_CASE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CATCH) != DUK_TOK_CATCH) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONTINUE) != DUK_TOK_CONTINUE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEBUGGER) != DUK_TOK_DEBUGGER) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEFAULT) != DUK_TOK_DEFAULT) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DELETE) != DUK_TOK_DELETE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DO) != DUK_TOK_DO) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ELSE) != DUK_TOK_ELSE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FINALLY) != DUK_TOK_FINALLY) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FOR) != DUK_TOK_FOR) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_FUNCTION) != DUK_TOK_FUNCTION) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IF) != DUK_TOK_IF) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IN) != DUK_TOK_IN) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INSTANCEOF) != DUK_TOK_INSTANCEOF) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_NEW) != DUK_TOK_NEW) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_RETURN) != DUK_TOK_RETURN) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SWITCH) != DUK_TOK_SWITCH) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THIS) != DUK_TOK_THIS) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THROW) != DUK_TOK_THROW) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRY) != DUK_TOK_TRY) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TYPEOF) != DUK_TOK_TYPEOF) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VAR) != DUK_TOK_VAR) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VOID) != DUK_TOK_VOID) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WHILE) != DUK_TOK_WHILE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WITH) != DUK_TOK_WITH) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CLASS) != DUK_TOK_CLASS) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONST) != DUK_TOK_CONST) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ENUM) != DUK_TOK_ENUM) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXPORT) != DUK_TOK_EXPORT) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXTENDS) != DUK_TOK_EXTENDS) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPORT) != DUK_TOK_IMPORT) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SUPER) != DUK_TOK_SUPER) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_NULL) != DUK_TOK_NULL) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRUE) != DUK_TOK_TRUE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FALSE) != DUK_TOK_FALSE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPLEMENTS) != DUK_TOK_IMPLEMENTS) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INTERFACE) != DUK_TOK_INTERFACE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LET) != DUK_TOK_LET) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PACKAGE) != DUK_TOK_PACKAGE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PRIVATE) != DUK_TOK_PRIVATE) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PROTECTED) != DUK_TOK_PROTECTED) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PUBLIC) != DUK_TOK_PUBLIC) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_STATIC) != DUK_TOK_STATIC) -#error mismatch in token defines -#endif -#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_YIELD) != DUK_TOK_YIELD) -#error mismatch in token defines -#endif - -/* Regexp tokens */ -#define DUK_RETOK_EOF 0 -#define DUK_RETOK_DISJUNCTION 1 -#define DUK_RETOK_QUANTIFIER 2 -#define DUK_RETOK_ASSERT_START 3 -#define DUK_RETOK_ASSERT_END 4 -#define DUK_RETOK_ASSERT_WORD_BOUNDARY 5 -#define DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY 6 -#define DUK_RETOK_ASSERT_START_POS_LOOKAHEAD 7 -#define DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD 8 -#define DUK_RETOK_ATOM_PERIOD 9 -#define DUK_RETOK_ATOM_CHAR 10 -#define DUK_RETOK_ATOM_DIGIT 11 /* assumptions in regexp compiler */ -#define DUK_RETOK_ATOM_NOT_DIGIT 12 /* -""- */ -#define DUK_RETOK_ATOM_WHITE 13 /* -""- */ -#define DUK_RETOK_ATOM_NOT_WHITE 14 /* -""- */ -#define DUK_RETOK_ATOM_WORD_CHAR 15 /* -""- */ -#define DUK_RETOK_ATOM_NOT_WORD_CHAR 16 /* -""- */ -#define DUK_RETOK_ATOM_BACKREFERENCE 17 -#define DUK_RETOK_ATOM_START_CAPTURE_GROUP 18 -#define DUK_RETOK_ATOM_START_NONCAPTURE_GROUP 19 -#define DUK_RETOK_ATOM_START_CHARCLASS 20 -#define DUK_RETOK_ATOM_START_CHARCLASS_INVERTED 21 -#define DUK_RETOK_ATOM_END_GROUP 22 - -/* Constants for duk_lexer_ctx.buf. */ -#define DUK_LEXER_TEMP_BUF_LIMIT 256 - -/* A token value. Can be memcpy()'d, but note that slot1/slot2 values are on the valstack. - * Some fields (like num, str1, str2) are only valid for specific token types and may have - * stale values otherwise. - */ -struct duk_token { - duk_small_uint_t t; /* token type (with reserved word identification) */ - duk_small_uint_t t_nores; /* token type (with reserved words as DUK_TOK_IDENTIFER) */ - duk_double_t num; /* numeric value of token */ - duk_hstring *str1; /* string 1 of token (borrowed, stored to ctx->slot1_idx) */ - duk_hstring *str2; /* string 2 of token (borrowed, stored to ctx->slot2_idx) */ - duk_size_t start_offset; /* start byte offset of token in lexer input */ - duk_int_t start_line; /* start line of token (first char) */ - duk_int_t num_escapes; /* number of escapes and line continuations (for directive prologue) */ - duk_bool_t lineterm; /* token was preceded by a lineterm */ - duk_bool_t allow_auto_semi; /* token allows automatic semicolon insertion (eof or preceded by newline) */ -}; - -#define DUK_RE_QUANTIFIER_INFINITE ((duk_uint32_t) 0xffffffffUL) - -/* A regexp token value. */ -struct duk_re_token { - duk_small_uint_t t; /* token type */ - duk_small_uint_t greedy; - duk_uint32_t num; /* numeric value (character, count) */ - duk_uint32_t qmin; - duk_uint32_t qmax; -}; - -/* A structure for 'snapshotting' a point for rewinding */ -struct duk_lexer_point { - duk_size_t offset; - duk_int_t line; -}; - -/* Lexer codepoint with additional info like offset/line number */ -struct duk_lexer_codepoint { - duk_codepoint_t codepoint; - duk_size_t offset; - duk_int_t line; -}; - -/* Lexer context. Same context is used for Ecmascript and Regexp parsing. */ -struct duk_lexer_ctx { -#if defined(DUK_USE_LEXER_SLIDING_WINDOW) - duk_lexer_codepoint *window; /* unicode code points, window[0] is always next, points to 'buffer' */ - duk_lexer_codepoint buffer[DUK_LEXER_BUFFER_SIZE]; -#else - duk_lexer_codepoint window[DUK_LEXER_WINDOW_SIZE]; /* unicode code points, window[0] is always next */ -#endif - - duk_hthread *thr; /* thread; minimizes argument passing */ - - const duk_uint8_t *input; /* input string (may be a user pointer) */ - duk_size_t input_length; /* input byte length */ - duk_size_t input_offset; /* input offset for window leading edge (not window[0]) */ - duk_int_t input_line; /* input linenumber at input_offset (not window[0]), init to 1 */ - - duk_idx_t slot1_idx; /* valstack slot for 1st token value */ - duk_idx_t slot2_idx; /* valstack slot for 2nd token value */ - duk_idx_t buf_idx; /* valstack slot for temp buffer */ - duk_hbuffer_dynamic *buf; /* temp accumulation buffer */ - duk_bufwriter_ctx bw; /* bufwriter for temp accumulation */ - - duk_int_t token_count; /* number of tokens parsed */ - duk_int_t token_limit; /* maximum token count before error (sanity backstop) */ - - duk_small_uint_t flags; /* lexer flags, use compiler flag defines for now */ -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx); - -DUK_INTERNAL_DECL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt); -DUK_INTERNAL_DECL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt); - -DUK_INTERNAL_DECL -void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, - duk_token *out_token, - duk_bool_t strict_mode, - duk_bool_t regexp_mode); -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_INTERNAL_DECL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token); -DUK_INTERNAL_DECL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata); -#endif /* DUK_USE_REGEXP_SUPPORT */ - -#endif /* DUK_LEXER_H_INCLUDED */ -/* #include duk_js_compiler.h */ -#line 1 "duk_js_compiler.h" -/* - * Ecmascript compiler. - */ - -#if !defined(DUK_JS_COMPILER_H_INCLUDED) -#define DUK_JS_COMPILER_H_INCLUDED - -/* ecmascript compiler limits */ -#define DUK_COMPILER_TOKEN_LIMIT 100000000L /* 1e8: protects against deeply nested inner functions */ - -/* maximum loopcount for peephole optimization */ -#define DUK_COMPILER_PEEPHOLE_MAXITER 3 - -/* maximum bytecode length in instructions */ -#define DUK_COMPILER_MAX_BYTECODE_LENGTH (256L * 1024L * 1024L) /* 1 GB */ - -/* - * Compiler intermediate values - * - * Intermediate values describe either plain values (e.g. strings or - * numbers) or binary operations which have not yet been coerced into - * either a left-hand-side or right-hand-side role (e.g. object property). - */ - -#define DUK_IVAL_NONE 0 /* no value */ -#define DUK_IVAL_PLAIN 1 /* register, constant, or value */ -#define DUK_IVAL_ARITH 2 /* binary arithmetic; DUK_OP_ADD, DUK_OP_EQ, other binary ops */ -#define DUK_IVAL_PROP 3 /* property access */ -#define DUK_IVAL_VAR 4 /* variable access */ - -#define DUK_ISPEC_NONE 0 /* no value */ -#define DUK_ISPEC_VALUE 1 /* value resides in 'valstack_idx' */ -#define DUK_ISPEC_REGCONST 2 /* value resides in a register or constant */ - -/* Bit mask which indicates that a regconst is a constant instead of a register. - * Chosen so that when a regconst is cast to duk_int32_t, all consts are - * negative values. - */ -#define DUK_REGCONST_CONST_MARKER DUK_INT32_MIN /* = -0x80000000 */ - -/* Type to represent a reg/const reference during compilation, with <0 - * indicating a constant. Some call sites also use -1 to indicate 'none'. - */ -typedef duk_int32_t duk_regconst_t; - -typedef struct { - duk_small_uint_t t; /* DUK_ISPEC_XXX */ - duk_regconst_t regconst; - duk_idx_t valstack_idx; /* always set; points to a reserved valstack slot */ -} duk_ispec; - -typedef struct { - /* - * PLAIN: x1 - * ARITH: x1 x2 - * PROP: x1.x2 - * VAR: x1 (name) - */ - - /* XXX: can be optimized for smaller footprint esp. on 32-bit environments */ - duk_small_uint_t t; /* DUK_IVAL_XXX */ - duk_small_uint_t op; /* bytecode opcode for binary ops */ - duk_ispec x1; - duk_ispec x2; -} duk_ivalue; - -/* - * Bytecode instruction representation during compilation - * - * Contains the actual instruction and (optionally) debug info. - */ - -struct duk_compiler_instr { - duk_instr_t ins; -#if defined(DUK_USE_PC2LINE) - duk_uint32_t line; -#endif -}; - -/* - * Compiler state - */ - -#define DUK_LABEL_FLAG_ALLOW_BREAK (1U << 0) -#define DUK_LABEL_FLAG_ALLOW_CONTINUE (1U << 1) - -#define DUK_DECL_TYPE_VAR 0 -#define DUK_DECL_TYPE_FUNC 1 - -/* XXX: optimize to 16 bytes */ -typedef struct { - duk_small_uint_t flags; - duk_int_t label_id; /* numeric label_id (-1 reserved as marker) */ - duk_hstring *h_label; /* borrowed label name */ - duk_int_t catch_depth; /* catch depth at point of definition */ - duk_int_t pc_label; /* pc of label statement: - * pc+1: break jump site - * pc+2: continue jump site - */ - - /* Fast jumps (which avoid longjmp) jump directly to the jump sites - * which are always known even while the iteration/switch statement - * is still being parsed. A final peephole pass "straightens out" - * the jumps. - */ -} duk_labelinfo; - -/* Compiling state of one function, eventually converted to duk_hcompfunc */ -struct duk_compiler_func { - /* These pointers are at the start of the struct so that they pack - * nicely. Mixing pointers and integer values is bad on some - * platforms (e.g. if int is 32 bits and pointers are 64 bits). - */ - - duk_bufwriter_ctx bw_code; /* bufwriter for code */ - - duk_hstring *h_name; /* function name (borrowed reference), ends up in _name */ - /* h_code: held in bw_code */ - duk_hobject *h_consts; /* array */ - duk_hobject *h_funcs; /* array of function templates: [func1, offset1, line1, func2, offset2, line2] - * offset/line points to closing brace to allow skipping on pass 2 - */ - duk_hobject *h_decls; /* array of declarations: [ name1, val1, name2, val2, ... ] - * valN = (typeN) | (fnum << 8), where fnum is inner func number (0 for vars) - * record function and variable declarations in pass 1 - */ - duk_hobject *h_labelnames; /* array of active label names */ - duk_hbuffer_dynamic *h_labelinfos; /* C array of duk_labelinfo */ - duk_hobject *h_argnames; /* array of formal argument names (-> _Formals) */ - duk_hobject *h_varmap; /* variable map for pass 2 (identifier -> register number or null (unmapped)) */ - - /* Value stack indices for tracking objects. */ - /* code_idx: not needed */ - duk_idx_t consts_idx; - duk_idx_t funcs_idx; - duk_idx_t decls_idx; - duk_idx_t labelnames_idx; - duk_idx_t labelinfos_idx; - duk_idx_t argnames_idx; - duk_idx_t varmap_idx; - - /* Temp reg handling. */ - duk_regconst_t temp_first; /* first register that is a temporary (below: variables) */ - duk_regconst_t temp_next; /* next temporary register to allocate */ - duk_regconst_t temp_max; /* highest value of temp_reg (temp_max - 1 is highest used reg) */ - - /* Shuffle registers if large number of regs/consts. */ - duk_regconst_t shuffle1; - duk_regconst_t shuffle2; - duk_regconst_t shuffle3; - - /* Stats for current expression being parsed. */ - duk_int_t nud_count; - duk_int_t led_count; - duk_int_t paren_level; /* parenthesis count, 0 = top level */ - duk_bool_t expr_lhs; /* expression is left-hand-side compatible */ - duk_bool_t allow_in; /* current paren level allows 'in' token */ - - /* Misc. */ - duk_int_t stmt_next; /* statement id allocation (running counter) */ - duk_int_t label_next; /* label id allocation (running counter) */ - duk_int_t catch_depth; /* catch stack depth */ - duk_int_t with_depth; /* with stack depth (affects identifier lookups) */ - duk_int_t fnum_next; /* inner function numbering */ - duk_int_t num_formals; /* number of formal arguments */ - duk_regconst_t reg_stmt_value; /* register for writing value of 'non-empty' statements (global or eval code), -1 is marker */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_int_t min_line; /* XXX: typing (duk_hcompfunc has duk_uint32_t) */ - duk_int_t max_line; -#endif - - /* Status booleans. */ - duk_uint8_t is_function; /* is an actual function (not global/eval code) */ - duk_uint8_t is_eval; /* is eval code */ - duk_uint8_t is_global; /* is global code */ - duk_uint8_t is_namebinding; /* needs a name binding */ - duk_uint8_t is_constructable; /* result is constructable */ - duk_uint8_t is_setget; /* is a setter/getter */ - duk_uint8_t is_strict; /* function is strict */ - duk_uint8_t is_notail; /* function must not be tail called */ - duk_uint8_t in_directive_prologue; /* parsing in "directive prologue", recognize directives */ - duk_uint8_t in_scanning; /* parsing in "scanning" phase (first pass) */ - duk_uint8_t may_direct_eval; /* function may call direct eval */ - duk_uint8_t id_access_arguments; /* function refers to 'arguments' identifier */ - duk_uint8_t id_access_slow; /* function makes one or more slow path accesses that won't match own static variables */ - duk_uint8_t id_access_slow_own; /* function makes one or more slow path accesses that may match own static variables */ - duk_uint8_t is_arguments_shadowed; /* argument/function declaration shadows 'arguments' */ - duk_uint8_t needs_shuffle; /* function needs shuffle registers */ - duk_uint8_t reject_regexp_in_adv; /* reject RegExp literal on next advance() call; needed for handling IdentifierName productions */ -}; - -struct duk_compiler_ctx { - duk_hthread *thr; - - /* filename being compiled (ends up in functions' '_filename' property) */ - duk_hstring *h_filename; /* borrowed reference */ - - /* lexing (tokenization) state (contains two valstack slot indices) */ - duk_lexer_ctx lex; - - /* current and previous token for parsing */ - duk_token prev_token; - duk_token curr_token; - duk_idx_t tok11_idx; /* curr_token slot1 (matches 'lex' slot1_idx) */ - duk_idx_t tok12_idx; /* curr_token slot2 (matches 'lex' slot2_idx) */ - duk_idx_t tok21_idx; /* prev_token slot1 */ - duk_idx_t tok22_idx; /* prev_token slot2 */ - - /* recursion limit */ - duk_int_t recursion_depth; - duk_int_t recursion_limit; - - /* code emission temporary */ - duk_int_t emit_jumpslot_pc; - - /* current function being compiled (embedded instead of pointer for more compact access) */ - duk_compiler_func curr_func; -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags); - -#endif /* DUK_JS_COMPILER_H_INCLUDED */ -/* #include duk_regexp.h */ -#line 1 "duk_regexp.h" -/* - * Regular expression structs, constants, and bytecode defines. - */ - -#if !defined(DUK_REGEXP_H_INCLUDED) -#define DUK_REGEXP_H_INCLUDED - -/* maximum bytecode copies for {n,m} quantifiers */ -#define DUK_RE_MAX_ATOM_COPIES 1000 - -/* regexp compilation limits */ -#define DUK_RE_COMPILE_TOKEN_LIMIT 100000000L /* 1e8 */ - -/* regexp execution limits */ -#define DUK_RE_EXECUTE_STEPS_LIMIT 1000000000L /* 1e9 */ - -/* regexp opcodes */ -#define DUK_REOP_MATCH 1 -#define DUK_REOP_CHAR 2 -#define DUK_REOP_PERIOD 3 -#define DUK_REOP_RANGES 4 -#define DUK_REOP_INVRANGES 5 -#define DUK_REOP_JUMP 6 -#define DUK_REOP_SPLIT1 7 -#define DUK_REOP_SPLIT2 8 -#define DUK_REOP_SQMINIMAL 9 -#define DUK_REOP_SQGREEDY 10 -#define DUK_REOP_SAVE 11 -#define DUK_REOP_WIPERANGE 12 -#define DUK_REOP_LOOKPOS 13 -#define DUK_REOP_LOOKNEG 14 -#define DUK_REOP_BACKREFERENCE 15 -#define DUK_REOP_ASSERT_START 16 -#define DUK_REOP_ASSERT_END 17 -#define DUK_REOP_ASSERT_WORD_BOUNDARY 18 -#define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY 19 - -/* flags */ -#define DUK_RE_FLAG_GLOBAL (1U << 0) -#define DUK_RE_FLAG_IGNORE_CASE (1U << 1) -#define DUK_RE_FLAG_MULTILINE (1U << 2) - -struct duk_re_matcher_ctx { - duk_hthread *thr; - - duk_uint32_t re_flags; - const duk_uint8_t *input; - const duk_uint8_t *input_end; - const duk_uint8_t *bytecode; - const duk_uint8_t *bytecode_end; - const duk_uint8_t **saved; /* allocated from valstack (fixed buffer) */ - duk_uint32_t nsaved; - duk_uint32_t recursion_depth; - duk_uint32_t recursion_limit; - duk_uint32_t steps_count; - duk_uint32_t steps_limit; -}; - -struct duk_re_compiler_ctx { - duk_hthread *thr; - - duk_uint32_t re_flags; - duk_lexer_ctx lex; - duk_re_token curr_token; - duk_bufwriter_ctx bw; - duk_uint32_t captures; /* highest capture number emitted so far (used as: ++captures) */ - duk_uint32_t highest_backref; - duk_uint32_t recursion_depth; - duk_uint32_t recursion_limit; - duk_uint32_t nranges; /* internal temporary value, used for char classes */ -}; - -/* - * Prototypes - */ - -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_INTERNAL_DECL void duk_regexp_compile(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_regexp_create_instance(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_regexp_match(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_regexp_match_force_global(duk_hthread *thr); /* hacky helper for String.prototype.split() */ -#endif - -#endif /* DUK_REGEXP_H_INCLUDED */ -/* #include duk_heaphdr.h */ -#line 1 "duk_heaphdr.h" -/* - * Heap header definition and assorted macros, including ref counting. - * Access all fields through the accessor macros. - */ - -#if !defined(DUK_HEAPHDR_H_INCLUDED) -#define DUK_HEAPHDR_H_INCLUDED - -/* - * Common heap header - * - * All heap objects share the same flags and refcount fields. Objects other - * than strings also need to have a single or double linked list pointers - * for insertion into the "heap allocated" list. Strings have single linked - * list pointers for string table chaining. - * - * Technically, 'h_refcount' must be wide enough to guarantee that it cannot - * wrap; otherwise objects might be freed incorrectly after wrapping. The - * default refcount field is 32 bits even on 64-bit systems: while that's in - * theory incorrect, the Duktape heap needs to be larger than 64GB for the - * count to actually wrap (assuming 16-byte duk_tvals). This is very unlikely - * to ever be an issue, but if it is, disabling DUK_USE_REFCOUNT32 causes - * Duktape to use size_t for refcounts which should always be safe. - * - * Heap header size on 32-bit platforms: 8 bytes without reference counting, - * 16 bytes with reference counting. - * - * Note that 'raw' macros such as DUK_HEAPHDR_GET_REFCOUNT() are not - * defined without DUK_USE_REFERENCE_COUNTING, so caller must #if defined() - * around them. - */ - -/* XXX: macro for shared header fields (avoids some padding issues) */ - -struct duk_heaphdr { - duk_uint32_t h_flags; - -#if defined(DUK_USE_REFERENCE_COUNTING) -#if defined(DUK_USE_ASSERTIONS) - /* When assertions enabled, used by mark-and-sweep for refcount - * validation. Largest reasonable type; also detects overflows. - */ - duk_size_t h_assert_refcount; -#endif -#if defined(DUK_USE_REFCOUNT16) - duk_uint16_t h_refcount; -#elif defined(DUK_USE_REFCOUNT32) - duk_uint32_t h_refcount; -#else - duk_size_t h_refcount; -#endif -#endif /* DUK_USE_REFERENCE_COUNTING */ - -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t h_next16; -#else - duk_heaphdr *h_next; -#endif - -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - /* refcounting requires direct heap frees, which in turn requires a dual linked heap */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t h_prev16; -#else - duk_heaphdr *h_prev; -#endif -#endif - - /* When DUK_USE_HEAPPTR16 (and DUK_USE_REFCOUNT16) is in use, the - * struct won't align nicely to 4 bytes. This 16-bit extra field - * is added to make the alignment clean; the field can be used by - * heap objects when 16-bit packing is used. This field is now - * conditional to DUK_USE_HEAPPTR16 only, but it is intended to be - * used with DUK_USE_REFCOUNT16 and DUK_USE_DOUBLE_LINKED_HEAP; - * this only matter to low memory environments anyway. - */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t h_extra16; -#endif -}; - -struct duk_heaphdr_string { - /* 16 bits would be enough for shared heaphdr flags and duk_hstring - * flags. The initial parts of duk_heaphdr_string and duk_heaphdr - * must match so changing the flags field size here would be quite - * awkward. However, to minimize struct size, we can pack at least - * 16 bits of duk_hstring data into the flags field. - */ - duk_uint32_t h_flags; - -#if defined(DUK_USE_REFERENCE_COUNTING) -#if defined(DUK_USE_ASSERTIONS) - /* When assertions enabled, used by mark-and-sweep for refcount - * validation. Largest reasonable type; also detects overflows. - */ - duk_size_t h_assert_refcount; -#endif -#if defined(DUK_USE_REFCOUNT16) - duk_uint16_t h_refcount; - duk_uint16_t h_strextra16; /* round out to 8 bytes */ -#elif defined(DUK_USE_REFCOUNT32) - duk_uint32_t h_refcount; -#else - duk_size_t h_refcount; -#endif -#else - duk_uint16_t h_strextra16; -#endif /* DUK_USE_REFERENCE_COUNTING */ - - duk_hstring *h_next; - /* No 'h_prev' pointer for strings. */ -}; - -#define DUK_HEAPHDR_FLAGS_TYPE_MASK 0x00000003UL -#define DUK_HEAPHDR_FLAGS_FLAG_MASK (~DUK_HEAPHDR_FLAGS_TYPE_MASK) - - /* 2 bits for heap type */ -#define DUK_HEAPHDR_FLAGS_HEAP_START 2 /* 5 heap flags */ -#define DUK_HEAPHDR_FLAGS_USER_START 7 /* 25 user flags */ - -#define DUK_HEAPHDR_HEAP_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_HEAP_START + (n)) -#define DUK_HEAPHDR_USER_FLAG_NUMBER(n) (DUK_HEAPHDR_FLAGS_USER_START + (n)) -#define DUK_HEAPHDR_HEAP_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_HEAP_START + (n))) -#define DUK_HEAPHDR_USER_FLAG(n) (1UL << (DUK_HEAPHDR_FLAGS_USER_START + (n))) - -#define DUK_HEAPHDR_FLAG_REACHABLE DUK_HEAPHDR_HEAP_FLAG(0) /* mark-and-sweep: reachable */ -#define DUK_HEAPHDR_FLAG_TEMPROOT DUK_HEAPHDR_HEAP_FLAG(1) /* mark-and-sweep: children not processed */ -#define DUK_HEAPHDR_FLAG_FINALIZABLE DUK_HEAPHDR_HEAP_FLAG(2) /* mark-and-sweep: finalizable (on current pass) */ -#define DUK_HEAPHDR_FLAG_FINALIZED DUK_HEAPHDR_HEAP_FLAG(3) /* mark-and-sweep: finalized (on previous pass) */ -#define DUK_HEAPHDR_FLAG_READONLY DUK_HEAPHDR_HEAP_FLAG(4) /* read-only object, in code section */ - -#define DUK_HTYPE_MIN 0 -#define DUK_HTYPE_STRING 0 -#define DUK_HTYPE_OBJECT 1 -#define DUK_HTYPE_BUFFER 2 -#define DUK_HTYPE_MAX 2 - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HEAPHDR_GET_NEXT(heap,h) \ - ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_next16)) -#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \ - (h)->h_next16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) val); \ - } while (0) -#else -#define DUK_HEAPHDR_GET_NEXT(heap,h) ((h)->h_next) -#define DUK_HEAPHDR_SET_NEXT(heap,h,val) do { \ - (h)->h_next = (val); \ - } while (0) -#endif - -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HEAPHDR_GET_PREV(heap,h) \ - ((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_prev16)) -#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \ - (h)->h_prev16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (val)); \ - } while (0) -#else -#define DUK_HEAPHDR_GET_PREV(heap,h) ((h)->h_prev) -#define DUK_HEAPHDR_SET_PREV(heap,h,val) do { \ - (h)->h_prev = (val); \ - } while (0) -#endif -#endif - -#if defined(DUK_USE_REFERENCE_COUNTING) -#define DUK_HEAPHDR_GET_REFCOUNT(h) ((h)->h_refcount) -#define DUK_HEAPHDR_SET_REFCOUNT(h,val) do { \ - (h)->h_refcount = (val); \ - DUK_ASSERT((h)->h_refcount == (val)); /* No truncation. */ \ - } while (0) -#define DUK_HEAPHDR_PREINC_REFCOUNT(h) (++(h)->h_refcount) /* result: updated refcount */ -#define DUK_HEAPHDR_PREDEC_REFCOUNT(h) (--(h)->h_refcount) /* result: updated refcount */ -#else -/* refcount macros not defined without refcounting, caller must #if defined() now */ -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* - * Note: type is treated as a field separate from flags, so some masking is - * involved in the macros below. - */ - -#define DUK_HEAPHDR_GET_FLAGS_RAW(h) ((h)->h_flags) -#define DUK_HEAPHDR_SET_FLAGS_RAW(h,val) do { \ - (h)->h_flags = (val); } \ - } -#define DUK_HEAPHDR_GET_FLAGS(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK) -#define DUK_HEAPHDR_SET_FLAGS(h,val) do { \ - (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) | (val); \ - } while (0) -#define DUK_HEAPHDR_GET_TYPE(h) ((h)->h_flags & DUK_HEAPHDR_FLAGS_TYPE_MASK) -#define DUK_HEAPHDR_SET_TYPE(h,val) do { \ - (h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_TYPE_MASK)) | (val); \ - } while (0) - -/* Comparison for type >= DUK_HTYPE_MIN skipped; because DUK_HTYPE_MIN is zero - * and the comparison is unsigned, it's always true and generates warnings. - */ -#define DUK_HEAPHDR_HTYPE_VALID(h) ( \ - DUK_HEAPHDR_GET_TYPE((h)) <= DUK_HTYPE_MAX \ - ) - -#define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h,tval,fval) do { \ - (h)->h_flags = ((tval) & DUK_HEAPHDR_FLAGS_TYPE_MASK) | \ - ((fval) & DUK_HEAPHDR_FLAGS_FLAG_MASK); \ - } while (0) - -#define DUK_HEAPHDR_SET_FLAG_BITS(h,bits) do { \ - DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \ - (h)->h_flags |= (bits); \ - } while (0) - -#define DUK_HEAPHDR_CLEAR_FLAG_BITS(h,bits) do { \ - DUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \ - (h)->h_flags &= ~((bits)); \ - } while (0) - -#define DUK_HEAPHDR_CHECK_FLAG_BITS(h,bits) (((h)->h_flags & (bits)) != 0) - -#define DUK_HEAPHDR_SET_REACHABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) -#define DUK_HEAPHDR_CLEAR_REACHABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) -#define DUK_HEAPHDR_HAS_REACHABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE) - -#define DUK_HEAPHDR_SET_TEMPROOT(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) -#define DUK_HEAPHDR_CLEAR_TEMPROOT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) -#define DUK_HEAPHDR_HAS_TEMPROOT(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT) - -#define DUK_HEAPHDR_SET_FINALIZABLE(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) -#define DUK_HEAPHDR_CLEAR_FINALIZABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) -#define DUK_HEAPHDR_HAS_FINALIZABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE) - -#define DUK_HEAPHDR_SET_FINALIZED(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) -#define DUK_HEAPHDR_CLEAR_FINALIZED(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) -#define DUK_HEAPHDR_HAS_FINALIZED(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED) - -#define DUK_HEAPHDR_SET_READONLY(h) DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) -#define DUK_HEAPHDR_CLEAR_READONLY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) -#define DUK_HEAPHDR_HAS_READONLY(h) DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY) - -/* get or set a range of flags; m=first bit number, n=number of bits */ -#define DUK_HEAPHDR_GET_FLAG_RANGE(h,m,n) (((h)->h_flags >> (m)) & ((1UL << (n)) - 1UL)) - -#define DUK_HEAPHDR_SET_FLAG_RANGE(h,m,n,v) do { \ - (h)->h_flags = \ - ((h)->h_flags & (~(((1UL << (n)) - 1UL) << (m)))) \ - | ((v) << (m)); \ - } while (0) - -/* init pointer fields to null */ -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) -#define DUK_HEAPHDR_INIT_NULLS(h) do { \ - DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \ - DUK_HEAPHDR_SET_PREV((h), (void *) NULL); \ - } while (0) -#else -#define DUK_HEAPHDR_INIT_NULLS(h) do { \ - DUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \ - } while (0) -#endif - -#define DUK_HEAPHDR_STRING_INIT_NULLS(h) do { \ - (h)->h_next = NULL; \ - } while (0) - -/* - * Type tests - */ - -/* Take advantage of the fact that for DUK_HTYPE_xxx numbers the lowest bit - * is only set for DUK_HTYPE_OBJECT (= 1). - */ -#if 0 -#define DUK_HEAPHDR_IS_OBJECT(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_OBJECT) -#endif -#define DUK_HEAPHDR_IS_OBJECT(h) ((h)->h_flags & 0x01UL) -#define DUK_HEAPHDR_IS_STRING(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_STRING) -#define DUK_HEAPHDR_IS_BUFFER(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_BUFFER) - -/* - * Assert helpers - */ - -/* Check that prev/next links are consistent: if e.g. h->prev is != NULL, - * h->prev->next should point back to h. - */ -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_ASSERTIONS) -#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do { \ - if ((h) != NULL) { \ - duk_heaphdr *h__prev, *h__next; \ - h__prev = DUK_HEAPHDR_GET_PREV((heap), (h)); \ - h__next = DUK_HEAPHDR_GET_NEXT((heap), (h)); \ - DUK_ASSERT(h__prev == NULL || (DUK_HEAPHDR_GET_NEXT((heap), h__prev) == (h))); \ - DUK_ASSERT(h__next == NULL || (DUK_HEAPHDR_GET_PREV((heap), h__next) == (h))); \ - } \ - } while (0) -#else -#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do {} while (0) -#endif - -#define DUK_ASSERT_HEAPHDR_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((h))); \ - } while (0) - -#endif /* DUK_HEAPHDR_H_INCLUDED */ -/* #include duk_refcount.h */ -#line 1 "duk_refcount.h" -/* - * Reference counting helper macros. The macros take a thread argument - * and must thus always be executed in a specific thread context. The - * thread argument is not really needed anymore: DECREF can operate with - * a heap pointer only, and INCREF needs neither. - */ - -#if !defined(DUK_REFCOUNT_H_INCLUDED) -#define DUK_REFCOUNT_H_INCLUDED - -#if defined(DUK_USE_REFERENCE_COUNTING) - -#if defined(DUK_USE_ROM_OBJECTS) -/* With ROM objects "needs refcount update" is true when the value is - * heap allocated and is not a ROM object. - */ -/* XXX: double evaluation for 'tv' argument. */ -#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) \ - (DUK_TVAL_IS_HEAP_ALLOCATED((tv)) && !DUK_HEAPHDR_HAS_READONLY(DUK_TVAL_GET_HEAPHDR((tv)))) -#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) (!DUK_HEAPHDR_HAS_READONLY((h))) -#else /* DUK_USE_ROM_OBJECTS */ -/* Without ROM objects "needs refcount update" == is heap allocated. */ -#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) DUK_TVAL_IS_HEAP_ALLOCATED((tv)) -#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 1 -#endif /* DUK_USE_ROM_OBJECTS */ - -/* Fast variants, inline refcount operations except for refzero handling. - * Can be used explicitly when speed is always more important than size. - * For a good compiler and a single file build, these are basically the - * same as a forced inline. - */ -#define DUK_TVAL_INCREF_FAST(thr,tv) do { \ - duk_tval *duk__tv = (tv); \ - DUK_ASSERT(duk__tv != NULL); \ - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ - duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ - DUK_ASSERT(duk__h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ - DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \ - } \ - } while (0) -#define DUK_TVAL_DECREF_FAST(thr,tv) do { \ - duk_tval *duk__tv = (tv); \ - DUK_ASSERT(duk__tv != NULL); \ - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ - duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ - DUK_ASSERT(duk__h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ - if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ - duk_heaphdr_refzero((thr), duk__h); \ - } \ - } \ - } while (0) -#define DUK_TVAL_DECREF_NORZ_FAST(thr,tv) do { \ - duk_tval *duk__tv = (tv); \ - DUK_ASSERT(duk__tv != NULL); \ - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \ - duk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \ - DUK_ASSERT(duk__h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ - if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ - duk_heaphdr_refzero_norz((thr), duk__h); \ - } \ - } \ - } while (0) -#define DUK_HEAPHDR_INCREF_FAST(thr,h) do { \ - duk_heaphdr *duk__h = (duk_heaphdr *) (h); \ - DUK_ASSERT(duk__h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ - if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \ - DUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0); /* No wrapping. */ \ - } \ - } while (0) -#define DUK_HEAPHDR_DECREF_FAST_RAW(thr,h,rzcall,rzcast) do { \ - duk_heaphdr *duk__h = (duk_heaphdr *) (h); \ - DUK_ASSERT(duk__h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \ - if (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \ - if (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \ - (rzcall)((thr), (rzcast) duk__h); \ - } \ - } \ - } while (0) -#define DUK_HEAPHDR_DECREF_FAST(thr,h) \ - DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *) -#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) \ - DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *) - -/* Slow variants, call to a helper to reduce code size. - * Can be used explicitly when size is always more important than speed. - */ -#define DUK_TVAL_INCREF_SLOW(thr,tv) do { duk_tval_incref((tv)); } while (0) -#define DUK_TVAL_DECREF_SLOW(thr,tv) do { duk_tval_decref((thr), (tv)); } while (0) -#define DUK_TVAL_DECREF_NORZ_SLOW(thr,tv) do { duk_tval_decref_norz((thr), (tv)); } while (0) -#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) -#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HSTRING_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) -#define DUK_HSTRING_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HBUFFER_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) -#define DUK_HBUFFER_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HOBJECT_INCREF_SLOW(thr,h) do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0) -#define DUK_HOBJECT_DECREF_SLOW(thr,h) do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0) -#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0) - -/* Default variants. Selection depends on speed/size preference. - * Concretely: with gcc 4.8.1 -Os x64 the difference in final binary - * is about +1kB for _FAST variants. - */ -#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -/* XXX: It would be nice to specialize for specific duk_hobject subtypes - * but current refzero queue handling prevents that. - */ -#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_FAST((thr),(tv)) -#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_FAST((thr),(tv)) -#define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_FAST((thr),(tv)) -#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_FAST((thr),(h)) -#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *) -#define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *) -#define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HSTRING_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *) -#define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *) /* no 'norz' variant */ -#define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HOBJECT_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) -#define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) -#define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HBUFFER_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *) -#define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *) /* no 'norz' variant */ -#define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) -#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) -#define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HNATFUNC_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) -#define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) -#define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HBUFOBJ_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) -#define DUK_HBUFOBJ_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) -#define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HTHREAD_DECREF(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *) -#define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *) -#else -#define DUK_TVAL_INCREF(thr,tv) DUK_TVAL_INCREF_SLOW((thr),(tv)) -#define DUK_TVAL_DECREF(thr,tv) DUK_TVAL_DECREF_SLOW((thr),(tv)) -#define DUK_TVAL_DECREF_NORZ(thr,tv) DUK_TVAL_DECREF_NORZ_SLOW((thr),(tv)) -#define DUK_HEAPHDR_INCREF(thr,h) DUK_HEAPHDR_INCREF_SLOW((thr),(h)) -#define DUK_HEAPHDR_DECREF(thr,h) DUK_HEAPHDR_DECREF_SLOW((thr),(h)) -#define DUK_HEAPHDR_DECREF_NORZ(thr,h) DUK_HEAPHDR_DECREF_NORZ_SLOW((thr),(h)) -#define DUK_HSTRING_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HSTRING_DECREF(thr,h) DUK_HSTRING_DECREF_SLOW((thr),(h)) -#define DUK_HSTRING_DECREF_NORZ(thr,h) DUK_HSTRING_DECREF_NORZ_SLOW((thr),(h)) -#define DUK_HOBJECT_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HOBJECT_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(h)) -#define DUK_HOBJECT_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(h)) -#define DUK_HBUFFER_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h)) -#define DUK_HBUFFER_DECREF(thr,h) DUK_HBUFFER_DECREF_SLOW((thr),(h)) -#define DUK_HBUFFER_DECREF_NORZ(thr,h) DUK_HBUFFER_DECREF_NORZ_SLOW((thr),(h)) -#define DUK_HCOMPFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HCOMPFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HNATFUNC_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HNATFUNC_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HNATFUNC_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HBUFOBJ_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HBUFOBJ_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HBUFOB_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HTHREAD_INCREF(thr,h) DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj) -#define DUK_HTHREAD_DECREF(thr,h) DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj) -#define DUK_HTHREAD_DECREF_NORZ(thr,h) DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj) -#endif - -/* Convenience for some situations; the above macros don't allow NULLs - * for performance reasons. Macros cover only actually needed cases. - */ -#define DUK_HEAPHDR_INCREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HEAPHDR_INCREF((thr), (duk_heaphdr *) (h)); \ - } \ - } while (0) -#define DUK_HEAPHDR_DECREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HEAPHDR_DECREF((thr), (duk_heaphdr *) (h)); \ - } \ - } while (0) -#define DUK_HEAPHDR_DECREF_NORZ_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HEAPHDR_DECREF_NORZ((thr), (duk_heaphdr *) (h)); \ - } \ - } while (0) -#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HOBJECT_INCREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HOBJECT_DECREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HOBJECT_DECREF_NORZ((thr), (h)); \ - } \ - } while (0) -#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HBUFFER_INCREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HBUFFER_DECREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HBUFFER_DECREF_NORZ((thr), (h)); \ - } \ - } while (0) -#define DUK_HTHREAD_INCREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HTHREAD_INCREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HTHREAD_DECREF_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HTHREAD_DECREF((thr), (h)); \ - } \ - } while (0) -#define DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr,h) do { \ - if ((h) != NULL) { \ - DUK_HTHREAD_DECREF_NORZ((thr), (h)); \ - } \ - } while (0) - -/* Called after one or more DECREF NORZ calls to handle pending side effects. - * At present DECREF NORZ does freeing inline but doesn't execute finalizers, - * so these macros check for pending finalizers and execute them. The FAST - * variant is performance critical. - */ -#if defined(DUK_USE_FINALIZER_SUPPORT) -#define DUK_REFZERO_CHECK_FAST(thr) do { \ - duk_refzero_check_fast((thr)); \ - } while (0) -#define DUK_REFZERO_CHECK_SLOW(thr) do { \ - duk_refzero_check_slow((thr)); \ - } while (0) -#else /* DUK_USE_FINALIZER_SUPPORT */ -#define DUK_REFZERO_CHECK_FAST(thr) do { } while (0) -#define DUK_REFZERO_CHECK_SLOW(thr) do { } while (0) -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -/* - * Macros to set a duk_tval and update refcount of the target (decref the - * old value and incref the new value if necessary). This is both performance - * and footprint critical; any changes made should be measured for size/speed. - */ - -#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_UNDEFINED(tv__dst); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_UNDEFINED(tv__dst); \ - DUK_TVAL_DECREF_NORZ((thr), &tv__tmp); \ - } while (0) - -#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_UNUSED(tv__dst); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_NULL(tv__dst); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_NAN(tv__dst); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_I48(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_I32(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_U32(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) -#else -#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \ - DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval)) -#endif /* DUK_USE_FASTINT */ - -#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_STRING(tv__dst, (newval)); \ - DUK_HSTRING_INCREF((thr), (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \ - DUK_HOBJECT_INCREF((thr), (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \ - DUK_HBUFFER_INCREF((thr), (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_POINTER(tv__dst, (newval)); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -/* DUK_TVAL_SET_TVAL_UPDREF() is used a lot in executor, property lookups, - * etc, so it's very important for performance. Measure when changing. - * - * NOTE: the source and destination duk_tval pointers may be the same, and - * the macros MUST deal with that correctly. - */ - -/* Original idiom used, minimal code size. */ -#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \ - duk_tval *tv__dst, *tv__src; duk_tval tv__tmp; \ - tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ - DUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \ - DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ - DUK_TVAL_INCREF((thr), tv__src); \ - DUK_TVAL_DECREF((thr), &tv__tmp); /* side effects */ \ - } while (0) - -/* Faster alternative: avoid making a temporary copy of tvptr_dst and use - * fast incref/decref macros. - */ -#define DUK_TVAL_SET_TVAL_UPDREF_ALT1(thr,tvptr_dst,tvptr_src) do { \ - duk_tval *tv__dst, *tv__src; duk_heaphdr *h__obj; \ - tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ - DUK_TVAL_INCREF_FAST((thr), tv__src); \ - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv__dst)) { \ - h__obj = DUK_TVAL_GET_HEAPHDR(tv__dst); \ - DUK_ASSERT(h__obj != NULL); \ - DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ - DUK_HEAPHDR_DECREF_FAST((thr), h__obj); /* side effects */ \ - } else { \ - DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ - } \ - } while (0) - -/* XXX: no optimized variants yet */ -#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 -#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0 -#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0 -#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0 -#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0 -#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0 -#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0 -#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0 -#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0 -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0 -#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0 -#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0 -#else -#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast int-to-double */ -#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF -#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF -#endif /* DUK_USE_FASTINT */ -#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */ -#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0 -#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0 -#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0 -#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0 -#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0 - -#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -/* Optimized for speed. */ -#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT1 -#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT1 -#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#else -/* Optimized for size. */ -#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#endif - -#else /* DUK_USE_REFERENCE_COUNTING */ - -#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) 0 -#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h) 0 - -#define DUK_TVAL_INCREF_FAST(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF_FAST(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF_NORZ_FAST(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_INCREF_SLOW(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF_SLOW(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF_NORZ_SLOW(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_INCREF(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF(thr,v) do {} while (0) /* nop */ -#define DUK_TVAL_DECREF_NORZ(thr,v) do {} while (0) /* nop */ -#define DUK_HEAPHDR_INCREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_INCREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HEAPHDR_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_INCREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_INCREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HSTRING_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_INCREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_INCREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_INCREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_NORZ_FAST(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_INCREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_NORZ(thr,h) do {} while (0) /* nop */ - -#define DUK_HCOMPFUNC_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HCOMPFUNC_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HNATFUNC_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HNATFUNC_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HNATFUNC_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFOBJ_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFOBJ_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFOBJ_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HTHREAD_INCREF(thr,h) do {} while (0) /* nop */ -#define DUK_HTHREAD_DECREF(thr,h) do {} while (0) /* nop */ -#define DUK_HTHREAD_DECREF_NORZ(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ -#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do {} while (0) /* nop */ -#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do {} while (0) /* nop */ - -#define DUK_REFZERO_CHECK_FAST(thr) do {} while (0) /* nop */ -#define DUK_REFZERO_CHECK_SLOW(thr) do {} while (0) /* nop */ - -#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_UNDEFINED(tv__dst); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_UNUSED(tv__dst); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_NULL(tv__dst); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_NUMBER(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_NAN(tv__dst); \ - DUK_UNREF((thr)); \ - } while (0) -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_I48(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_I32(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_U32(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) -#else -#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \ - DUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval)) -#endif /* DUK_USE_FASTINT */ - -#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_STRING(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_OBJECT(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_BUFFER(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \ - duk_tval *tv__dst; tv__dst = (tvptr_dst); \ - DUK_TVAL_SET_POINTER(tv__dst, (newval)); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \ - duk_tval *tv__dst, *tv__src; \ - tv__dst = (tvptr_dst); tv__src = (tvptr_src); \ - DUK_TVAL_SET_TVAL(tv__dst, tv__src); \ - DUK_UNREF((thr)); \ - } while (0) - -#define DUK_TVAL_SET_UNDEFINED_UPDREF DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 -#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0 -#define DUK_TVAL_SET_UNUSED_UPDREF DUK_TVAL_SET_UNUSED_UPDREF_ALT0 -#define DUK_TVAL_SET_NULL_UPDREF DUK_TVAL_SET_NULL_UPDREF_ALT0 -#define DUK_TVAL_SET_BOOLEAN_UPDREF DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0 -#define DUK_TVAL_SET_NUMBER_UPDREF DUK_TVAL_SET_NUMBER_UPDREF_ALT0 -#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0 -#define DUK_TVAL_SET_DOUBLE_UPDREF DUK_TVAL_SET_DOUBLE_UPDREF_ALT0 -#define DUK_TVAL_SET_NAN_UPDREF DUK_TVAL_SET_NAN_UPDREF_ALT0 -#if defined(DUK_USE_FASTINT) -#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_I48_UPDREF_ALT0 -#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_I32_UPDREF_ALT0 -#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_U32_UPDREF_ALT0 -#else -#define DUK_TVAL_SET_I48_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF /* XXX: fast-int-to-double */ -#define DUK_TVAL_SET_I32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF -#define DUK_TVAL_SET_U32_UPDREF DUK_TVAL_SET_DOUBLE_CAST_UPDREF -#endif /* DUK_USE_FASTINT */ -#define DUK_TVAL_SET_FASTINT_UPDREF DUK_TVAL_SET_I48_UPDREF /* convenience */ -#define DUK_TVAL_SET_LIGHTFUNC_UPDREF DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0 -#define DUK_TVAL_SET_STRING_UPDREF DUK_TVAL_SET_STRING_UPDREF_ALT0 -#define DUK_TVAL_SET_OBJECT_UPDREF DUK_TVAL_SET_OBJECT_UPDREF_ALT0 -#define DUK_TVAL_SET_BUFFER_UPDREF DUK_TVAL_SET_BUFFER_UPDREF_ALT0 -#define DUK_TVAL_SET_POINTER_UPDREF DUK_TVAL_SET_POINTER_UPDREF_ALT0 - -#define DUK_TVAL_SET_TVAL_UPDREF DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#define DUK_TVAL_SET_TVAL_UPDREF_FAST DUK_TVAL_SET_TVAL_UPDREF_ALT0 -#define DUK_TVAL_SET_TVAL_UPDREF_SLOW DUK_TVAL_SET_TVAL_UPDREF_ALT0 - -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* - * Some convenience macros that don't have optimized implementations now. - */ - -#define DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr,tv_dst,tv_src) do { \ - duk_hthread *duk__thr = (thr); \ - duk_tval *duk__dst = (tv_dst); \ - duk_tval *duk__src = (tv_src); \ - DUK_UNREF(duk__thr); \ - DUK_TVAL_DECREF_NORZ(thr, duk__dst); \ - DUK_TVAL_SET_TVAL(duk__dst, duk__src); \ - DUK_TVAL_INCREF(thr, duk__dst); \ - } while (0) - -#define DUK_TVAL_SET_U32_UPDREF_NORZ(thr,tv_dst,val) do { \ - duk_hthread *duk__thr = (thr); \ - duk_tval *duk__dst = (tv_dst); \ - duk_uint32_t duk__val = (duk_uint32_t) (val); \ - DUK_UNREF(duk__thr); \ - DUK_TVAL_DECREF_NORZ(thr, duk__dst); \ - DUK_TVAL_SET_U32(duk__dst, duk__val); \ - } while (0) - -/* - * Prototypes - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL_DECL void duk_refzero_check_slow(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_refzero_check_fast(duk_hthread *thr); -#endif -DUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr); -DUK_INTERNAL_DECL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h); -#if 0 /* Not needed: fast path handles inline; slow path uses duk_heaphdr_decref() which is needed anyway. */ -DUK_INTERNAL_DECL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h); -DUK_INTERNAL_DECL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h); -DUK_INTERNAL_DECL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h); -DUK_INTERNAL_DECL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h); -DUK_INTERNAL_DECL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h); -DUK_INTERNAL_DECL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h); -#endif -DUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h); -#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -DUK_INTERNAL_DECL void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h); /* no 'norz' variant */ -DUK_INTERNAL_DECL void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h); /* no 'norz' variant */ -DUK_INTERNAL_DECL void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h); -DUK_INTERNAL_DECL void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h); -#else -DUK_INTERNAL_DECL void duk_tval_incref(duk_tval *tv); -DUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL void duk_heaphdr_incref(duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h); -DUK_INTERNAL_DECL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h); -#endif -#else /* DUK_USE_REFERENCE_COUNTING */ -/* no refcounting */ -#endif /* DUK_USE_REFERENCE_COUNTING */ - -#endif /* DUK_REFCOUNT_H_INCLUDED */ -/* #include duk_api_internal.h */ -#line 1 "duk_api_internal.h" -/* - * Internal API calls which have (stack and other) semantics similar - * to the public API. - */ - -#if !defined(DUK_API_INTERNAL_H_INCLUDED) -#define DUK_API_INTERNAL_H_INCLUDED - -#define DUK_INTERNAL_SYMBOL(x) ("\x82" x) - -/* duk_push_sprintf constants */ -#define DUK_PUSH_SPRINTF_INITIAL_SIZE 256L -#define DUK_PUSH_SPRINTF_SANITY_LIMIT (1L * 1024L * 1024L * 1024L) - -/* Flag ORed to err_code to indicate __FILE__ / __LINE__ is not - * blamed as source of error for error fileName / lineNumber. - */ -#define DUK_ERRCODE_FLAG_NOBLAME_FILELINE (1L << 24) - -/* Current convention is to use duk_size_t for value stack sizes and global indices, - * and duk_idx_t for local frame indices. - */ -DUK_INTERNAL_DECL void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes); -DUK_INTERNAL_DECL duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes); -DUK_INTERNAL_DECL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug); - -DUK_INTERNAL_DECL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count); - -DUK_INTERNAL_DECL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count); - -DUK_INTERNAL_DECL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start); - -DUK_INTERNAL_DECL void duk_dup_0(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_dup_1(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_dup_2(duk_hthread *thr); -/* duk_dup_m1() would be same as duk_dup_top() */ -DUK_INTERNAL_DECL void duk_dup_m2(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_dup_m3(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_dup_m4(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL void duk_remove_m2(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); -DUK_INTERNAL_DECL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); - -DUK_INTERNAL_DECL duk_int_t duk_get_type_tval(duk_tval *tv); -DUK_INTERNAL_DECL duk_uint_t duk_get_type_mask_tval(duk_tval *tv); - -#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS) -DUK_INTERNAL_DECL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx); -#endif -DUK_INTERNAL_DECL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL void duk_push_tval(duk_hthread *thr, duk_tval *tv); - -/* Push the current 'this' binding; throw TypeError if binding is not object - * coercible (CheckObjectCoercible). - */ -DUK_INTERNAL_DECL void duk_push_this_check_object_coercible(duk_hthread *thr); - -/* duk_push_this() + CheckObjectCoercible() + duk_to_object() */ -DUK_INTERNAL_DECL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr); - -/* duk_push_this() + CheckObjectCoercible() + duk_to_string() */ -DUK_INTERNAL_DECL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr); - -DUK_INTERNAL_DECL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i); - -/* Get a borrowed duk_tval pointer to the current 'this' binding. Caller must - * make sure there's an active callstack entry. Note that the returned pointer - * is unstable with regards to side effects. - */ -DUK_INTERNAL_DECL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr); - -/* XXX: add fastint support? */ -#define duk_push_u64(thr,val) \ - duk_push_number((thr), (duk_double_t) (val)) -#define duk_push_i64(thr,val) \ - duk_push_number((thr), (duk_double_t) (val)) - -/* duk_push_(u)int() is guaranteed to support at least (un)signed 32-bit range */ -#define duk_push_u32(thr,val) \ - duk_push_uint((thr), (duk_uint_t) (val)) -#define duk_push_i32(thr,val) \ - duk_push_int((thr), (duk_int_t) (val)) - -/* sometimes stack and array indices need to go on the stack */ -#define duk_push_idx(thr,val) \ - duk_push_int((thr), (duk_int_t) (val)) -#define duk_push_uarridx(thr,val) \ - duk_push_uint((thr), (duk_uint_t) (val)) -#define duk_push_size_t(thr,val) \ - duk_push_uint((thr), (duk_uint_t) (val)) /* XXX: assumed to fit for now */ - -DUK_INTERNAL_DECL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv); - -DUK_INTERNAL_DECL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len, duk_bool_t throw_flag, duk_bool_t *out_isbuffer); - -DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum); - -DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); -DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); -DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask); -#define duk_require_hobject_promote_lfunc(thr,idx) \ - duk_require_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC) -#define duk_get_hobject_promote_lfunc(thr,idx) \ - duk_get_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC) - -#if 0 /*unused*/ -DUK_INTERNAL_DECL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx); -#endif - -DUK_INTERNAL_DECL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv); - -DUK_INTERNAL_DECL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_m1(duk_hthread *thr); -DUK_INTERNAL_DECL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_double_t duk_to_number_m1(duk_hthread *thr); -DUK_INTERNAL_DECL duk_double_t duk_to_number_m2(duk_hthread *thr); - -#if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */ -DUK_INTERNAL_DECL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx); -#endif -DUK_INTERNAL_DECL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv); - -DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped); /* out_clamped=NULL, RangeError if outside range */ -DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval); -DUK_INTERNAL_DECL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL_DECL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx); -#endif -DUK_INTERNAL_DECL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len); -DUK_INTERNAL_DECL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx); - -DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum); - -DUK_INTERNAL_DECL void duk_push_hstring(duk_hthread *thr, duk_hstring *h); -DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx); -DUK_INTERNAL_DECL void duk_push_hstring_empty(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_push_hobject(duk_hthread *thr, duk_hobject *h); -DUK_INTERNAL_DECL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h); -#define duk_push_hthread(thr,h) \ - duk_push_hobject((thr), (duk_hobject *) (h)) -#define duk_push_hnatfunc(thr,h) \ - duk_push_hobject((thr), (duk_hobject *) (h)) -DUK_INTERNAL_DECL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx); -DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); -DUK_INTERNAL_DECL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto); -DUK_INTERNAL_DECL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr); -DUK_INTERNAL_DECL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs); -DUK_INTERNAL_DECL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs); - -/* XXX: duk_push_harray() and duk_push_hcompfunc() are inconsistent with - * duk_push_hobject() etc which don't create a new value. - */ -DUK_INTERNAL_DECL duk_harray *duk_push_harray(duk_hthread *thr); -DUK_INTERNAL_DECL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size); -DUK_INTERNAL_DECL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size); - -DUK_INTERNAL_DECL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz); -DUK_INTERNAL_DECL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags); -DUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv); -#if 0 /* not used yet */ -DUK_INTERNAL_DECL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h); -#endif -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL_DECL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); -#endif - -DUK_INTERNAL_DECL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len); -DUK_INTERNAL_DECL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len); - -DUK_INTERNAL_DECL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv); - -/* The duk_xxx_prop_stridx_short() variants expect their arguments to be short - * enough to be packed into a single 32-bit integer argument. Argument limits - * vary per call; typically 16 bits are assigned to the signed value stack index - * and the stridx. In practice these work well for footprint with constant - * arguments and such call sites are also easiest to verify to be correct. - */ - -DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [val] */ -DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); -#define duk_get_prop_stridx_short(thr,obj_idx,stridx) \ - (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \ - DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ - duk_get_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) -DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop); /* [] -> [] */ - -DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [val] -> [] */ -DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); -#define duk_put_prop_stridx_short(thr,obj_idx,stridx) \ - (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \ - DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ - duk_put_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) - -DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ -#if 0 /* Too few call sites to be useful. */ -DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); -#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \ - (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \ - DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \ - duk_del_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) -#endif -#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \ - duk_del_prop_stridx((thr), (obj_idx), (stridx)) - -DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ -#if 0 /* Too few call sites to be useful. */ -DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); -#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \ - (DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \ - DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \ - duk_has_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx)))) -#endif -#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \ - duk_has_prop_stridx((thr), (obj_idx), (stridx)) - -DUK_INTERNAL_DECL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags); /* [key val] -> [] */ - -DUK_INTERNAL_DECL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags); /* [val] -> [] */ - -/* XXX: Because stridx and desc_flags have a limited range, this call could - * always pack stridx and desc_flags into a single argument. - */ -DUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags); /* [val] -> [] */ -DUK_INTERNAL_DECL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args); -#define duk_xdef_prop_stridx_short(thr,obj_idx,stridx,desc_flags) \ - (DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x80L && (duk_int_t) (obj_idx) <= 0x7fL), \ - DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \ - DUK_ASSERT_EXPR((duk_int_t) (desc_flags) >= 0 && (duk_int_t) (desc_flags) <= 0xffL), \ - duk_xdef_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 24) + (((duk_uint_t) (stridx)) << 8) + (duk_uint_t) (desc_flags))) - -#define duk_xdef_prop_wec(thr,obj_idx) \ - duk_xdef_prop((thr), (obj_idx), DUK_PROPDESC_FLAGS_WEC) -#define duk_xdef_prop_index_wec(thr,obj_idx,arr_idx) \ - duk_xdef_prop_index((thr), (obj_idx), (arr_idx), DUK_PROPDESC_FLAGS_WEC) -#define duk_xdef_prop_stridx_wec(thr,obj_idx,stridx) \ - duk_xdef_prop_stridx((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC) -#define duk_xdef_prop_stridx_short_wec(thr,obj_idx,stridx) \ - duk_xdef_prop_stridx_short((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC) - -#if 0 /*unused*/ -DUK_INTERNAL_DECL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags); /* [] -> [] */ -#endif - -DUK_INTERNAL_DECL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx); /* [] -> [] */ - -DUK_INTERNAL_DECL void duk_pack(duk_hthread *thr, duk_idx_t count); -DUK_INTERNAL_DECL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx); -#if 0 -DUK_INTERNAL_DECL void duk_unpack(duk_hthread *thr); -#endif - -DUK_INTERNAL_DECL void duk_require_constructor_call(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h); - -DUK_INTERNAL_DECL void duk_resolve_nonbound_function(duk_hthread *thr); - -DUK_INTERNAL_DECL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top); -DUK_INTERNAL_DECL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count); -DUK_INTERNAL_DECL void duk_pop_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_2_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_3_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count); -DUK_INTERNAL_DECL void duk_pop_nodecref_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_2_nodecref_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_3_nodecref_unsafe(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_pop_undefined(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_compact_m1(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze); - -DUK_INTERNAL_DECL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx); -DUK_INTERNAL_DECL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count); - -DUK_INTERNAL_DECL void duk_concat_2(duk_hthread *thr); - -DUK_INTERNAL_DECL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags); - -/* Raw internal valstack access macros: access is unsafe so call site - * must have a guarantee that the index is valid. When that is the case, - * using these macro results in faster and smaller code than duk_get_tval(). - * Both 'ctx' and 'idx' are evaluted multiple times, but only for asserts. - */ -#define DUK_ASSERT_VALID_NEGIDX(thr,idx) \ - (DUK_ASSERT_EXPR((duk_int_t) (idx) < 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx)))) -#define DUK_ASSERT_VALID_POSIDX(thr,idx) \ - (DUK_ASSERT_EXPR((duk_int_t) (idx) >= 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx)))) -#define DUK_GET_TVAL_NEGIDX(thr,idx) \ - (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_top + (idx)) -#define DUK_GET_TVAL_POSIDX(thr,idx) \ - (DUK_ASSERT_VALID_POSIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_bottom + (idx)) -#define DUK_GET_HOBJECT_NEGIDX(thr,idx) \ - (DUK_ASSERT_VALID_NEGIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_top + (idx))) -#define DUK_GET_HOBJECT_POSIDX(thr,idx) \ - (DUK_ASSERT_VALID_POSIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_bottom + (idx))) - -#define DUK_GET_THIS_TVAL_PTR(thr) \ - (DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \ - (thr)->valstack_bottom - 1) - -DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr); -DUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr); -DUK_INTERNAL_DECL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr); - -#endif /* DUK_API_INTERNAL_H_INCLUDED */ -/* #include duk_hstring.h */ -#line 1 "duk_hstring.h" -/* - * Heap string representation. - * - * Strings are byte sequences ordinarily stored in extended UTF-8 format, - * allowing values larger than the official UTF-8 range (used internally) - * and also allowing UTF-8 encoding of surrogate pairs (CESU-8 format). - * Strings may also be invalid UTF-8 altogether which is the case e.g. with - * strings used as internal property names and raw buffers converted to - * strings. In such cases the 'clen' field contains an inaccurate value. - * - * Ecmascript requires support for 32-bit long strings. However, since each - * 16-bit codepoint can take 3 bytes in CESU-8, this representation can only - * support about 1.4G codepoint long strings in extreme cases. This is not - * really a practical issue. - */ - -#if !defined(DUK_HSTRING_H_INCLUDED) -#define DUK_HSTRING_H_INCLUDED - -/* Impose a maximum string length for now. Restricted artificially to - * ensure adding a heap header length won't overflow size_t. The limit - * should be synchronized with DUK_HBUFFER_MAX_BYTELEN. - * - * E5.1 makes provisions to support strings longer than 4G characters. - * This limit should be eliminated on 64-bit platforms (and increased - * closer to maximum support on 32-bit platforms). - */ - -#if defined(DUK_USE_STRLEN16) -#define DUK_HSTRING_MAX_BYTELEN (0x0000ffffUL) -#else -#define DUK_HSTRING_MAX_BYTELEN (0x7fffffffUL) -#endif - -/* XXX: could add flags for "is valid CESU-8" (Ecmascript compatible strings), - * "is valid UTF-8", "is valid extended UTF-8" (internal strings are not, - * regexp bytecode is), and "contains non-BMP characters". These are not - * needed right now. - */ - -#define DUK_HSTRING_FLAG_ASCII DUK_HEAPHDR_USER_FLAG(0) /* string is ASCII, clen == blen */ -#define DUK_HSTRING_FLAG_ARRIDX DUK_HEAPHDR_USER_FLAG(1) /* string is a valid array index */ -#define DUK_HSTRING_FLAG_SYMBOL DUK_HEAPHDR_USER_FLAG(2) /* string is a symbol (invalid utf-8) */ -#define DUK_HSTRING_FLAG_HIDDEN DUK_HEAPHDR_USER_FLAG(3) /* string is a hidden symbol (implies symbol, Duktape 1.x internal string) */ -#define DUK_HSTRING_FLAG_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(4) /* string is a reserved word (non-strict) */ -#define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(5) /* string is a reserved word (strict) */ -#define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS DUK_HEAPHDR_USER_FLAG(6) /* string is 'eval' or 'arguments' */ -#define DUK_HSTRING_FLAG_EXTDATA DUK_HEAPHDR_USER_FLAG(7) /* string data is external (duk_hstring_external) */ - -#define DUK_HSTRING_HAS_ASCII(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) -#define DUK_HSTRING_HAS_ARRIDX(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) -#define DUK_HSTRING_HAS_SYMBOL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) -#define DUK_HSTRING_HAS_HIDDEN(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) -#define DUK_HSTRING_HAS_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) -#define DUK_HSTRING_HAS_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) -#define DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) -#define DUK_HSTRING_HAS_EXTDATA(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) - -#define DUK_HSTRING_SET_ASCII(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) -#define DUK_HSTRING_SET_ARRIDX(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) -#define DUK_HSTRING_SET_SYMBOL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) -#define DUK_HSTRING_SET_HIDDEN(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) -#define DUK_HSTRING_SET_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) -#define DUK_HSTRING_SET_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) -#define DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) -#define DUK_HSTRING_SET_EXTDATA(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) - -#define DUK_HSTRING_CLEAR_ASCII(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII) -#define DUK_HSTRING_CLEAR_ARRIDX(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX) -#define DUK_HSTRING_CLEAR_SYMBOL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL) -#define DUK_HSTRING_CLEAR_HIDDEN(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN) -#define DUK_HSTRING_CLEAR_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD) -#define DUK_HSTRING_CLEAR_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD) -#define DUK_HSTRING_CLEAR_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS) -#define DUK_HSTRING_CLEAR_EXTDATA(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA) - -#if 0 /* Slightly smaller code without explicit flag, but explicit flag - * is very useful when 'clen' is dropped. - */ -#define DUK_HSTRING_IS_ASCII(x) (DUK_HSTRING_GET_BYTELEN((x)) == DUK_HSTRING_GET_CHARLEN((x))) -#endif -#define DUK_HSTRING_IS_ASCII(x) DUK_HSTRING_HAS_ASCII((x)) /* lazily set! */ -#define DUK_HSTRING_IS_EMPTY(x) (DUK_HSTRING_GET_BYTELEN((x)) == 0) - -#if defined(DUK_USE_STRHASH16) -#define DUK_HSTRING_GET_HASH(x) ((x)->hdr.h_flags >> 16) -#define DUK_HSTRING_SET_HASH(x,v) do { \ - (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | ((v) << 16); \ - } while (0) -#else -#define DUK_HSTRING_GET_HASH(x) ((x)->hash) -#define DUK_HSTRING_SET_HASH(x,v) do { \ - (x)->hash = (v); \ - } while (0) -#endif - -#if defined(DUK_USE_STRLEN16) -#define DUK_HSTRING_GET_BYTELEN(x) ((x)->hdr.h_strextra16) -#define DUK_HSTRING_SET_BYTELEN(x,v) do { \ - (x)->hdr.h_strextra16 = (v); \ - } while (0) -#if defined(DUK_USE_HSTRING_CLEN) -#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) -#define DUK_HSTRING_SET_CHARLEN(x,v) do { \ - (x)->clen16 = (v); \ - } while (0) -#else -#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) -#define DUK_HSTRING_SET_CHARLEN(x,v) do { \ - DUK_ASSERT(0); /* should never be called */ \ - } while (0) -#endif -#else -#define DUK_HSTRING_GET_BYTELEN(x) ((x)->blen) -#define DUK_HSTRING_SET_BYTELEN(x,v) do { \ - (x)->blen = (v); \ - } while (0) -#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x)) -#define DUK_HSTRING_SET_CHARLEN(x,v) do { \ - (x)->clen = (v); \ - } while (0) -#endif - -#if defined(DUK_USE_HSTRING_EXTDATA) -#define DUK_HSTRING_GET_EXTDATA(x) \ - ((x)->extdata) -#define DUK_HSTRING_GET_DATA(x) \ - (DUK_HSTRING_HAS_EXTDATA((x)) ? \ - DUK_HSTRING_GET_EXTDATA((const duk_hstring_external *) (x)) : ((const duk_uint8_t *) ((x) + 1))) -#else -#define DUK_HSTRING_GET_DATA(x) \ - ((const duk_uint8_t *) ((x) + 1)) -#endif - -#define DUK_HSTRING_GET_DATA_END(x) \ - (DUK_HSTRING_GET_DATA((x)) + (x)->blen) - -/* Marker value; in E5 2^32-1 is not a valid array index (2^32-2 is highest - * valid). - */ -#define DUK_HSTRING_NO_ARRAY_INDEX (0xffffffffUL) - -#if defined(DUK_USE_HSTRING_ARRIDX) -#define DUK_HSTRING_GET_ARRIDX_FAST(h) ((h)->arridx) -#define DUK_HSTRING_GET_ARRIDX_SLOW(h) ((h)->arridx) -#else -/* Get array index related to string (or return DUK_HSTRING_NO_ARRAY_INDEX); - * avoids helper call if string has no array index value. - */ -#define DUK_HSTRING_GET_ARRIDX_FAST(h) \ - (DUK_HSTRING_HAS_ARRIDX((h)) ? duk_js_to_arrayindex_hstring_fast_known((h)) : DUK_HSTRING_NO_ARRAY_INDEX) - -/* Slower but more compact variant. */ -#define DUK_HSTRING_GET_ARRIDX_SLOW(h) \ - (duk_js_to_arrayindex_hstring_fast((h))) -#endif - -/* XXX: these actually fit into duk_hstring */ -#define DUK_SYMBOL_TYPE_HIDDEN 0 -#define DUK_SYMBOL_TYPE_GLOBAL 1 -#define DUK_SYMBOL_TYPE_LOCAL 2 -#define DUK_SYMBOL_TYPE_WELLKNOWN 3 - -/* - * Misc - */ - -struct duk_hstring { - /* Smaller heaphdr than for other objects, because strings are held - * in string intern table which requires no link pointers. Much of - * the 32-bit flags field is unused by flags, so we can stuff a 16-bit - * field in there. - */ - duk_heaphdr_string hdr; - - /* String hash. */ -#if defined(DUK_USE_STRHASH16) - /* If 16-bit hash is in use, stuff it into duk_heaphdr_string flags. */ -#else - duk_uint32_t hash; -#endif - - /* Precomputed array index (or DUK_HSTRING_NO_ARRAY_INDEX). */ -#if defined(DUK_USE_HSTRING_ARRIDX) - duk_uarridx_t arridx; -#endif - - /* Length in bytes (not counting NUL term). */ -#if defined(DUK_USE_STRLEN16) - /* placed in duk_heaphdr_string */ -#else - duk_uint32_t blen; -#endif - - /* Length in codepoints (must be E5 compatible). */ -#if defined(DUK_USE_STRLEN16) -#if defined(DUK_USE_HSTRING_CLEN) - duk_uint16_t clen16; -#else - /* computed live */ -#endif -#else - duk_uint32_t clen; -#endif - - /* - * String data of 'blen+1' bytes follows (+1 for NUL termination - * convenience for C API). No alignment needs to be guaranteed - * for strings, but fields above should guarantee alignment-by-4 - * (but not alignment-by-8). - */ -}; - -/* The external string struct is defined even when the feature is inactive. */ -struct duk_hstring_external { - duk_hstring str; - - /* - * For an external string, the NUL-terminated string data is stored - * externally. The user must guarantee that data behind this pointer - * doesn't change while it's used. - */ - - const duk_uint8_t *extdata; -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware); -DUK_INTERNAL_DECL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr); -DUK_INTERNAL_DECL duk_size_t duk_hstring_get_charlen(duk_hstring *h); -#if !defined(DUK_USE_HSTRING_LAZY_CLEN) -DUK_INTERNAL_DECL void duk_hstring_init_charlen(duk_hstring *h); -#endif - -#endif /* DUK_HSTRING_H_INCLUDED */ -/* #include duk_hobject.h */ -#line 1 "duk_hobject.h" -/* - * Heap object representation. - * - * Heap objects are used for Ecmascript objects, arrays, and functions, - * but also for internal control like declarative and object environment - * records. Compiled functions, native functions, and threads are also - * objects but with an extended C struct. - * - * Objects provide the required Ecmascript semantics and exotic behaviors - * especially for property access. - * - * Properties are stored in three conceptual parts: - * - * 1. A linear 'entry part' contains ordered key-value-attributes triples - * and is the main method of string properties. - * - * 2. An optional linear 'array part' is used for array objects to store a - * (dense) range of [0,N[ array indexed entries with default attributes - * (writable, enumerable, configurable). If the array part would become - * sparse or non-default attributes are required, the array part is - * abandoned and moved to the 'entry part'. - * - * 3. An optional 'hash part' is used to optimize lookups of the entry - * part; it is used only for objects with sufficiently many properties - * and can be abandoned without loss of information. - * - * These three conceptual parts are stored in a single memory allocated area. - * This minimizes memory allocation overhead but also means that all three - * parts are resized together, and makes property access a bit complicated. - */ - -#if !defined(DUK_HOBJECT_H_INCLUDED) -#define DUK_HOBJECT_H_INCLUDED - -/* Object flags. Make sure this stays in sync with debugger object - * inspection code. - */ - -/* XXX: some flags are object subtype specific (e.g. common to all function - * subtypes, duk_harray, etc) and could be reused for different subtypes. - */ -#define DUK_HOBJECT_FLAG_EXTENSIBLE DUK_HEAPHDR_USER_FLAG(0) /* object is extensible */ -#define DUK_HOBJECT_FLAG_CONSTRUCTABLE DUK_HEAPHDR_USER_FLAG(1) /* object is constructable */ -#define DUK_HOBJECT_FLAG_CALLABLE DUK_HEAPHDR_USER_FLAG(2) /* object is callable */ -#define DUK_HOBJECT_FLAG_BOUNDFUNC DUK_HEAPHDR_USER_FLAG(3) /* object established using Function.prototype.bind() */ -#define DUK_HOBJECT_FLAG_COMPFUNC DUK_HEAPHDR_USER_FLAG(4) /* object is a compiled function (duk_hcompfunc) */ -#define DUK_HOBJECT_FLAG_NATFUNC DUK_HEAPHDR_USER_FLAG(5) /* object is a native function (duk_hnatfunc) */ -#define DUK_HOBJECT_FLAG_BUFOBJ DUK_HEAPHDR_USER_FLAG(6) /* object is a buffer object (duk_hbufobj) (always exotic) */ -#define DUK_HOBJECT_FLAG_FASTREFS DUK_HEAPHDR_USER_FLAG(7) /* object has no fields needing DECREF/marking beyond base duk_hobject header */ -#define DUK_HOBJECT_FLAG_ARRAY_PART DUK_HEAPHDR_USER_FLAG(8) /* object has an array part (a_size may still be 0) */ -#define DUK_HOBJECT_FLAG_STRICT DUK_HEAPHDR_USER_FLAG(9) /* function: function object is strict */ -#define DUK_HOBJECT_FLAG_NOTAIL DUK_HEAPHDR_USER_FLAG(10) /* function: function must not be tail called */ -#define DUK_HOBJECT_FLAG_NEWENV DUK_HEAPHDR_USER_FLAG(11) /* function: create new environment when called (see duk_hcompfunc) */ -#define DUK_HOBJECT_FLAG_NAMEBINDING DUK_HEAPHDR_USER_FLAG(12) /* function: create binding for func name (function templates only, used for named function expressions) */ -#define DUK_HOBJECT_FLAG_CREATEARGS DUK_HEAPHDR_USER_FLAG(13) /* function: create an arguments object on function call */ -#define DUK_HOBJECT_FLAG_HAVE_FINALIZER DUK_HEAPHDR_USER_FLAG(14) /* object has a callable (own) finalizer property */ -#define DUK_HOBJECT_FLAG_EXOTIC_ARRAY DUK_HEAPHDR_USER_FLAG(15) /* 'Array' object, array length and index exotic behavior */ -#define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ DUK_HEAPHDR_USER_FLAG(16) /* 'String' object, array index exotic behavior */ -#define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS DUK_HEAPHDR_USER_FLAG(17) /* 'Arguments' object and has arguments exotic behavior (non-strict callee) */ -#define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ DUK_HEAPHDR_USER_FLAG(18) /* 'Proxy' object */ -#define DUK_HOBJECT_FLAG_SPECIAL_CALL DUK_HEAPHDR_USER_FLAG(19) /* special casing in call behavior, for .call(), .apply(), etc. */ - -#define DUK_HOBJECT_FLAG_CLASS_BASE DUK_HEAPHDR_USER_FLAG_NUMBER(20) -#define DUK_HOBJECT_FLAG_CLASS_BITS 5 - -#define DUK_HOBJECT_GET_CLASS_NUMBER(h) \ - DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS) -#define DUK_HOBJECT_SET_CLASS_NUMBER(h,v) \ - DUK_HEAPHDR_SET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS, (v)) - -#define DUK_HOBJECT_GET_CLASS_MASK(h) \ - (1UL << DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS)) - -/* Macro for creating flag initializer from a class number. - * Unsigned type cast is needed to avoid warnings about coercing - * a signed integer to an unsigned one; the largest class values - * have the highest bit (bit 31) set which causes this. - */ -#define DUK_HOBJECT_CLASS_AS_FLAGS(v) (((duk_uint_t) (v)) << DUK_HOBJECT_FLAG_CLASS_BASE) - -/* E5 Section 8.6.2 + custom classes */ -#define DUK_HOBJECT_CLASS_NONE 0 -#define DUK_HOBJECT_CLASS_OBJECT 1 -#define DUK_HOBJECT_CLASS_ARRAY 2 -#define DUK_HOBJECT_CLASS_FUNCTION 3 -#define DUK_HOBJECT_CLASS_ARGUMENTS 4 -#define DUK_HOBJECT_CLASS_BOOLEAN 5 -#define DUK_HOBJECT_CLASS_DATE 6 -#define DUK_HOBJECT_CLASS_ERROR 7 -#define DUK_HOBJECT_CLASS_JSON 8 -#define DUK_HOBJECT_CLASS_MATH 9 -#define DUK_HOBJECT_CLASS_NUMBER 10 -#define DUK_HOBJECT_CLASS_REGEXP 11 -#define DUK_HOBJECT_CLASS_STRING 12 -#define DUK_HOBJECT_CLASS_GLOBAL 13 -#define DUK_HOBJECT_CLASS_SYMBOL 14 -#define DUK_HOBJECT_CLASS_OBJENV 15 /* custom */ -#define DUK_HOBJECT_CLASS_DECENV 16 /* custom */ -#define DUK_HOBJECT_CLASS_POINTER 17 /* custom */ -#define DUK_HOBJECT_CLASS_THREAD 18 /* custom; implies DUK_HOBJECT_IS_THREAD */ -#define DUK_HOBJECT_CLASS_BUFOBJ_MIN 19 -#define DUK_HOBJECT_CLASS_ARRAYBUFFER 19 /* implies DUK_HOBJECT_IS_BUFOBJ */ -#define DUK_HOBJECT_CLASS_DATAVIEW 20 -#define DUK_HOBJECT_CLASS_INT8ARRAY 21 -#define DUK_HOBJECT_CLASS_UINT8ARRAY 22 -#define DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY 23 -#define DUK_HOBJECT_CLASS_INT16ARRAY 24 -#define DUK_HOBJECT_CLASS_UINT16ARRAY 25 -#define DUK_HOBJECT_CLASS_INT32ARRAY 26 -#define DUK_HOBJECT_CLASS_UINT32ARRAY 27 -#define DUK_HOBJECT_CLASS_FLOAT32ARRAY 28 -#define DUK_HOBJECT_CLASS_FLOAT64ARRAY 29 -#define DUK_HOBJECT_CLASS_BUFOBJ_MAX 29 -#define DUK_HOBJECT_CLASS_MAX 29 - -/* Class masks. */ -#define DUK_HOBJECT_CMASK_ALL ((1UL << (DUK_HOBJECT_CLASS_MAX + 1)) - 1UL) -#define DUK_HOBJECT_CMASK_NONE (1UL << DUK_HOBJECT_CLASS_NONE) -#define DUK_HOBJECT_CMASK_ARGUMENTS (1UL << DUK_HOBJECT_CLASS_ARGUMENTS) -#define DUK_HOBJECT_CMASK_ARRAY (1UL << DUK_HOBJECT_CLASS_ARRAY) -#define DUK_HOBJECT_CMASK_BOOLEAN (1UL << DUK_HOBJECT_CLASS_BOOLEAN) -#define DUK_HOBJECT_CMASK_DATE (1UL << DUK_HOBJECT_CLASS_DATE) -#define DUK_HOBJECT_CMASK_ERROR (1UL << DUK_HOBJECT_CLASS_ERROR) -#define DUK_HOBJECT_CMASK_FUNCTION (1UL << DUK_HOBJECT_CLASS_FUNCTION) -#define DUK_HOBJECT_CMASK_JSON (1UL << DUK_HOBJECT_CLASS_JSON) -#define DUK_HOBJECT_CMASK_MATH (1UL << DUK_HOBJECT_CLASS_MATH) -#define DUK_HOBJECT_CMASK_NUMBER (1UL << DUK_HOBJECT_CLASS_NUMBER) -#define DUK_HOBJECT_CMASK_OBJECT (1UL << DUK_HOBJECT_CLASS_OBJECT) -#define DUK_HOBJECT_CMASK_REGEXP (1UL << DUK_HOBJECT_CLASS_REGEXP) -#define DUK_HOBJECT_CMASK_STRING (1UL << DUK_HOBJECT_CLASS_STRING) -#define DUK_HOBJECT_CMASK_GLOBAL (1UL << DUK_HOBJECT_CLASS_GLOBAL) -#define DUK_HOBJECT_CMASK_SYMBOL (1UL << DUK_HOBJECT_CLASS_SYMBOL) -#define DUK_HOBJECT_CMASK_OBJENV (1UL << DUK_HOBJECT_CLASS_OBJENV) -#define DUK_HOBJECT_CMASK_DECENV (1UL << DUK_HOBJECT_CLASS_DECENV) -#define DUK_HOBJECT_CMASK_POINTER (1UL << DUK_HOBJECT_CLASS_POINTER) -#define DUK_HOBJECT_CMASK_ARRAYBUFFER (1UL << DUK_HOBJECT_CLASS_ARRAYBUFFER) -#define DUK_HOBJECT_CMASK_DATAVIEW (1UL << DUK_HOBJECT_CLASS_DATAVIEW) -#define DUK_HOBJECT_CMASK_INT8ARRAY (1UL << DUK_HOBJECT_CLASS_INT8ARRAY) -#define DUK_HOBJECT_CMASK_UINT8ARRAY (1UL << DUK_HOBJECT_CLASS_UINT8ARRAY) -#define DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY (1UL << DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY) -#define DUK_HOBJECT_CMASK_INT16ARRAY (1UL << DUK_HOBJECT_CLASS_INT16ARRAY) -#define DUK_HOBJECT_CMASK_UINT16ARRAY (1UL << DUK_HOBJECT_CLASS_UINT16ARRAY) -#define DUK_HOBJECT_CMASK_INT32ARRAY (1UL << DUK_HOBJECT_CLASS_INT32ARRAY) -#define DUK_HOBJECT_CMASK_UINT32ARRAY (1UL << DUK_HOBJECT_CLASS_UINT32ARRAY) -#define DUK_HOBJECT_CMASK_FLOAT32ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT32ARRAY) -#define DUK_HOBJECT_CMASK_FLOAT64ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT64ARRAY) - -#define DUK_HOBJECT_CMASK_ALL_BUFOBJS \ - (DUK_HOBJECT_CMASK_ARRAYBUFFER | \ - DUK_HOBJECT_CMASK_DATAVIEW | \ - DUK_HOBJECT_CMASK_INT8ARRAY | \ - DUK_HOBJECT_CMASK_UINT8ARRAY | \ - DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY | \ - DUK_HOBJECT_CMASK_INT16ARRAY | \ - DUK_HOBJECT_CMASK_UINT16ARRAY | \ - DUK_HOBJECT_CMASK_INT32ARRAY | \ - DUK_HOBJECT_CMASK_UINT32ARRAY | \ - DUK_HOBJECT_CMASK_FLOAT32ARRAY | \ - DUK_HOBJECT_CMASK_FLOAT64ARRAY) - -#define DUK_HOBJECT_IS_OBJENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_OBJENV) -#define DUK_HOBJECT_IS_DECENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DECENV) -#define DUK_HOBJECT_IS_ENV(h) (DUK_HOBJECT_IS_OBJENV((h)) || DUK_HOBJECT_IS_DECENV((h))) -#define DUK_HOBJECT_IS_ARRAY(h) DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)) /* Rely on class Array <=> exotic Array */ -#define DUK_HOBJECT_IS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) -#define DUK_HOBJECT_IS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) -#define DUK_HOBJECT_IS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#define DUK_HOBJECT_IS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) -#else -#define DUK_HOBJECT_IS_BUFOBJ(h) 0 -#endif -#define DUK_HOBJECT_IS_THREAD(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_THREAD) -#if defined(DUK_USE_ES6_PROXY) -#define DUK_HOBJECT_IS_PROXY(h) DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((h)) -#else -#define DUK_HOBJECT_IS_PROXY(h) 0 -#endif - -#define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \ - DUK_HOBJECT_FLAG_COMPFUNC | \ - DUK_HOBJECT_FLAG_NATFUNC) - -#define DUK_HOBJECT_IS_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \ - DUK_HOBJECT_FLAG_BOUNDFUNC | \ - DUK_HOBJECT_FLAG_COMPFUNC | \ - DUK_HOBJECT_FLAG_NATFUNC) - -#define DUK_HOBJECT_IS_CALLABLE(h) DUK_HOBJECT_HAS_CALLABLE((h)) - -/* Object has any exotic behavior(s). */ -#define DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ - DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS | \ - DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \ - DUK_HOBJECT_FLAG_BUFOBJ | \ - DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) -#define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS) - -/* Object has any virtual properties (not counting Proxy behavior). */ -#define DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ - DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \ - DUK_HOBJECT_FLAG_BUFOBJ) -#define DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS) - -#define DUK_HOBJECT_HAS_EXTENSIBLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) -#define DUK_HOBJECT_HAS_CONSTRUCTABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) -#define DUK_HOBJECT_HAS_CALLABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) -#define DUK_HOBJECT_HAS_BOUNDFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) -#define DUK_HOBJECT_HAS_COMPFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) -#define DUK_HOBJECT_HAS_NATFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#define DUK_HOBJECT_HAS_BUFOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) -#else -#define DUK_HOBJECT_HAS_BUFOBJ(h) 0 -#endif -#define DUK_HOBJECT_HAS_FASTREFS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) -#define DUK_HOBJECT_HAS_ARRAY_PART(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) -#define DUK_HOBJECT_HAS_STRICT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) -#define DUK_HOBJECT_HAS_NOTAIL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) -#define DUK_HOBJECT_HAS_NEWENV(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) -#define DUK_HOBJECT_HAS_NAMEBINDING(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) -#define DUK_HOBJECT_HAS_CREATEARGS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) -#define DUK_HOBJECT_HAS_HAVE_FINALIZER(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) -#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) -#define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) -#define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) -#if defined(DUK_USE_ES6_PROXY) -#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) -#else -#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) 0 -#endif -#define DUK_HOBJECT_HAS_SPECIAL_CALL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) - -#define DUK_HOBJECT_SET_EXTENSIBLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) -#define DUK_HOBJECT_SET_CONSTRUCTABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) -#define DUK_HOBJECT_SET_CALLABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) -#define DUK_HOBJECT_SET_BOUNDFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) -#define DUK_HOBJECT_SET_COMPFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) -#define DUK_HOBJECT_SET_NATFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#define DUK_HOBJECT_SET_BUFOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) -#endif -#define DUK_HOBJECT_SET_FASTREFS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) -#define DUK_HOBJECT_SET_ARRAY_PART(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) -#define DUK_HOBJECT_SET_STRICT(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) -#define DUK_HOBJECT_SET_NOTAIL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) -#define DUK_HOBJECT_SET_NEWENV(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) -#define DUK_HOBJECT_SET_NAMEBINDING(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) -#define DUK_HOBJECT_SET_CREATEARGS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) -#define DUK_HOBJECT_SET_HAVE_FINALIZER(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) -#define DUK_HOBJECT_SET_EXOTIC_ARRAY(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) -#define DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) -#define DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) -#if defined(DUK_USE_ES6_PROXY) -#define DUK_HOBJECT_SET_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) -#endif -#define DUK_HOBJECT_SET_SPECIAL_CALL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) - -#define DUK_HOBJECT_CLEAR_EXTENSIBLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE) -#define DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE) -#define DUK_HOBJECT_CLEAR_CALLABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE) -#define DUK_HOBJECT_CLEAR_BOUNDFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC) -#define DUK_HOBJECT_CLEAR_COMPFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC) -#define DUK_HOBJECT_CLEAR_NATFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC) -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#define DUK_HOBJECT_CLEAR_BUFOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ) -#endif -#define DUK_HOBJECT_CLEAR_FASTREFS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS) -#define DUK_HOBJECT_CLEAR_ARRAY_PART(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART) -#define DUK_HOBJECT_CLEAR_STRICT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT) -#define DUK_HOBJECT_CLEAR_NOTAIL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL) -#define DUK_HOBJECT_CLEAR_NEWENV(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV) -#define DUK_HOBJECT_CLEAR_NAMEBINDING(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING) -#define DUK_HOBJECT_CLEAR_CREATEARGS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS) -#define DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER) -#define DUK_HOBJECT_CLEAR_EXOTIC_ARRAY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY) -#define DUK_HOBJECT_CLEAR_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ) -#define DUK_HOBJECT_CLEAR_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS) -#if defined(DUK_USE_ES6_PROXY) -#define DUK_HOBJECT_CLEAR_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ) -#endif -#define DUK_HOBJECT_CLEAR_SPECIAL_CALL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL) - -/* Object can/cannot use FASTREFS, i.e. has no strong reference fields beyond - * duk_hobject base header. This is used just for asserts so doesn't need to - * be optimized. - */ -#define DUK_HOBJECT_PROHIBITS_FASTREFS(h) \ - (DUK_HOBJECT_IS_COMPFUNC((h)) || DUK_HOBJECT_IS_DECENV((h)) || DUK_HOBJECT_IS_OBJENV((h)) || \ - DUK_HOBJECT_IS_BUFOBJ((h)) || DUK_HOBJECT_IS_THREAD((h)) || DUK_HOBJECT_IS_PROXY((h)) || \ - DUK_HOBJECT_IS_BOUNDFUNC((h))) -#define DUK_HOBJECT_ALLOWS_FASTREFS(h) (!DUK_HOBJECT_PROHIBITS_FASTREFS((h))) - -/* Flags used for property attributes in duk_propdesc and packed flags. - * Must fit into 8 bits. - */ -#define DUK_PROPDESC_FLAG_WRITABLE (1U << 0) /* E5 Section 8.6.1 */ -#define DUK_PROPDESC_FLAG_ENUMERABLE (1U << 1) /* E5 Section 8.6.1 */ -#define DUK_PROPDESC_FLAG_CONFIGURABLE (1U << 2) /* E5 Section 8.6.1 */ -#define DUK_PROPDESC_FLAG_ACCESSOR (1U << 3) /* accessor */ -#define DUK_PROPDESC_FLAG_VIRTUAL (1U << 4) /* property is virtual: used in duk_propdesc, never stored - * (used by e.g. buffer virtual properties) - */ -#define DUK_PROPDESC_FLAGS_MASK (DUK_PROPDESC_FLAG_WRITABLE | \ - DUK_PROPDESC_FLAG_ENUMERABLE | \ - DUK_PROPDESC_FLAG_CONFIGURABLE | \ - DUK_PROPDESC_FLAG_ACCESSOR) - -/* Additional flags which are passed in the same flags argument as property - * flags but are not stored in object properties. - */ -#define DUK_PROPDESC_FLAG_NO_OVERWRITE (1U << 4) /* internal define property: skip write silently if exists */ - -/* Convenience defines for property attributes. */ -#define DUK_PROPDESC_FLAGS_NONE 0 -#define DUK_PROPDESC_FLAGS_W (DUK_PROPDESC_FLAG_WRITABLE) -#define DUK_PROPDESC_FLAGS_E (DUK_PROPDESC_FLAG_ENUMERABLE) -#define DUK_PROPDESC_FLAGS_C (DUK_PROPDESC_FLAG_CONFIGURABLE) -#define DUK_PROPDESC_FLAGS_WE (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE) -#define DUK_PROPDESC_FLAGS_WC (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE) -#define DUK_PROPDESC_FLAGS_EC (DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE) -#define DUK_PROPDESC_FLAGS_WEC (DUK_PROPDESC_FLAG_WRITABLE | \ - DUK_PROPDESC_FLAG_ENUMERABLE | \ - DUK_PROPDESC_FLAG_CONFIGURABLE) - -/* Flags for duk_hobject_get_own_propdesc() and variants. */ -#define DUK_GETDESC_FLAG_PUSH_VALUE (1U << 0) /* push value to stack */ -#define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP (1U << 1) /* don't throw for prototype loop */ - -/* - * Macro for object validity check - * - * Assert for currently guaranteed relations between flags, for instance. - */ - -#define DUK_ASSERT_HOBJECT_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE((h)) || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FUNCTION); \ - DUK_ASSERT(!DUK_HOBJECT_IS_BUFOBJ((h)) || \ - (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAYBUFFER || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DATAVIEW || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT8ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT16ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT16ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT32ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT32ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT32ARRAY || \ - DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT64ARRAY)); \ - /* Object is an Array <=> object has exotic array behavior */ \ - DUK_ASSERT((DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAY && DUK_HOBJECT_HAS_EXOTIC_ARRAY((h))) || \ - (DUK_HOBJECT_GET_CLASS_NUMBER((h)) != DUK_HOBJECT_CLASS_ARRAY && !DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)))); \ - } while (0) - -/* - * Macros to access the 'props' allocation. - */ - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HOBJECT_GET_PROPS(heap,h) \ - ((duk_uint8_t *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (h))->h_extra16)) -#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \ - ((duk_heaphdr *) (h))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \ - } while (0) -#else -#define DUK_HOBJECT_GET_PROPS(heap,h) \ - ((h)->props) -#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \ - (h)->props = (duk_uint8_t *) (x); \ - } while (0) -#endif - -#if defined(DUK_USE_HOBJECT_LAYOUT_1) -/* LAYOUT 1 */ -#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ - ((duk_hstring **) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) \ - )) -#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ - ((duk_propvalue *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_hstring *) \ - )) -#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ - ((duk_uint8_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \ - )) -#define DUK_HOBJECT_A_GET_BASE(heap,h) \ - ((duk_tval *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) \ - )) -#define DUK_HOBJECT_H_GET_BASE(heap,h) \ - ((duk_uint32_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ - DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ - )) -#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ - ( \ - (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ - (n_arr) * sizeof(duk_tval) + \ - (n_hash) * sizeof(duk_uint32_t) \ - ) -#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ - (set_e_k) = (duk_hstring **) (void *) (p_base); \ - (set_e_pv) = (duk_propvalue *) (void *) ((set_e_k) + (n_ent)); \ - (set_e_f) = (duk_uint8_t *) (void *) ((set_e_pv) + (n_ent)); \ - (set_a) = (duk_tval *) (void *) ((set_e_f) + (n_ent)); \ - (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \ - } while (0) -#elif defined(DUK_USE_HOBJECT_LAYOUT_2) -/* LAYOUT 2 */ -#if (DUK_USE_ALIGN_BY == 4) -#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((4 - (e_sz)) & 0x03) -#elif (DUK_USE_ALIGN_BY == 8) -#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((8 - (e_sz)) & 0x07) -#elif (DUK_USE_ALIGN_BY == 1) -#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) 0 -#else -#error invalid DUK_USE_ALIGN_BY -#endif -#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ - ((duk_hstring **) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \ - )) -#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ - ((duk_propvalue *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) \ - )) -#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ - ((duk_uint8_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \ - )) -#define DUK_HOBJECT_A_GET_BASE(heap,h) \ - ((duk_tval *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ - DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) \ - )) -#define DUK_HOBJECT_H_GET_BASE(heap,h) \ - ((duk_uint32_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ - DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) + \ - DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ - )) -#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ - ( \ - (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \ - DUK_HOBJECT_E_FLAG_PADDING((n_ent)) + \ - (n_arr) * sizeof(duk_tval) + \ - (n_hash) * sizeof(duk_uint32_t) \ - ) -#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ - (set_e_pv) = (duk_propvalue *) (void *) (p_base); \ - (set_e_k) = (duk_hstring **) (void *) ((set_e_pv) + (n_ent)); \ - (set_e_f) = (duk_uint8_t *) (void *) ((set_e_k) + (n_ent)); \ - (set_a) = (duk_tval *) (void *) (((duk_uint8_t *) (set_e_f)) + \ - sizeof(duk_uint8_t) * (n_ent) + \ - DUK_HOBJECT_E_FLAG_PADDING((n_ent))); \ - (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \ - } while (0) -#elif defined(DUK_USE_HOBJECT_LAYOUT_3) -/* LAYOUT 3 */ -#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \ - ((duk_hstring **) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) + \ - DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ - )) -#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \ - ((duk_propvalue *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) \ - )) -#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \ - ((duk_uint8_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \ - DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) + \ - DUK_HOBJECT_GET_HSIZE((h)) * sizeof(duk_uint32_t) \ - )) -#define DUK_HOBJECT_A_GET_BASE(heap,h) \ - ((duk_tval *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \ - )) -#define DUK_HOBJECT_H_GET_BASE(heap,h) \ - ((duk_uint32_t *) (void *) ( \ - DUK_HOBJECT_GET_PROPS((heap), (h)) + \ - DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \ - DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \ - )) -#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \ - ( \ - (n_ent) * (sizeof(duk_propvalue) + sizeof(duk_hstring *) + sizeof(duk_uint8_t)) + \ - (n_arr) * sizeof(duk_tval) + \ - (n_hash) * sizeof(duk_uint32_t) \ - ) -#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \ - (set_e_pv) = (duk_propvalue *) (void *) (p_base); \ - (set_a) = (duk_tval *) (void *) ((set_e_pv) + (n_ent)); \ - (set_e_k) = (duk_hstring **) (void *) ((set_a) + (n_arr)); \ - (set_h) = (duk_uint32_t *) (void *) ((set_e_k) + (n_ent)); \ - (set_e_f) = (duk_uint8_t *) (void *) ((set_h) + (n_hash)); \ - } while (0) -#else -#error invalid hobject layout defines -#endif /* hobject property layout */ - -#define DUK_HOBJECT_P_ALLOC_SIZE(h) \ - DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE((h)), DUK_HOBJECT_GET_ASIZE((h)), DUK_HOBJECT_GET_HSIZE((h))) - -#define DUK_HOBJECT_E_GET_KEY(heap,h,i) (DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_E_GET_KEY_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_E_GET_VALUE(heap,h,i) (DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_E_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_E_GET_VALUE_TVAL(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v) -#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v) -#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get) -#define DUK_HOBJECT_E_GET_VALUE_GETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get) -#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set) -#define DUK_HOBJECT_E_GET_VALUE_SETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set) -#define DUK_HOBJECT_E_GET_FLAGS(heap,h,i) (DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_E_GET_FLAGS_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_A_GET_VALUE(heap,h,i) (DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_A_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_H_GET_INDEX(heap,h,i) (DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)]) -#define DUK_HOBJECT_H_GET_INDEX_PTR(heap,h,i) (&DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)]) - -#define DUK_HOBJECT_E_SET_KEY(heap,h,i,k) do { \ - DUK_HOBJECT_E_GET_KEY((heap), (h), (i)) = (k); \ - } while (0) -#define DUK_HOBJECT_E_SET_VALUE(heap,h,i,v) do { \ - DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)) = (v); \ - } while (0) -#define DUK_HOBJECT_E_SET_VALUE_TVAL(heap,h,i,v) do { \ - DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v = (v); \ - } while (0) -#define DUK_HOBJECT_E_SET_VALUE_GETTER(heap,h,i,v) do { \ - DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get = (v); \ - } while (0) -#define DUK_HOBJECT_E_SET_VALUE_SETTER(heap,h,i,v) do { \ - DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set = (v); \ - } while (0) -#define DUK_HOBJECT_E_SET_FLAGS(heap,h,i,f) do { \ - DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) = (duk_uint8_t) (f); \ - } while (0) -#define DUK_HOBJECT_A_SET_VALUE(heap,h,i,v) do { \ - DUK_HOBJECT_A_GET_VALUE((heap), (h), (i)) = (v); \ - } while (0) -#define DUK_HOBJECT_A_SET_VALUE_TVAL(heap,h,i,v) \ - DUK_HOBJECT_A_SET_VALUE((heap), (h), (i), (v)) /* alias for above */ -#define DUK_HOBJECT_H_SET_INDEX(heap,h,i,v) do { \ - DUK_HOBJECT_H_GET_INDEX((heap), (h), (i)) = (v); \ - } while (0) - -#define DUK_HOBJECT_E_SET_FLAG_BITS(heap,h,i,mask) do { \ - DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] |= (mask); \ - } while (0) - -#define DUK_HOBJECT_E_CLEAR_FLAG_BITS(heap,h,i,mask) do { \ - DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] &= ~(mask); \ - } while (0) - -#define DUK_HOBJECT_E_SLOT_IS_WRITABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_WRITABLE) != 0) -#define DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ENUMERABLE) != 0) -#define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0) -#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ACCESSOR) != 0) - -#define DUK_HOBJECT_E_SLOT_SET_WRITABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE) -#define DUK_HOBJECT_E_SLOT_SET_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE) -#define DUK_HOBJECT_E_SLOT_SET_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE) -#define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR) - -#define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE) -#define DUK_HOBJECT_E_SLOT_CLEAR_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE) -#define DUK_HOBJECT_E_SLOT_CLEAR_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE) -#define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR) - -#define DUK_PROPDESC_IS_WRITABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_WRITABLE) != 0) -#define DUK_PROPDESC_IS_ENUMERABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_ENUMERABLE) != 0) -#define DUK_PROPDESC_IS_CONFIGURABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0) -#define DUK_PROPDESC_IS_ACCESSOR(p) (((p)->flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0) - -#define DUK_HOBJECT_HASHIDX_UNUSED 0xffffffffUL -#define DUK_HOBJECT_HASHIDX_DELETED 0xfffffffeUL - -/* - * Macros for accessing size fields - */ - -#if defined(DUK_USE_OBJSIZES16) -#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size16) -#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size16 = (v); } while (0) -#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next16) -#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next16 = (v); } while (0) -#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next16++) -#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size16) -#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size16 = (v); } while (0) -#if defined(DUK_USE_HOBJECT_HASH_PART) -#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size16) -#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size16 = (v); } while (0) -#else -#define DUK_HOBJECT_GET_HSIZE(h) 0 -#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0) -#endif -#else -#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size) -#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size = (v); } while (0) -#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next) -#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next = (v); } while (0) -#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next++) -#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size) -#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size = (v); } while (0) -#if defined(DUK_USE_HOBJECT_HASH_PART) -#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size) -#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size = (v); } while (0) -#else -#define DUK_HOBJECT_GET_HSIZE(h) 0 -#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0) -#endif -#endif - -/* - * Misc - */ - -/* Maximum prototype traversal depth. Sanity limit which handles e.g. - * prototype loops (even complex ones like 1->2->3->4->2->3->4->2->3->4). - */ -#define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY 10000L - -/* - * Ecmascript [[Class]] - */ - -/* range check not necessary because all 4-bit values are mapped */ -#define DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(n) duk_class_number_to_stridx[(n)] - -#define DUK_HOBJECT_GET_CLASS_STRING(heap,h) \ - DUK_HEAP_GET_STRING( \ - (heap), \ - DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(DUK_HOBJECT_GET_CLASS_NUMBER((h))) \ - ) - -/* - * Macros for property handling - */ - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \ - ((duk_hobject *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->prototype16)) -#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \ - (h)->prototype16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \ - } while (0) -#else -#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \ - ((h)->prototype) -#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \ - (h)->prototype = (x); \ - } while (0) -#endif - -/* Set prototype, DECREF earlier value, INCREF new value (tolerating NULLs). */ -#define DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr,h,p) duk_hobject_set_prototype_updref((thr), (h), (p)) - -/* Set initial prototype, assume NULL previous prototype, INCREF new value, - * tolerate NULL. - */ -#define DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr,h,proto) do { \ - duk_hthread *duk__thr = (thr); \ - duk_hobject *duk__obj = (h); \ - duk_hobject *duk__proto = (proto); \ - DUK_UNREF(duk__thr); \ - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(duk__thr->heap, duk__obj) == NULL); \ - DUK_HOBJECT_SET_PROTOTYPE(duk__thr->heap, duk__obj, duk__proto); \ - DUK_HOBJECT_INCREF_ALLOWNULL(duk__thr, duk__proto); \ - } while (0) - -/* - * Finalizer check - */ - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((heap), (h)) -#else -#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((h)) -#endif - -/* - * Resizing and hash behavior - */ - -/* Sanity limit on max number of properties (allocated, not necessarily used). - * This is somewhat arbitrary, but if we're close to 2**32 properties some - * algorithms will fail (e.g. hash size selection, next prime selection). - * Also, we use negative array/entry table indices to indicate 'not found', - * so anything above 0x80000000 will cause trouble now. - */ -#if defined(DUK_USE_OBJSIZES16) -#define DUK_HOBJECT_MAX_PROPERTIES 0x0000ffffUL -#else -#define DUK_HOBJECT_MAX_PROPERTIES 0x3fffffffUL /* 2**30-1 ~= 1G properties */ -#endif - -/* internal align target for props allocation, must be 2*n for some n */ -#if (DUK_USE_ALIGN_BY == 4) -#define DUK_HOBJECT_ALIGN_TARGET 4 -#elif (DUK_USE_ALIGN_BY == 8) -#define DUK_HOBJECT_ALIGN_TARGET 8 -#elif (DUK_USE_ALIGN_BY == 1) -#define DUK_HOBJECT_ALIGN_TARGET 1 -#else -#error invalid DUK_USE_ALIGN_BY -#endif - -/* - * PC-to-line constants - */ - -#define DUK_PC2LINE_SKIP 64 - -/* maximum length for a SKIP-1 diffstream: 35 bits per entry, rounded up to bytes */ -#define DUK_PC2LINE_MAX_DIFF_LENGTH (((DUK_PC2LINE_SKIP - 1) * 35 + 7) / 8) - -/* - * Struct defs - */ - -struct duk_propaccessor { - duk_hobject *get; - duk_hobject *set; -}; - -union duk_propvalue { - /* The get/set pointers could be 16-bit pointer compressed but it - * would make no difference on 32-bit platforms because duk_tval is - * 8 bytes or more anyway. - */ - duk_tval v; - duk_propaccessor a; -}; - -struct duk_propdesc { - /* read-only values 'lifted' for ease of use */ - duk_small_uint_t flags; - duk_hobject *get; - duk_hobject *set; - - /* for updating (all are set to < 0 for virtual properties) */ - duk_int_t e_idx; /* prop index in 'entry part', < 0 if not there */ - duk_int_t h_idx; /* prop index in 'hash part', < 0 if not there */ - duk_int_t a_idx; /* prop index in 'array part', < 0 if not there */ -}; - -struct duk_hobject { - duk_heaphdr hdr; - - /* - * 'props' contains {key,value,flags} entries, optional array entries, and - * an optional hash lookup table for non-array entries in a single 'sliced' - * allocation. There are several layout options, which differ slightly in - * generated code size/speed and alignment/padding; duk_features.h selects - * the layout used. - * - * Layout 1 (DUK_USE_HOBJECT_LAYOUT_1): - * - * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) - * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) - * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable) - * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) - * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), - * 0xffffffffUL = unused, 0xfffffffeUL = deleted - * - * Layout 2 (DUK_USE_HOBJECT_LAYOUT_2): - * - * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) - * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) - * e_size * sizeof(duk_uint8_t) + pad bytes of entry flags (e_next gc reachable) - * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) - * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), - * 0xffffffffUL = unused, 0xfffffffeUL = deleted - * - * Layout 3 (DUK_USE_HOBJECT_LAYOUT_3): - * - * e_size * sizeof(duk_propvalue) bytes of entry values (e_next gc reachable) - * a_size * sizeof(duk_tval) bytes of (opt) array values (plain only) (all gc reachable) - * e_size * sizeof(duk_hstring *) bytes of entry keys (e_next gc reachable) - * h_size * sizeof(duk_uint32_t) bytes of (opt) hash indexes to entries (e_size), - * 0xffffffffUL = unused, 0xfffffffeUL = deleted - * e_size * sizeof(duk_uint8_t) bytes of entry flags (e_next gc reachable) - * - * In layout 1, the 'e_next' count is rounded to 4 or 8 on platforms - * requiring 4 or 8 byte alignment. This ensures proper alignment - * for the entries, at the cost of memory footprint. However, it's - * probably preferable to use another layout on such platforms instead. - * - * In layout 2, the key and value parts are swapped to avoid padding - * the key array on platforms requiring alignment by 8. The flags part - * is padded to get alignment for array entries. The 'e_next' count does - * not need to be rounded as in layout 1. - * - * In layout 3, entry values and array values are always aligned properly, - * and assuming pointers are at most 8 bytes, so are the entry keys. Hash - * indices will be properly aligned (assuming pointers are at least 4 bytes). - * Finally, flags don't need additional alignment. This layout provides - * compact allocations without padding (even on platforms with alignment - * requirements) at the cost of a bit slower lookups. - * - * Objects with few keys don't have a hash index; keys are looked up linearly, - * which is cache efficient because the keys are consecutive. Larger objects - * have a hash index part which contains integer indexes to the entries part. - * - * A single allocation reduces memory allocation overhead but requires more - * work when any part needs to be resized. A sliced allocation for entries - * makes linear key matching faster on most platforms (more locality) and - * skimps on flags size (which would be followed by 3 bytes of padding in - * most architectures if entries were placed in a struct). - * - * 'props' also contains internal properties distinguished with a non-BMP - * prefix. Often used properties should be placed early in 'props' whenever - * possible to make accessing them as fast a possible. - */ - -#if defined(DUK_USE_HEAPPTR16) - /* Located in duk_heaphdr h_extra16. Subclasses of duk_hobject (like - * duk_hcompfunc) are not free to use h_extra16 for this reason. - */ -#else - duk_uint8_t *props; -#endif - - /* prototype: the only internal property lifted outside 'e' as it is so central */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t prototype16; -#else - duk_hobject *prototype; -#endif - -#if defined(DUK_USE_OBJSIZES16) - duk_uint16_t e_size16; - duk_uint16_t e_next16; - duk_uint16_t a_size16; -#if defined(DUK_USE_HOBJECT_HASH_PART) - duk_uint16_t h_size16; -#endif -#else - duk_uint32_t e_size; /* entry part size */ - duk_uint32_t e_next; /* index for next new key ([0,e_next[ are gc reachable) */ - duk_uint32_t a_size; /* array part size (entirely gc reachable) */ -#if defined(DUK_USE_HOBJECT_HASH_PART) - duk_uint32_t h_size; /* hash part size or 0 if unused */ -#endif -#endif -}; - -/* - * Exposed data - */ - -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32]; -#endif /* !DUK_SINGLE_FILE */ - -/* - * Prototypes - */ - -/* alloc and init */ -DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -#endif -DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags); -DUK_INTERNAL_DECL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags); - -/* resize */ -DUK_INTERNAL_DECL void duk_hobject_realloc_props(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_e_size, - duk_uint32_t new_a_size, - duk_uint32_t new_h_size, - duk_bool_t abandon_array); -DUK_INTERNAL_DECL void duk_hobject_resize_entrypart(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_e_size); -#if 0 /*unused*/ -DUK_INTERNAL_DECL void duk_hobject_resize_arraypart(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_a_size); -#endif - -/* low-level property functions */ -DUK_INTERNAL_DECL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx); -DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key); -DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs); -DUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags); - -/* XXX: when optimizing for guaranteed property slots, use a guaranteed - * slot for internal value; this call can then access it directly. - */ -#define duk_hobject_get_internal_value_tval_ptr(heap,obj) \ - duk_hobject_find_existing_entry_tval_ptr((heap), (obj), DUK_HEAP_STRING_INT_VALUE((heap))) - -/* core property functions */ -DUK_INTERNAL_DECL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key); - -/* internal property functions */ -#define DUK_DELPROP_FLAG_THROW (1U << 0) -#define DUK_DELPROP_FLAG_FORCE (1U << 1) -DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key); -DUK_INTERNAL_DECL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags); -DUK_INTERNAL_DECL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj); -#if defined(DUK_USE_HEAPPTR16) -DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj); -#else -DUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj); -#endif - -/* helpers for defineProperty() and defineProperties() */ -DUK_INTERNAL_DECL void duk_hobject_prepare_property_descriptor(duk_hthread *thr, - duk_idx_t idx_in, - duk_uint_t *out_defprop_flags, - duk_idx_t *out_idx_value, - duk_hobject **out_getter, - duk_hobject **out_setter); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr, - duk_uint_t defprop_flags, - duk_hobject *obj, - duk_hstring *key, - duk_idx_t idx_value, - duk_hobject *get, - duk_hobject *set, - duk_bool_t throw_flag); - -/* Object built-in methods */ -DUK_INTERNAL_DECL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx); -DUK_INTERNAL_DECL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags); - -/* internal properties */ -DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv); -DUK_INTERNAL_DECL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj); - -/* hobject management functions */ -DUK_INTERNAL_DECL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj); - -/* ES2015 proxy */ -#if defined(DUK_USE_ES6_PROXY) -DUK_INTERNAL_DECL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler); -DUK_INTERNAL_DECL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj); -#endif - -/* enumeration */ -DUK_INTERNAL_DECL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags); -DUK_INTERNAL_DECL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags); -DUK_INTERNAL_DECL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value); - -/* macros */ -DUK_INTERNAL_DECL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p); - -/* pc2line */ -#if defined(DUK_USE_PC2LINE) -DUK_INTERNAL_DECL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length); -DUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc); -#endif - -/* misc */ -DUK_INTERNAL_DECL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop); - -#if !defined(DUK_USE_OBJECT_BUILTIN) -/* These declarations are needed when related built-in is disabled and - * genbuiltins.py won't automatically emit the declerations. - */ -DUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr); -DUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_hthread *thr); -#endif - -#endif /* DUK_HOBJECT_H_INCLUDED */ -/* #include duk_hcompfunc.h */ -#line 1 "duk_hcompfunc.h" -/* - * Heap compiled function (Ecmascript function) representation. - * - * There is a single data buffer containing the Ecmascript function's - * bytecode, constants, and inner functions. - */ - -#if !defined(DUK_HCOMPFUNC_H_INCLUDED) -#define DUK_HCOMPFUNC_H_INCLUDED - -/* - * Field accessor macros - */ - -/* XXX: casts could be improved, especially for GET/SET DATA */ - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HCOMPFUNC_GET_DATA(heap,h) \ - ((duk_hbuffer_fixed *) (void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->data16)) -#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \ - (h)->data16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPFUNC_GET_FUNCS(heap,h) \ - ((duk_hobject **) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->funcs16))) -#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \ - (h)->funcs16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) \ - ((duk_instr_t *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->bytecode16))) -#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \ - (h)->bytecode16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPFUNC_GET_LEXENV(heap,h) \ - ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->lex_env16))) -#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \ - (h)->lex_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HCOMPFUNC_GET_VARENV(heap,h) \ - ((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->var_env16))) -#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \ - (h)->var_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#else -#define DUK_HCOMPFUNC_GET_DATA(heap,h) ((duk_hbuffer_fixed *) (void *) (h)->data) -#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \ - (h)->data = (duk_hbuffer *) (v); \ - } while (0) -#define DUK_HCOMPFUNC_GET_FUNCS(heap,h) ((h)->funcs) -#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v) do { \ - (h)->funcs = (v); \ - } while (0) -#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h) ((h)->bytecode) -#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v) do { \ - (h)->bytecode = (v); \ - } while (0) -#define DUK_HCOMPFUNC_GET_LEXENV(heap,h) ((h)->lex_env) -#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v) do { \ - (h)->lex_env = (v); \ - } while (0) -#define DUK_HCOMPFUNC_GET_VARENV(heap,h) ((h)->var_env) -#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v) do { \ - (h)->var_env = (v); \ - } while (0) -#endif - -/* - * Accessor macros for function specific data areas - */ - -/* Note: assumes 'data' is always a fixed buffer */ -#define DUK_HCOMPFUNC_GET_BUFFER_BASE(heap,h) \ - DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) - -#define DUK_HCOMPFUNC_GET_CONSTS_BASE(heap,h) \ - ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_BUFFER_BASE((heap), (h))) - -#define DUK_HCOMPFUNC_GET_FUNCS_BASE(heap,h) \ - DUK_HCOMPFUNC_GET_FUNCS((heap), (h)) - -#define DUK_HCOMPFUNC_GET_CODE_BASE(heap,h) \ - DUK_HCOMPFUNC_GET_BYTECODE((heap), (h)) - -#define DUK_HCOMPFUNC_GET_CONSTS_END(heap,h) \ - ((duk_tval *) (void *) DUK_HCOMPFUNC_GET_FUNCS((heap), (h))) - -#define DUK_HCOMPFUNC_GET_FUNCS_END(heap,h) \ - ((duk_hobject **) (void *) DUK_HCOMPFUNC_GET_BYTECODE((heap), (h))) - -/* XXX: double evaluation of DUK_HCOMPFUNC_GET_DATA() */ -#define DUK_HCOMPFUNC_GET_CODE_END(heap,h) \ - ((duk_instr_t *) (void *) (DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) + \ - DUK_HBUFFER_GET_SIZE((duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA((heap), h)))) - -#define DUK_HCOMPFUNC_GET_CONSTS_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_END((heap), (h))) - \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_BASE((heap), (h))) \ - ) \ - ) - -#define DUK_HCOMPFUNC_GET_FUNCS_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_END((heap), (h))) - \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_BASE((heap), (h))) \ - ) \ - ) - -#define DUK_HCOMPFUNC_GET_CODE_SIZE(heap,h) \ - ( \ - (duk_size_t) \ - ( \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_END((heap),(h))) - \ - ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_BASE((heap),(h))) \ - ) \ - ) - -#define DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPFUNC_GET_CONSTS_SIZE((heap), (h)) / sizeof(duk_tval))) - -#define DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPFUNC_GET_FUNCS_SIZE((heap), (h)) / sizeof(duk_hobject *))) - -#define DUK_HCOMPFUNC_GET_CODE_COUNT(heap,h) \ - ((duk_size_t) (DUK_HCOMPFUNC_GET_CODE_SIZE((heap), (h)) / sizeof(duk_instr_t))) - -/* - * Validity assert - */ - -#define DUK_ASSERT_HCOMPFUNC_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - } while (0) - -/* - * Main struct - */ - -struct duk_hcompfunc { - /* shared object part */ - duk_hobject obj; - - /* - * Pointers to function data area for faster access. Function - * data is a buffer shared between all closures of the same - * "template" function. The data buffer is always fixed (non- - * dynamic, hence stable), with a layout as follows: - * - * constants (duk_tval) - * inner functions (duk_hobject *) - * bytecode (duk_instr_t) - * - * Note: bytecode end address can be computed from 'data' buffer - * size. It is not strictly necessary functionally, assuming - * bytecode never jumps outside its allocated area. However, - * it's a safety/robustness feature for avoiding the chance of - * executing random data as bytecode due to a compiler error. - * - * Note: values in the data buffer must be incref'd (they will - * be decref'd on release) for every compiledfunction referring - * to the 'data' element. - */ - - /* Data area, fixed allocation, stable data ptrs. */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t data16; -#else - duk_hbuffer *data; -#endif - - /* No need for constants pointer (= same as data). - * - * When using 16-bit packing alignment to 4 is nice. 'funcs' will be - * 4-byte aligned because 'constants' are duk_tvals. For now the - * inner function pointers are not compressed, so that 'bytecode' will - * also be 4-byte aligned. - */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t funcs16; - duk_uint16_t bytecode16; -#else - duk_hobject **funcs; - duk_instr_t *bytecode; -#endif - - /* Lexenv: lexical environment of closure, NULL for templates. - * Varenv: variable environment of closure, NULL for templates. - */ -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t lex_env16; - duk_uint16_t var_env16; -#else - duk_hobject *lex_env; - duk_hobject *var_env; -#endif - - /* - * 'nregs' registers are allocated on function entry, at most 'nargs' - * are initialized to arguments, and the rest to undefined. Arguments - * above 'nregs' are not mapped to registers. All registers in the - * active stack range must be initialized because they are GC reachable. - * 'nargs' is needed so that if the function is given more than 'nargs' - * arguments, the additional arguments do not 'clobber' registers - * beyond 'nregs' which must be consistently initialized to undefined. - * - * Usually there is no need to know which registers are mapped to - * local variables. Registers may be allocated to variable in any - * way (even including gaps). However, a register-variable mapping - * must be the same for the duration of the function execution and - * the register cannot be used for anything else. - * - * When looking up variables by name, the '_Varmap' map is used. - * When an activation closes, registers mapped to arguments are - * copied into the environment record based on the same map. The - * reverse map (from register to variable) is not currently needed - * at run time, except for debugging, so it is not maintained. - */ - - duk_uint16_t nregs; /* regs to allocate */ - duk_uint16_t nargs; /* number of arguments allocated to regs */ - - /* - * Additional control information is placed into the object itself - * as internal properties to avoid unnecessary fields for the - * majority of functions. The compiler tries to omit internal - * control fields when possible. - * - * Function templates: - * - * { - * name: "func", // declaration, named function expressions - * fileName: - * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, - * _Formals: [ "arg1", "arg2" ], - * _Source: "function func(arg1, arg2) { ... }", - * _Pc2line: , - * } - * - * Function instances: - * - * { - * length: 2, - * prototype: { constructor: }, - * caller: , - * arguments: , - * name: "func", // declaration, named function expressions - * fileName: - * _Varmap: { "arg1": 0, "arg2": 1, "varname": 2 }, - * _Formals: [ "arg1", "arg2" ], - * _Source: "function func(arg1, arg2) { ... }", - * _Pc2line: , - * } - * - * More detailed description of these properties can be found - * in the documentation. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* Line number range for function. Needed during debugging to - * determine active breakpoints. - */ - duk_uint32_t start_line; - duk_uint32_t end_line; -#endif -}; - -#endif /* DUK_HCOMPFUNC_H_INCLUDED */ -/* #include duk_hnatfunc.h */ -#line 1 "duk_hnatfunc.h" -/* - * Heap native function representation. - */ - -#if !defined(DUK_HNATFUNC_H_INCLUDED) -#define DUK_HNATFUNC_H_INCLUDED - -#define DUK_HNATFUNC_NARGS_VARARGS ((duk_int16_t) -1) -#define DUK_HNATFUNC_NARGS_MAX ((duk_int16_t) 0x7fff) - -struct duk_hnatfunc { - /* shared object part */ - duk_hobject obj; - - duk_c_function func; - duk_int16_t nargs; - duk_int16_t magic; - - /* The 'magic' field allows an opaque 16-bit field to be accessed by the - * Duktape/C function. This allows, for instance, the same native function - * to be used for a set of very similar functions, with the 'magic' field - * providing the necessary non-argument flags / values to guide the behavior - * of the native function. The value is signed on purpose: it is easier to - * convert a signed value to unsigned (simply AND with 0xffff) than vice - * versa. - * - * Note: cannot place nargs/magic into the heaphdr flags, because - * duk_hobject takes almost all flags already. - */ -}; - -#endif /* DUK_HNATFUNC_H_INCLUDED */ -/* #include duk_hboundfunc.h */ -#line 1 "duk_hboundfunc.h" -/* - * Bound function representation. - */ - -#if !defined(DUK_HBOUNDFUNC_H_INCLUDED) -#define DUK_HBOUNDFUNC_H_INCLUDED - -/* Artificial limit for args length. Ensures arithmetic won't overflow - * 32 bits when combining bound functions. - */ -#define DUK_HBOUNDFUNC_MAX_ARGS 0x20000000UL - -#define DUK_ASSERT_HBOUNDFUNC_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(DUK_HOBJECT_IS_BOUNDFUNC((duk_hobject *) (h))); \ - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&(h)->target) || \ - (DUK_TVAL_IS_OBJECT(&(h)->target) && \ - DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&(h)->target)))); \ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&(h)->this_binding)); \ - DUK_ASSERT((h)->nargs == 0 || (h)->args != NULL); \ - } while (0) - -struct duk_hboundfunc { - /* Shared object part. */ - duk_hobject obj; - - /* Final target function, stored as duk_tval so that lightfunc can be - * represented too. - */ - duk_tval target; - - /* This binding. */ - duk_tval this_binding; - - /* Arguments to prepend. */ - duk_tval *args; /* Separate allocation. */ - duk_idx_t nargs; -}; - -#endif /* DUK_HBOUNDFUNC_H_INCLUDED */ -/* #include duk_hbufobj.h */ -#line 1 "duk_hbufobj.h" -/* - * Heap Buffer object representation. Used for all Buffer variants. - */ - -#if !defined(DUK_HBUFOBJ_H_INCLUDED) -#define DUK_HBUFOBJ_H_INCLUDED - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - -/* All element accessors are host endian now (driven by TypedArray spec). */ -#define DUK_HBUFOBJ_ELEM_UINT8 0 -#define DUK_HBUFOBJ_ELEM_UINT8CLAMPED 1 -#define DUK_HBUFOBJ_ELEM_INT8 2 -#define DUK_HBUFOBJ_ELEM_UINT16 3 -#define DUK_HBUFOBJ_ELEM_INT16 4 -#define DUK_HBUFOBJ_ELEM_UINT32 5 -#define DUK_HBUFOBJ_ELEM_INT32 6 -#define DUK_HBUFOBJ_ELEM_FLOAT32 7 -#define DUK_HBUFOBJ_ELEM_FLOAT64 8 -#define DUK_HBUFOBJ_ELEM_MAX 8 - -#define DUK_ASSERT_HBUFOBJ_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT((h)->shift <= 3); \ - DUK_ASSERT((h)->elem_type <= DUK_HBUFOBJ_ELEM_MAX); \ - DUK_ASSERT(((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8) || \ - ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8CLAMPED) || \ - ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT8) || \ - ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT16) || \ - ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT16) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT32) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT32) || \ - ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT32) || \ - ((h)->shift == 3 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT64)); \ - DUK_ASSERT((h)->is_typedarray == 0 || (h)->is_typedarray == 1); \ - DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) (h))); \ - if ((h)->buf == NULL) { \ - DUK_ASSERT((h)->offset == 0); \ - DUK_ASSERT((h)->length == 0); \ - } else { \ - /* No assertions for offset or length; in particular, \ - * it's OK for length to be longer than underlying \ - * buffer. Just ensure they don't wrap when added. \ - */ \ - DUK_ASSERT((h)->offset + (h)->length >= (h)->offset); \ - } \ - } while (0) - -/* Get the current data pointer (caller must ensure buf != NULL) as a - * duk_uint8_t ptr. - */ -#define DUK_HBUFOBJ_GET_SLICE_BASE(heap,h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - (((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR((heap), (h)->buf)) + (h)->offset)) - -/* True if slice is full, i.e. offset is zero and length covers the entire - * buffer. This status may change independently of the duk_hbufobj if - * the underlying buffer is dynamic and changes without the hbufobj - * being changed. - */ -#define DUK_HBUFOBJ_FULL_SLICE(h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset == 0 && (h)->length == DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Validate that the whole slice [0,length[ is contained in the underlying - * buffer. Caller must ensure 'buf' != NULL. - */ -#define DUK_HBUFOBJ_VALID_SLICE(h) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (h)->length <= DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Validate byte read/write for virtual 'offset', i.e. check that the - * offset, taking into account h->offset, is within the underlying - * buffer size. This is a safety check which is needed to ensure - * that even a misconfigured duk_hbufobj never causes memory unsafe - * behavior (e.g. if an underlying dynamic buffer changes after being - * setup). Caller must ensure 'buf' != NULL. - */ -#define DUK_HBUFOBJ_VALID_BYTEOFFSET_INCL(h,off) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (off) < DUK_HBUFFER_GET_SIZE((h)->buf))) - -#define DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h,off) \ - (DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \ - ((h)->offset + (off) <= DUK_HBUFFER_GET_SIZE((h)->buf))) - -/* Clamp an input byte length (already assumed to be within the nominal - * duk_hbufobj 'length') to the current dynamic buffer limits to yield - * a byte length limit that's safe for memory accesses. This value can - * be invalidated by any side effect because it may trigger a user - * callback that resizes the underlying buffer. - */ -#define DUK_HBUFOBJ_CLAMP_BYTELENGTH(h,len) \ - (DUK_ASSERT_EXPR((h) != NULL), \ - duk_hbufobj_clamp_bytelength((h), (len))) - -/* Typed arrays have virtual indices, ArrayBuffer and DataView do not. */ -#define DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h) ((h)->is_typedarray) - -struct duk_hbufobj { - /* Shared object part. */ - duk_hobject obj; - - /* Underlying buffer (refcounted), may be NULL. */ - duk_hbuffer *buf; - - /* .buffer reference to an ArrayBuffer, may be NULL. */ - duk_hobject *buf_prop; - - /* Slice and accessor information. - * - * Because the underlying buffer may be dynamic, these may be - * invalidated by the buffer being modified so that both offset - * and length should be validated before every access. Behavior - * when the underlying buffer has changed doesn't need to be clean: - * virtual 'length' doesn't need to be affected, reads can return - * zero/NaN, and writes can be ignored. - * - * Note that a data pointer cannot be precomputed because 'buf' may - * be dynamic and its pointer unstable. - */ - - duk_uint_t offset; /* byte offset to buf */ - duk_uint_t length; /* byte index limit for element access, exclusive */ - duk_uint8_t shift; /* element size shift: - * 0 = u8/i8 - * 1 = u16/i16 - * 2 = u32/i32/float - * 3 = double - */ - duk_uint8_t elem_type; /* element type */ - duk_uint8_t is_typedarray; -}; - -DUK_INTERNAL_DECL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len); -DUK_INTERNAL_DECL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf); -DUK_INTERNAL_DECL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); -DUK_INTERNAL_DECL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size); -DUK_INTERNAL_DECL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx); - -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ -#endif /* DUK_HBUFOBJ_H_INCLUDED */ -/* #include duk_hthread.h */ -#line 1 "duk_hthread.h" -/* - * Heap thread object representation. - * - * duk_hthread is also the 'context' for public API functions via a - * different typedef. Most API calls operate on the topmost frame - * of the value stack only. - */ - -#if !defined(DUK_HTHREAD_H_INCLUDED) -#define DUK_HTHREAD_H_INCLUDED - -/* - * Stack constants - */ - -/* Initial valstack size, roughly 0.7kiB. */ -#define DUK_VALSTACK_INITIAL_SIZE 96U - -/* Internal extra elements assumed on function entry, always added to - * user-defined 'extra' for e.g. the duk_check_stack() call. - */ -#define DUK_VALSTACK_INTERNAL_EXTRA 32U - -/* Number of elements guaranteed to be user accessible (in addition to call - * arguments) on Duktape/C function entry. This is the major public API - * commitment. - */ -#define DUK_VALSTACK_API_ENTRY_MINIMUM DUK_API_ENTRY_STACK - -/* - * Activation defines - */ - -#define DUK_ACT_FLAG_STRICT (1U << 0) /* function executes in strict mode */ -#define DUK_ACT_FLAG_TAILCALLED (1U << 1) /* activation has tail called one or more times */ -#define DUK_ACT_FLAG_CONSTRUCT (1U << 2) /* function executes as a constructor (called via "new") */ -#define DUK_ACT_FLAG_PREVENT_YIELD (1U << 3) /* activation prevents yield (native call or "new") */ -#define DUK_ACT_FLAG_DIRECT_EVAL (1U << 4) /* activation is a direct eval call */ -#define DUK_ACT_FLAG_CONSTRUCT_PROXY (1U << 5) /* activation is for Proxy 'construct' call, special return value handling */ -#define DUK_ACT_FLAG_BREAKPOINT_ACTIVE (1U << 6) /* activation has active breakpoint(s) */ - -#define DUK_ACT_GET_FUNC(act) ((act)->func) - -/* - * Flags for __FILE__ / __LINE__ registered into tracedata - */ - -#define DUK_TB_FLAG_NOBLAME_FILELINE (1U << 0) /* don't report __FILE__ / __LINE__ as fileName/lineNumber */ - -/* - * Catcher defines - */ - -/* XXX: remove catcher type entirely */ - -/* flags field: LLLLLLFT, L = label (24 bits), F = flags (4 bits), T = type (4 bits) */ -#define DUK_CAT_TYPE_MASK 0x0000000fUL -#define DUK_CAT_TYPE_BITS 4 -#define DUK_CAT_LABEL_MASK 0xffffff00UL -#define DUK_CAT_LABEL_BITS 24 -#define DUK_CAT_LABEL_SHIFT 8 - -#define DUK_CAT_FLAG_CATCH_ENABLED (1U << 4) /* catch part will catch */ -#define DUK_CAT_FLAG_FINALLY_ENABLED (1U << 5) /* finally part will catch */ -#define DUK_CAT_FLAG_CATCH_BINDING_ENABLED (1U << 6) /* request to create catch binding */ -#define DUK_CAT_FLAG_LEXENV_ACTIVE (1U << 7) /* catch or with binding is currently active */ - -#define DUK_CAT_TYPE_UNKNOWN 0 -#define DUK_CAT_TYPE_TCF 1 -#define DUK_CAT_TYPE_LABEL 2 - -#define DUK_CAT_GET_TYPE(c) ((c)->flags & DUK_CAT_TYPE_MASK) -#define DUK_CAT_GET_LABEL(c) (((c)->flags & DUK_CAT_LABEL_MASK) >> DUK_CAT_LABEL_SHIFT) - -#define DUK_CAT_HAS_CATCH_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_ENABLED) -#define DUK_CAT_HAS_FINALLY_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_FINALLY_ENABLED) -#define DUK_CAT_HAS_CATCH_BINDING_ENABLED(c) ((c)->flags & DUK_CAT_FLAG_CATCH_BINDING_ENABLED) -#define DUK_CAT_HAS_LEXENV_ACTIVE(c) ((c)->flags & DUK_CAT_FLAG_LEXENV_ACTIVE) - -#define DUK_CAT_SET_CATCH_ENABLED(c) do { \ - (c)->flags |= DUK_CAT_FLAG_CATCH_ENABLED; \ - } while (0) -#define DUK_CAT_SET_FINALLY_ENABLED(c) do { \ - (c)->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; \ - } while (0) -#define DUK_CAT_SET_CATCH_BINDING_ENABLED(c) do { \ - (c)->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \ - } while (0) -#define DUK_CAT_SET_LEXENV_ACTIVE(c) do { \ - (c)->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; \ - } while (0) - -#define DUK_CAT_CLEAR_CATCH_ENABLED(c) do { \ - (c)->flags &= ~DUK_CAT_FLAG_CATCH_ENABLED; \ - } while (0) -#define DUK_CAT_CLEAR_FINALLY_ENABLED(c) do { \ - (c)->flags &= ~DUK_CAT_FLAG_FINALLY_ENABLED; \ - } while (0) -#define DUK_CAT_CLEAR_CATCH_BINDING_ENABLED(c) do { \ - (c)->flags &= ~DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \ - } while (0) -#define DUK_CAT_CLEAR_LEXENV_ACTIVE(c) do { \ - (c)->flags &= ~DUK_CAT_FLAG_LEXENV_ACTIVE; \ - } while (0) - -/* - * Thread defines - */ - -#if defined(DUK_USE_ROM_STRINGS) -#define DUK_HTHREAD_GET_STRING(thr,idx) \ - ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)])) -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HTHREAD_GET_STRING(thr,idx) \ - ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((thr)->heap->heap_udata, (thr)->strs16[(idx)])) -#else -#define DUK_HTHREAD_GET_STRING(thr,idx) \ - ((thr)->strs[(idx)]) -#endif -#endif /* DUK_USE_ROM_STRINGS */ - -/* values for the state field */ -#define DUK_HTHREAD_STATE_INACTIVE 1 /* thread not currently running */ -#define DUK_HTHREAD_STATE_RUNNING 2 /* thread currently running (only one at a time) */ -#define DUK_HTHREAD_STATE_RESUMED 3 /* thread resumed another thread (active but not running) */ -#define DUK_HTHREAD_STATE_YIELDED 4 /* thread has yielded */ -#define DUK_HTHREAD_STATE_TERMINATED 5 /* thread has terminated */ - -/* Executor interrupt default interval when nothing else requires a - * smaller value. The default interval must be small enough to allow - * for reasonable execution timeout checking but large enough to keep - * impact on execution performance low. - */ -#if defined(DUK_USE_INTERRUPT_COUNTER) -#define DUK_HTHREAD_INTCTR_DEFAULT (256L * 1024L) -#endif - -/* - * Assert context is valid: non-NULL pointer, fields look sane. - * - * This is used by public API call entrypoints to catch invalid 'ctx' pointers - * as early as possible; invalid 'ctx' pointers cause very odd and difficult to - * diagnose behavior so it's worth checking even when the check is not 100%. - */ - -/* Assertions for internals. */ -#define DUK_ASSERT_HTHREAD_VALID(thr) do { \ - DUK_ASSERT((thr) != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) (thr)) == DUK_HTYPE_OBJECT); \ - DUK_ASSERT(DUK_HOBJECT_IS_THREAD((duk_hobject *) (thr))); \ - DUK_ASSERT((thr)->unused1 == 0); \ - DUK_ASSERT((thr)->unused2 == 0); \ - } while (0) - -/* Assertions for public API calls; a bit stronger. */ -#define DUK_ASSERT_CTX_VALID(thr) do { \ - DUK_ASSERT((thr) != NULL); \ - DUK_ASSERT_HTHREAD_VALID((thr)); \ - DUK_ASSERT((thr)->valstack != NULL); \ - DUK_ASSERT((thr)->valstack_bottom != NULL); \ - DUK_ASSERT((thr)->valstack_top != NULL); \ - DUK_ASSERT((thr)->valstack_end != NULL); \ - DUK_ASSERT((thr)->valstack_alloc_end != NULL); \ - DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack); \ - DUK_ASSERT((thr)->valstack_end >= (thr)->valstack); \ - DUK_ASSERT((thr)->valstack_top >= (thr)->valstack); \ - DUK_ASSERT((thr)->valstack_top >= (thr)->valstack_bottom); \ - DUK_ASSERT((thr)->valstack_end >= (thr)->valstack_top); \ - DUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack_end); \ - } while (0) - -/* Assertions for API call entry specifically. Checks 'ctx' but also may - * check internal state (e.g. not in a debugger transport callback). - */ -#define DUK_ASSERT_API_ENTRY(thr) do { \ - DUK_ASSERT_CTX_VALID((thr)); \ - DUK_ASSERT((thr)->heap != NULL); \ - DUK_ASSERT((thr)->heap->dbg_calling_transport == 0); \ - } while (0) - -/* - * Assertion helpers. - */ - -#define DUK_ASSERT_STRIDX_VALID(val) \ - DUK_ASSERT((duk_uint_t) (val) < DUK_HEAP_NUM_STRINGS) - -#define DUK_ASSERT_BIDX_VALID(val) \ - DUK_ASSERT((duk_uint_t) (val) < DUK_NUM_BUILTINS) - -/* - * Misc - */ - -/* Fast access to 'this' binding. Assumes there's a call in progress. */ -#define DUK_HTHREAD_THIS_PTR(thr) \ - (DUK_ASSERT_EXPR((thr) != NULL), \ - DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \ - (thr)->valstack_bottom - 1) - -/* - * Struct defines - */ - -/* Fields are ordered for alignment/packing. */ -struct duk_activation { - duk_tval tv_func; /* borrowed: full duk_tval for function being executed; for lightfuncs */ - duk_hobject *func; /* borrowed: function being executed; for bound function calls, this is the final, real function, NULL for lightfuncs */ - duk_activation *parent; /* previous (parent) activation (or NULL if none) */ - duk_hobject *var_env; /* current variable environment (may be NULL if delayed) */ - duk_hobject *lex_env; /* current lexical environment (may be NULL if delayed) */ - duk_catcher *cat; /* current catcher (or NULL) */ - -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - /* Previous value of 'func' caller, restored when unwound. Only in use - * when 'func' is non-strict. - */ - duk_hobject *prev_caller; -#endif - - duk_instr_t *curr_pc; /* next instruction to execute (points to 'func' bytecode, stable pointer), NULL for native calls */ - - /* bottom_byteoff and retval_byteoff are only used for book-keeping - * of Ecmascript-initiated calls, to allow returning to an Ecmascript - * function properly. - */ - - /* Bottom of valstack for this activation, used to reset - * valstack_bottom on return; offset is absolute. There's - * no need to track 'top' because native call handling deals - * with that using locals, and for Ecmascript returns 'nregs' - * indicates the necessary top. - */ - duk_size_t bottom_byteoff; - - /* Return value when returning to this activation (points to caller - * reg, not callee reg); offset is absolute (only set if activation is - * not topmost). - * - * Note: bottom_byteoff is always set, while retval_byteoff is only - * applicable for activations below the topmost one. Currently - * retval_byteoff for the topmost activation is considered garbage - * (and it not initialized on entry or cleared on return; may contain - * previous or garbage values). - */ - duk_size_t retval_byteoff; - - /* Current 'this' binding is the value just below bottom. - * Previously, 'this' binding was handled with an index to the - * (calling) valstack. This works for everything except tail - * calls, which must not "accumulate" valstack temps. - */ - - /* Value stack reserve (valstack_end) byte offset to be restored - * when returning to this activation. Only used by the bytecode - * executor. - */ - duk_size_t reserve_byteoff; - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_uint32_t prev_line; /* needed for stepping */ -#endif - - duk_small_uint_t flags; -}; - -struct duk_catcher { - duk_catcher *parent; /* previous (parent) catcher (or NULL if none) */ - duk_hstring *h_varname; /* borrowed reference to catch variable name (or NULL if none) */ - /* (reference is valid as long activation exists) */ - duk_instr_t *pc_base; /* resume execution from pc_base or pc_base+1 (points to 'func' bytecode, stable pointer) */ - duk_size_t idx_base; /* idx_base and idx_base+1 get completion value and type */ - duk_uint32_t flags; /* type and control flags, label number */ - /* XXX: could pack 'flags' and 'idx_base' to same value in practice, - * on 32-bit targets this would make duk_catcher 16 bytes. - */ -}; - -struct duk_hthread { - /* Shared object part */ - duk_hobject obj; - - /* Pointer to bytecode executor's 'curr_pc' variable. Used to copy - * the current PC back into the topmost activation when activation - * state is about to change (or "syncing" is otherwise needed). This - * is rather awkward but important for performance, see execution.rst. - */ - duk_instr_t **ptr_curr_pc; - - /* Backpointers. */ - duk_heap *heap; - - /* Current strictness flag: affects API calls. */ - duk_uint8_t strict; - - /* Thread state. */ - duk_uint8_t state; - duk_uint8_t unused1; - duk_uint8_t unused2; - - /* XXX: Valstack and callstack are currently assumed to have non-NULL - * pointers. Relaxing this would not lead to big benefits (except - * perhaps for terminated threads). - */ - - /* Value stack: these are expressed as pointers for faster stack - * manipulation. [valstack,valstack_top[ is GC-reachable, - * [valstack_top,valstack_alloc_end[ is not GC-reachable but kept - * initialized as 'undefined'. [valstack,valstack_end[ is the - * guaranteed/reserved space and the valstack cannot be resized to - * a smaller size. [valstack_end,valstack_alloc_end[ is currently - * allocated slack that can be used to grow the current guaranteed - * space but may be shrunk away without notice. - * - * - * <----------------------- guaranteed ---> - * <---- slack ---> - * <--- frame ---> - * .-------------+=============+----------+--------------. - * |xxxxxxxxxxxxx|yyyyyyyyyyyyy|uuuuuuuuuu|uuuuuuuuuuuuuu| - * `-------------+=============+----------+--------------' - * - * ^ ^ ^ ^ ^ - * | | | | | - * valstack bottom top end alloc_end - * - * xxx = arbitrary values, below current frame - * yyy = arbitrary values, inside current frame - * uuu = outside active value stack, initialized to 'undefined' - */ - duk_tval *valstack; /* start of valstack allocation */ - duk_tval *valstack_end; /* end of valstack reservation/guarantee (exclusive) */ - duk_tval *valstack_alloc_end; /* end of valstack allocation */ - duk_tval *valstack_bottom; /* bottom of current frame */ - duk_tval *valstack_top; /* top of current frame (exclusive) */ - - /* Call stack, represented as a linked list starting from the current - * activation (or NULL if nothing is active). - */ - duk_activation *callstack_curr; /* current activation (or NULL if none) */ - duk_size_t callstack_top; /* number of activation records in callstack (0 if none) */ - duk_size_t callstack_preventcount; /* number of activation records in callstack preventing a yield */ - - /* Yield/resume book-keeping. */ - duk_hthread *resumer; /* who resumed us (if any) */ - - /* Current compiler state (if any), used for augmenting SyntaxErrors. */ - duk_compiler_ctx *compile_ctx; - -#if defined(DUK_USE_INTERRUPT_COUNTER) - /* Interrupt counter for triggering a slow path check for execution - * timeout, debugger interaction such as breakpoints, etc. The value - * is valid for the current running thread, and both the init and - * counter values are copied whenever a thread switch occurs. It's - * important for the counter to be conveniently accessible for the - * bytecode executor inner loop for performance reasons. - */ - duk_int_t interrupt_counter; /* countdown state */ - duk_int_t interrupt_init; /* start value for current countdown */ -#endif - - /* Builtin-objects; may or may not be shared with other threads, - * threads existing in different "compartments" will have different - * built-ins. Must be stored on a per-thread basis because there - * is no intermediate structure for a thread group / compartment. - * This takes quite a lot of space, currently 43x4 = 172 bytes on - * 32-bit platforms. - * - * In some cases the builtins array could be ROM based, but it's - * sometimes edited (e.g. for sandboxing) so it's better to keep - * this array in RAM. - */ - duk_hobject *builtins[DUK_NUM_BUILTINS]; - - /* Convenience copies from heap/vm for faster access. */ -#if defined(DUK_USE_ROM_STRINGS) - /* No field needed when strings are in ROM. */ -#else -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t *strs16; -#else - duk_hstring **strs; -#endif -#endif -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to); -DUK_INTERNAL_DECL void duk_hthread_create_builtin_objects(duk_hthread *thr); -DUK_INTERNAL_DECL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr); -DUK_INTERNAL_DECL void duk_hthread_terminate(duk_hthread *thr); - -DUK_INTERNAL_DECL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act); -DUK_INTERNAL_DECL void duk_hthread_activation_unwind_norz(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr); -DUK_INTERNAL_DECL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level); - -DUK_INTERNAL_DECL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat); -DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act); -DUK_INTERNAL_DECL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act); - -#if defined(DUK_USE_FINALIZER_TORTURE) -DUK_INTERNAL_DECL void duk_hthread_valstack_torture_realloc(duk_hthread *thr); -#endif - -DUK_INTERNAL_DECL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud); /* indirect allocs */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act); -#endif -DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act); -DUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_hthread_sync_and_null_currpc(duk_hthread *thr); - -#endif /* DUK_HTHREAD_H_INCLUDED */ -/* #include duk_harray.h */ -#line 1 "duk_harray.h" -/* - * Array object representation, used for actual Array instances. - * - * All objects with the exotic array behavior (which must coincide with having - * internal class array) MUST be duk_harrays. No other object can be a - * duk_harray. However, duk_harrays may not always have an array part. - */ - -#if !defined(DUK_HARRAY_H_INCLUDED) -#define DUK_HARRAY_H_INCLUDED - -#define DUK_ASSERT_HARRAY_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) (h))); \ - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY((duk_hobject *) (h))); \ - } while (0) - -#define DUK_HARRAY_LENGTH_WRITABLE(h) (!(h)->length_nonwritable) -#define DUK_HARRAY_LENGTH_NONWRITABLE(h) ((h)->length_nonwritable) -#define DUK_HARRAY_SET_LENGTH_WRITABLE(h) do { (h)->length_nonwritable = 0; } while (0) -#define DUK_HARRAY_SET_LENGTH_NONWRITABLE(h) do { (h)->length_nonwritable = 1; } while (0) - -struct duk_harray { - /* Shared object part. */ - duk_hobject obj; - - /* Array .length. - * - * At present Array .length may be smaller, equal, or even larger - * than the allocated underlying array part. Fast path code must - * always take this into account carefully. - */ - duk_uint32_t length; - - /* Array .length property attributes. The property is always - * non-enumerable and non-configurable. It's initially writable - * but per Object.defineProperty() rules it can be made non-writable - * even if it is non-configurable. Thus we need to track the - * writability explicitly. - * - * XXX: this field to be eliminated and moved into duk_hobject - * flags field to save space. - */ - duk_bool_t length_nonwritable; -}; - -#endif /* DUK_HARRAY_H_INCLUDED */ -/* #include duk_henv.h */ -#line 1 "duk_henv.h" -/* - * Environment object representation. - */ - -#if !defined(DUK_HENV_H_INCLUDED) -#define DUK_HENV_H_INCLUDED - -#define DUK_ASSERT_HDECENV_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) (h))); \ - DUK_ASSERT((h)->thread == NULL || (h)->varmap != NULL); \ - } while (0) - -#define DUK_ASSERT_HOBJENV_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT(DUK_HOBJECT_IS_OBJENV((duk_hobject *) (h))); \ - DUK_ASSERT((h)->target != NULL); \ - DUK_ASSERT((h)->has_this == 0 || (h)->has_this == 1); \ - } while (0) - -struct duk_hdecenv { - /* Shared object part. */ - duk_hobject obj; - - /* These control variables provide enough information to access live - * variables for a closure that is still open. If thread == NULL, - * the record is closed and the identifiers are in the property table. - */ - duk_hthread *thread; - duk_hobject *varmap; - duk_size_t regbase_byteoff; -}; - -struct duk_hobjenv { - /* Shared object part. */ - duk_hobject obj; - - /* Target object and 'this' binding for object binding. */ - duk_hobject *target; - - /* The 'target' object is used as a this binding in only some object - * environments. For example, the global environment does not provide - * a this binding, but a with statement does. - */ - duk_bool_t has_this; -}; - -#endif /* DUK_HENV_H_INCLUDED */ -/* #include duk_hbuffer.h */ -#line 1 "duk_hbuffer.h" -/* - * Heap buffer representation. - * - * Heap allocated user data buffer which is either: - * - * 1. A fixed size buffer (data follows header statically) - * 2. A dynamic size buffer (data pointer follows header) - * - * The data pointer for a variable size buffer of zero size may be NULL. - */ - -#if !defined(DUK_HBUFFER_H_INCLUDED) -#define DUK_HBUFFER_H_INCLUDED - -/* - * Flags - * - * Fixed buffer: 0 - * Dynamic buffer: DUK_HBUFFER_FLAG_DYNAMIC - * External buffer: DUK_HBUFFER_FLAG_DYNAMIC | DUK_HBUFFER_FLAG_EXTERNAL - */ - -#define DUK_HBUFFER_FLAG_DYNAMIC DUK_HEAPHDR_USER_FLAG(0) /* buffer is behind a pointer, dynamic or external */ -#define DUK_HBUFFER_FLAG_EXTERNAL DUK_HEAPHDR_USER_FLAG(1) /* buffer pointer is to an externally allocated buffer */ - -#define DUK_HBUFFER_HAS_DYNAMIC(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) -#define DUK_HBUFFER_HAS_EXTERNAL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) - -#define DUK_HBUFFER_SET_DYNAMIC(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) -#define DUK_HBUFFER_SET_EXTERNAL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) - -#define DUK_HBUFFER_CLEAR_DYNAMIC(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC) -#define DUK_HBUFFER_CLEAR_EXTERNAL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL) - -/* - * Misc defines - */ - -/* Impose a maximum buffer length for now. Restricted artificially to - * ensure resize computations or adding a heap header length won't - * overflow size_t and that a signed duk_int_t can hold a buffer - * length. The limit should be synchronized with DUK_HSTRING_MAX_BYTELEN. - */ - -#if defined(DUK_USE_BUFLEN16) -#define DUK_HBUFFER_MAX_BYTELEN (0x0000ffffUL) -#else -/* Intentionally not 0x7fffffffUL; at least JSON code expects that - * 2*len + 2 fits in 32 bits. - */ -#define DUK_HBUFFER_MAX_BYTELEN (0x7ffffffeUL) -#endif - -/* - * Field access - */ - -#if defined(DUK_USE_BUFLEN16) -/* size stored in duk_heaphdr unused flag bits */ -#define DUK_HBUFFER_GET_SIZE(x) ((x)->hdr.h_flags >> 16) -#define DUK_HBUFFER_SET_SIZE(x,v) do { \ - duk_size_t duk__v; \ - duk__v = (v); \ - DUK_ASSERT(duk__v <= 0xffffUL); \ - (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | (((duk_uint32_t) duk__v) << 16); \ - } while (0) -#define DUK_HBUFFER_ADD_SIZE(x,dv) do { \ - (x)->hdr.h_flags += ((dv) << 16); \ - } while (0) -#define DUK_HBUFFER_SUB_SIZE(x,dv) do { \ - (x)->hdr.h_flags -= ((dv) << 16); \ - } while (0) -#else -#define DUK_HBUFFER_GET_SIZE(x) (((duk_hbuffer *) (x))->size) -#define DUK_HBUFFER_SET_SIZE(x,v) do { \ - ((duk_hbuffer *) (x))->size = (v); \ - } while (0) -#define DUK_HBUFFER_ADD_SIZE(x,dv) do { \ - (x)->size += (dv); \ - } while (0) -#define DUK_HBUFFER_SUB_SIZE(x,dv) do { \ - (x)->size -= (dv); \ - } while (0) -#endif - -#define DUK_HBUFFER_FIXED_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) -#define DUK_HBUFFER_FIXED_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x)) - -#define DUK_HBUFFER_DYNAMIC_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) -#define DUK_HBUFFER_DYNAMIC_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v)) -#define DUK_HBUFFER_DYNAMIC_ADD_SIZE(x,dv) DUK_HBUFFER_ADD_SIZE((duk_hbuffer *) (x), (dv)) -#define DUK_HBUFFER_DYNAMIC_SUB_SIZE(x,dv) DUK_HBUFFER_SUB_SIZE((duk_hbuffer *) (x), (dv)) - -#define DUK_HBUFFER_EXTERNAL_GET_SIZE(x) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x)) -#define DUK_HBUFFER_EXTERNAL_SET_SIZE(x,v) DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v)) - -#define DUK_HBUFFER_FIXED_GET_DATA_PTR(heap,x) ((duk_uint8_t *) (((duk_hbuffer_fixed *) (x)) + 1)) - -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) \ - ((void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (x))->h_extra16)) -#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \ - ((duk_heaphdr *) (x))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \ - } while (0) -#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \ - ((duk_heaphdr *) (x))->h_extra16 = 0; /* assume 0 <=> NULL */ \ - } while (0) -#else -#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) ((x)->curr_alloc) -#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v) do { \ - (x)->curr_alloc = (void *) (v); \ - } while (0) -#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x) do { \ - (x)->curr_alloc = (void *) NULL; \ - } while (0) -#endif - -/* No pointer compression because pointer is potentially outside of - * Duktape heap. - */ -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \ - ((void *) (x)->curr_alloc) -#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \ - (x)->curr_alloc = (void *) (v); \ - } while (0) -#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \ - (x)->curr_alloc = (void *) NULL; \ - } while (0) -#else -#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \ - ((void *) (x)->curr_alloc) -#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v) do { \ - (x)->curr_alloc = (void *) (v); \ - } while (0) -#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x) do { \ - (x)->curr_alloc = (void *) NULL; \ - } while (0) -#endif - -/* Get a pointer to the current buffer contents (matching current allocation - * size). May be NULL for zero size dynamic/external buffer. - */ -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \ - DUK_HBUFFER_HAS_DYNAMIC((x)) ? \ - ( \ - DUK_HBUFFER_HAS_EXTERNAL((x)) ? \ - DUK_HBUFFER_EXTERNAL_GET_DATA_PTR((heap), (duk_hbuffer_external *) (x)) : \ - DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) \ - ) : \ - DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \ - ) -#else -/* Without heap pointer compression duk_hbuffer_dynamic and duk_hbuffer_external - * have the same layout so checking for fixed vs. dynamic (or external) is enough. - */ -#define DUK_HBUFFER_GET_DATA_PTR(heap,x) ( \ - DUK_HBUFFER_HAS_DYNAMIC((x)) ? \ - DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) : \ - DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \ - ) -#endif - -/* - * Structs - */ - -/* Shared prefix for all buffer types. */ -struct duk_hbuffer { - duk_heaphdr hdr; - - /* It's not strictly necessary to track the current size, but - * it is useful for writing robust native code. - */ - - /* Current size. */ -#if defined(DUK_USE_BUFLEN16) - /* Stored in duk_heaphdr unused flags. */ -#else - duk_size_t size; -#endif - - /* - * Data following the header depends on the DUK_HBUFFER_FLAG_DYNAMIC - * flag. - * - * If the flag is clear (the buffer is a fixed size one), the buffer - * data follows the header directly, consisting of 'size' bytes. - * - * If the flag is set, the actual buffer is allocated separately, and - * a few control fields follow the header. Specifically: - * - * - a "void *" pointing to the current allocation - * - a duk_size_t indicating the full allocated size (always >= 'size') - * - * If DUK_HBUFFER_FLAG_EXTERNAL is set, the buffer has been allocated - * by user code, so that Duktape won't be able to resize it and won't - * free it. This allows buffers to point to e.g. an externally - * allocated structure such as a frame buffer. - * - * Unlike strings, no terminator byte (NUL) is guaranteed after the - * data. This would be convenient, but would pad aligned user buffers - * unnecessarily upwards in size. For instance, if user code requested - * a 64-byte dynamic buffer, 65 bytes would actually be allocated which - * would then potentially round upwards to perhaps 68 or 72 bytes. - */ -}; - -/* Fixed buffer; data follows struct, with proper alignment guaranteed by - * struct size. - */ -#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA) -#pragma pack(push, 8) -#endif -struct duk_hbuffer_fixed { - /* A union is used here as a portable struct size / alignment trick: - * by adding a 32-bit or a 64-bit (unused) union member, the size of - * the struct is effectively forced to be a multiple of 4 or 8 bytes - * (respectively) without increasing the size of the struct unless - * necessary. - */ - union { - struct { - duk_heaphdr hdr; -#if defined(DUK_USE_BUFLEN16) - /* Stored in duk_heaphdr unused flags. */ -#else - duk_size_t size; -#endif - } s; -#if (DUK_USE_ALIGN_BY == 4) - duk_uint32_t dummy_for_align4; -#elif (DUK_USE_ALIGN_BY == 8) - duk_double_t dummy_for_align8; -#elif (DUK_USE_ALIGN_BY == 1) - /* no extra padding */ -#else -#error invalid DUK_USE_ALIGN_BY -#endif - } u; - - /* - * Data follows the struct header. The struct size is padded by the - * compiler based on the struct members. This guarantees that the - * buffer data will be aligned-by-4 but not necessarily aligned-by-8. - * - * On platforms where alignment does not matter, the struct padding - * could be removed (if there is any). On platforms where alignment - * by 8 is required, the struct size must be forced to be a multiple - * of 8 by some means. Without it, some user code may break, and also - * Duktape itself breaks (e.g. the compiler stores duk_tvals in a - * dynamic buffer). - */ -} -#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_GCC_ATTR) -__attribute__ ((aligned (8))) -#elif (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_CLANG_ATTR) -__attribute__ ((aligned (8))) -#endif -; -#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA) -#pragma pack(pop) -#endif - -/* Dynamic buffer with 'curr_alloc' pointing to a dynamic area allocated using - * heap allocation primitives. Also used for external buffers when low memory - * options are not used. - */ -struct duk_hbuffer_dynamic { - duk_heaphdr hdr; - -#if defined(DUK_USE_BUFLEN16) - /* Stored in duk_heaphdr unused flags. */ -#else - duk_size_t size; -#endif - -#if defined(DUK_USE_HEAPPTR16) - /* Stored in duk_heaphdr h_extra16. */ -#else - void *curr_alloc; /* may be NULL if alloc_size == 0 */ -#endif - - /* - * Allocation size for 'curr_alloc' is alloc_size. There is no - * automatic NUL terminator for buffers (see above for rationale). - * - * 'curr_alloc' is explicitly allocated with heap allocation - * primitives and will thus always have alignment suitable for - * e.g. duk_tval and an IEEE double. - */ -}; - -/* External buffer with 'curr_alloc' managed by user code and pointing to an - * arbitrary address. When heap pointer compression is not used, this struct - * has the same layout as duk_hbuffer_dynamic. - */ -struct duk_hbuffer_external { - duk_heaphdr hdr; - -#if defined(DUK_USE_BUFLEN16) - /* Stored in duk_heaphdr unused flags. */ -#else - duk_size_t size; -#endif - - /* Cannot be compressed as a heap pointer because may point to - * an arbitrary address. - */ - void *curr_alloc; /* may be NULL if alloc_size == 0 */ -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata); -DUK_INTERNAL_DECL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud); /* indirect allocs */ - -/* dynamic buffer ops */ -DUK_INTERNAL_DECL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size); -DUK_INTERNAL_DECL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf); - -#endif /* DUK_HBUFFER_H_INCLUDED */ -/* #include duk_hproxy.h */ -#line 1 "duk_hproxy.h" -/* - * Proxy object representation. - */ - -#if !defined(DUK_HPROXY_H_INCLUDED) -#define DUK_HPROXY_H_INCLUDED - -#define DUK_ASSERT_HPROXY_VALID(h) do { \ - DUK_ASSERT((h) != NULL); \ - DUK_ASSERT((h)->target != NULL); \ - DUK_ASSERT((h)->handler != NULL); \ - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((duk_hobject *) (h))); \ - } while (0) - -struct duk_hproxy { - /* Shared object part. */ - duk_hobject obj; - - /* Proxy target object. */ - duk_hobject *target; - - /* Proxy handlers (traps). */ - duk_hobject *handler; -}; - -#endif /* DUK_HPROXY_H_INCLUDED */ -/* #include duk_heap.h */ -#line 1 "duk_heap.h" -/* - * Heap structure. - * - * Heap contains allocated heap objects, interned strings, and built-in - * strings for one or more threads. - */ - -#if !defined(DUK_HEAP_H_INCLUDED) -#define DUK_HEAP_H_INCLUDED - -/* alloc function typedefs in duktape.h */ - -/* - * Heap flags - */ - -#define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED (1U << 0) /* mark-and-sweep marking reached a recursion limit and must use multi-pass marking */ -#define DUK_HEAP_FLAG_INTERRUPT_RUNNING (1U << 1) /* executor interrupt running (used to avoid nested interrupts) */ -#define DUK_HEAP_FLAG_FINALIZER_NORESCUE (1U << 2) /* heap destruction ongoing, finalizer rescue no longer possible */ -#define DUK_HEAP_FLAG_DEBUGGER_PAUSED (1U << 3) /* debugger is paused: talk with debug client until step/resume */ - -#define DUK__HEAP_HAS_FLAGS(heap,bits) ((heap)->flags & (bits)) -#define DUK__HEAP_SET_FLAGS(heap,bits) do { \ - (heap)->flags |= (bits); \ - } while (0) -#define DUK__HEAP_CLEAR_FLAGS(heap,bits) do { \ - (heap)->flags &= ~(bits); \ - } while (0) - -#define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) -#define DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) - -#define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_SET_INTERRUPT_RUNNING(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_SET_FINALIZER_NORESCUE(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) -#define DUK_HEAP_SET_DEBUGGER_PAUSED(heap) DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) - -#define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED) -#define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING) -#define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE) -#define DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED) - -/* - * Longjmp types, also double as identifying continuation type for a rethrow (in 'finally') - */ - -#define DUK_LJ_TYPE_UNKNOWN 0 /* unused */ -#define DUK_LJ_TYPE_THROW 1 /* value1 -> error object */ -#define DUK_LJ_TYPE_YIELD 2 /* value1 -> yield value, iserror -> error / normal */ -#define DUK_LJ_TYPE_RESUME 3 /* value1 -> resume value, value2 -> resumee thread, iserror -> error/normal */ -#define DUK_LJ_TYPE_BREAK 4 /* value1 -> label number, pseudo-type to indicate a break continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_CONTINUE 5 /* value1 -> label number, pseudo-type to indicate a continue continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_RETURN 6 /* value1 -> return value, pseudo-type to indicate a return continuation (for ENDFIN) */ -#define DUK_LJ_TYPE_NORMAL 7 /* no value, pseudo-type to indicate a normal continuation (for ENDFIN) */ - -/* - * Mark-and-sweep flags - * - * These are separate from heap level flags now but could be merged. - * The heap structure only contains a 'base mark-and-sweep flags' - * field and the GC caller can impose further flags. - */ - -/* Emergency mark-and-sweep: try extra hard, even at the cost of - * performance. - */ -#define DUK_MS_FLAG_EMERGENCY (1U << 0) - -/* Voluntary mark-and-sweep: triggered periodically. */ -#define DUK_MS_FLAG_VOLUNTARY (1U << 1) - -/* Postpone rescue decisions for reachable objects with FINALIZED set. - * Used during finalize_list processing to avoid incorrect rescue - * decisions due to finalize_list being a reachability root. - */ -#define DUK_MS_FLAG_POSTPONE_RESCUE (1U << 2) - -/* Don't compact objects; needed during object property table resize - * to prevent a recursive resize. It would suffice to protect only the - * current object being resized, but this is not yet implemented. - */ -#define DUK_MS_FLAG_NO_OBJECT_COMPACTION (1U << 3) - -/* - * Thread switching - * - * To switch heap->curr_thread, use the macro below so that interrupt counters - * get updated correctly. The macro allows a NULL target thread because that - * happens e.g. in call handling. - */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) -#define DUK_HEAP_SWITCH_THREAD(heap,newthr) duk_heap_switch_thread((heap), (newthr)) -#else -#define DUK_HEAP_SWITCH_THREAD(heap,newthr) do { \ - (heap)->curr_thread = (newthr); \ - } while (0) -#endif - -/* - * Stats - */ - -#if defined(DUK_USE_DEBUG) -#define DUK_STATS_INC(heap,fieldname) do { \ - (heap)->fieldname += 1; \ - } while (0) -#else -#define DUK_STATS_INC(heap,fieldname) do {} while (0) -#endif - -/* - * Other heap related defines - */ - -/* Mark-and-sweep interval is relative to combined count of objects and - * strings kept in the heap during the latest mark-and-sweep pass. - * Fixed point .8 multiplier and .0 adder. Trigger count (interval) is - * decreased by each (re)allocation attempt (regardless of size), and each - * refzero processed object. - * - * 'SKIP' indicates how many (re)allocations to wait until a retry if - * GC is skipped because there is no thread do it with yet (happens - * only during init phases). - */ -#if defined(DUK_USE_REFERENCE_COUNTING) -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 12800L /* 50x heap size */ -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L -#else -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT 256L /* 1x heap size */ -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD 1024L -#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP 256L -#endif - -/* GC torture. */ -#if defined(DUK_USE_GC_TORTURE) -#define DUK_GC_TORTURE(heap) do { duk_heap_mark_and_sweep((heap), 0); } while (0) -#else -#define DUK_GC_TORTURE(heap) do { } while (0) -#endif - -/* Stringcache is used for speeding up char-offset-to-byte-offset - * translations for non-ASCII strings. - */ -#define DUK_HEAP_STRCACHE_SIZE 4 -#define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT 16 /* strings up to the this length are not cached */ - -/* Some list management macros. */ -#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr) duk_heap_insert_into_heap_allocated((heap), (hdr)) -#if defined(DUK_USE_REFERENCE_COUNTING) -#define DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap,hdr) duk_heap_remove_from_heap_allocated((heap), (hdr)) -#endif -#if defined(DUK_USE_FINALIZER_SUPPORT) -#define DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap,hdr) duk_heap_insert_into_finalize_list((heap), (hdr)) -#define DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap,hdr) duk_heap_remove_from_finalize_list((heap), (hdr)) -#endif - -/* - * Built-in strings - */ - -/* heap string indices are autogenerated in duk_strings.h */ -#if defined(DUK_USE_ROM_STRINGS) -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)])) -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)])) -#else -#define DUK_HEAP_GET_STRING(heap,idx) \ - ((heap)->strs[(idx)]) -#endif -#endif /* DUK_USE_ROM_STRINGS */ - -/* - * Raw memory calls: relative to heap, but no GC interaction - */ - -#define DUK_ALLOC_RAW(heap,size) \ - ((heap)->alloc_func((heap)->heap_udata, (size))) - -#define DUK_REALLOC_RAW(heap,ptr,newsize) \ - ((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize))) - -#define DUK_FREE_RAW(heap,ptr) \ - ((heap)->free_func((heap)->heap_udata, (void *) (ptr))) - -/* - * Memory calls: relative to heap, GC interaction, but no error throwing. - * - * XXX: Currently a mark-and-sweep triggered by memory allocation will run - * using the heap->heap_thread. This thread is also used for running - * mark-and-sweep finalization; this is not ideal because it breaks the - * isolation between multiple global environments. - * - * Notes: - * - * - DUK_FREE() is required to ignore NULL and any other possible return - * value of a zero-sized alloc/realloc (same as ANSI C free()). - * - * - There is no DUK_REALLOC_ZEROED because we don't assume to know the - * old size. Caller must zero the reallocated memory. - * - * - DUK_REALLOC_INDIRECT() must be used when a mark-and-sweep triggered - * by an allocation failure might invalidate the original 'ptr', thus - * causing a realloc retry to use an invalid pointer. Example: we're - * reallocating the value stack and a finalizer resizes the same value - * stack during mark-and-sweep. The indirect variant requests for the - * current location of the pointer being reallocated using a callback - * right before every realloc attempt; this circuitous approach is used - * to avoid strict aliasing issues in a more straightforward indirect - * pointer (void **) approach. Note: the pointer in the storage - * location is read but is NOT updated; the caller must do that. - */ - -/* callback for indirect reallocs, request for current pointer */ -typedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud); - -#define DUK_ALLOC(heap,size) duk_heap_mem_alloc((heap), (size)) -#define DUK_ALLOC_ZEROED(heap,size) duk_heap_mem_alloc_zeroed((heap), (size)) -#define DUK_REALLOC(heap,ptr,newsize) duk_heap_mem_realloc((heap), (ptr), (newsize)) -#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize) duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize)) -#define DUK_FREE(heap,ptr) duk_heap_mem_free((heap), (ptr)) - -/* - * Checked allocation, relative to a thread - * - * DUK_FREE_CHECKED() doesn't actually throw, but accepts a 'thr' argument - * for convenience. - */ - -#define DUK_ALLOC_CHECKED(thr,size) duk_heap_mem_alloc_checked((thr), (size)) -#define DUK_ALLOC_CHECKED_ZEROED(thr,size) duk_heap_mem_alloc_checked_zeroed((thr), (size)) -#define DUK_FREE_CHECKED(thr,ptr) duk_heap_mem_free((thr)->heap, (ptr)) - -/* - * Memory constants - */ - -#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT 10 /* Retry allocation after mark-and-sweep for this - * many times. A single mark-and-sweep round is - * not guaranteed to free all unreferenced memory - * because of finalization (in fact, ANY number of - * rounds is strictly not enough). - */ - -#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT 3 /* Starting from this round, use emergency mode - * for mark-and-sweep. - */ - -/* - * Debugger support - */ - -/* Maximum number of breakpoints. Only breakpoints that are set are - * consulted so increasing this has no performance impact. - */ -#define DUK_HEAP_MAX_BREAKPOINTS 16 - -/* Opcode interval for a Date-based status/peek rate limit check. Only - * relevant when debugger is attached. Requesting a timestamp may be a - * slow operation on some platforms so this shouldn't be too low. On the - * other hand a high value makes Duktape react to a pause request slowly. - */ -#define DUK_HEAP_DBG_RATELIMIT_OPCODES 4000 - -/* Milliseconds between status notify and transport peeks. */ -#define DUK_HEAP_DBG_RATELIMIT_MILLISECS 200 - -/* Debugger pause flags. */ -#define DUK_PAUSE_FLAG_ONE_OPCODE (1U << 0) /* pause when a single opcode has been executed */ -#define DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE (1U << 1) /* one opcode pause actually active; artifact of current implementation */ -#define DUK_PAUSE_FLAG_LINE_CHANGE (1U << 2) /* pause when current line number changes */ -#define DUK_PAUSE_FLAG_FUNC_ENTRY (1U << 3) /* pause when entering a function */ -#define DUK_PAUSE_FLAG_FUNC_EXIT (1U << 4) /* pause when exiting current function */ -#define DUK_PAUSE_FLAG_CAUGHT_ERROR (1U << 5) /* pause when about to throw an error that is caught */ -#define DUK_PAUSE_FLAG_UNCAUGHT_ERROR (1U << 6) /* pause when about to throw an error that won't be caught */ - -struct duk_breakpoint { - duk_hstring *filename; - duk_uint32_t line; -}; - -/* - * String cache should ideally be at duk_hthread level, but that would - * cause string finalization to slow down relative to the number of - * threads; string finalization must check the string cache for "weak" - * references to the string being finalized to avoid dead pointers. - * - * Thus, string caches are now at the heap level now. - */ - -struct duk_strcache { - duk_hstring *h; - duk_uint32_t bidx; - duk_uint32_t cidx; -}; - -/* - * Longjmp state, contains the information needed to perform a longjmp. - * Longjmp related values are written to value1, value2, and iserror. - */ - -struct duk_ljstate { - duk_jmpbuf *jmpbuf_ptr; /* current setjmp() catchpoint */ - duk_small_uint_t type; /* longjmp type */ - duk_bool_t iserror; /* isError flag for yield */ - duk_tval value1; /* 1st related value (type specific) */ - duk_tval value2; /* 2nd related value (type specific) */ -}; - -#define DUK_ASSERT_LJSTATE_UNSET(heap) do { \ - DUK_ASSERT(heap != NULL); \ - DUK_ASSERT(heap->lj.type == DUK_LJ_TYPE_UNKNOWN); \ - DUK_ASSERT(heap->lj.iserror == 0); \ - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value1)); \ - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value2)); \ - } while (0) -#define DUK_ASSERT_LJSTATE_SET(heap) do { \ - DUK_ASSERT(heap != NULL); \ - DUK_ASSERT(heap->lj.type != DUK_LJ_TYPE_UNKNOWN); \ - } while (0) - -/* - * Main heap structure - */ - -struct duk_heap { - duk_small_uint_t flags; - - /* Allocator functions. */ - duk_alloc_function alloc_func; - duk_realloc_function realloc_func; - duk_free_function free_func; - - /* Heap udata, used for allocator functions but also for other heap - * level callbacks like fatal function, pointer compression, etc. - */ - void *heap_udata; - - /* Fatal error handling, called e.g. when a longjmp() is needed but - * lj.jmpbuf_ptr is NULL. fatal_func must never return; it's not - * declared as "noreturn" because doing that for typedefs is a bit - * challenging portability-wise. - */ - duk_fatal_function fatal_func; - - /* Main list of allocated heap objects. Objects are either here, - * in finalize_list waiting for processing, or in refzero_list - * temporarily while a DECREF refzero cascade finishes. - */ - duk_heaphdr *heap_allocated; - - /* Temporary work list for freeing a cascade of objects when a DECREF - * (or DECREF_NORZ) encounters a zero refcount. Using a work list - * allows fixed C stack size when refcounts go to zero for a chain of - * objects. Outside of DECREF this is always a NULL because DECREF is - * processed without side effects (only memory free calls). - */ -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_heaphdr *refzero_list; -#endif - -#if defined(DUK_USE_FINALIZER_SUPPORT) - /* Work list for objects to be finalized. */ - duk_heaphdr *finalize_list; -#if defined(DUK_USE_ASSERTIONS) - /* Object whose finalizer is executing right now (no nesting). */ - duk_heaphdr *currently_finalizing; -#endif -#endif - - /* Freelist for duk_activations and duk_catchers. */ -#if defined(DUK_USE_CACHE_ACTIVATION) - duk_activation *activation_free; -#endif -#if defined(DUK_USE_CACHE_CATCHER) - duk_catcher *catcher_free; -#endif - - /* Voluntary mark-and-sweep trigger counter. Intentionally signed - * because we continue decreasing the value when voluntary GC cannot - * run. - */ -#if defined(DUK_USE_VOLUNTARY_GC) - duk_int_t ms_trigger_counter; -#endif - - /* Mark-and-sweep recursion control: too deep recursion causes - * multi-pass processing to avoid growing C stack without bound. - */ - duk_uint_t ms_recursion_depth; - - /* Mark-and-sweep flags automatically active (used for critical sections). */ - duk_small_uint_t ms_base_flags; - - /* Mark-and-sweep running flag. Prevents re-entry, and also causes - * refzero events to be ignored (= objects won't be queued to refzero_list). - */ - duk_uint_t ms_running; - - /* Mark-and-sweep prevent count, stacking. Used to avoid M&S side - * effects (besides finalizers which are controlled separately) such - * as compacting the string table or object property tables. This - * is also bumped when ms_running is set to prevent recursive re-entry. - * Can also be bumped when mark-and-sweep is not running. - */ - duk_uint_t ms_prevent_count; - - /* Finalizer processing prevent count, stacking. Bumped when finalizers - * are processed to prevent recursive finalizer processing (first call site - * processing finalizers handles all finalizers until the list is empty). - * Can also be bumped explicitly to prevent finalizer execution. - */ - duk_uint_t pf_prevent_count; - - /* When processing finalize_list, don't actually run finalizers but - * queue finalizable objects back to heap_allocated as is. This is - * used during heap destruction to deal with finalizers that keep - * on creating more finalizable garbage. - */ - duk_uint_t pf_skip_finalizers; - -#if defined(DUK_USE_ASSERTIONS) - /* Set when we're in a critical path where an error throw would cause - * e.g. sandboxing/protected call violations or state corruption. This - * is just used for asserts. - */ - duk_bool_t error_not_allowed; -#endif - -#if defined(DUK_USE_ASSERTIONS) - /* Set when heap is still being initialized, helps with writing - * some assertions. - */ - duk_bool_t heap_initializing; -#endif - - /* Marker for detecting internal "double faults", errors thrown when - * we're trying to create an error object, see duk_error_throw.c. - */ - duk_bool_t creating_error; - - /* Marker for indicating we're calling a user error augmentation - * (errCreate/errThrow) function. Errors created/thrown during - * such a call are not augmented. - */ -#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) - duk_bool_t augmenting_error; -#endif - - /* Longjmp state. */ - duk_ljstate lj; - - /* Heap thread, used internally and for finalization. */ - duk_hthread *heap_thread; - - /* Current running thread. */ - duk_hthread *curr_thread; - - /* Heap level "stash" object (e.g., various reachability roots). */ - duk_hobject *heap_object; - - /* duk_handle_call / duk_handle_safe_call recursion depth limiting */ - duk_int_t call_recursion_depth; - duk_int_t call_recursion_limit; - - /* Mix-in value for computing string hashes; should be reasonably unpredictable. */ - duk_uint32_t hash_seed; - - /* Random number state for duk_util_tinyrandom.c. */ -#if !defined(DUK_USE_GET_RANDOM_DOUBLE) -#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) - duk_uint32_t rnd_state; /* State for Shamir's three-op algorithm */ -#else - duk_uint64_t rnd_state[2]; /* State for xoroshiro128+ */ -#endif -#endif - - /* Counter for unique local symbol creation. */ - /* XXX: When 64-bit types are available, it would be more efficient to - * use a duk_uint64_t at least for incrementing but maybe also for - * string formatting in the Symbol constructor. - */ - duk_uint32_t sym_counter[2]; - - /* For manual debugging: instruction count based on executor and - * interrupt counter book-keeping. Inspect debug logs to see how - * they match up. - */ -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) - duk_int_t inst_count_exec; - duk_int_t inst_count_interrupt; -#endif - - /* Debugger state. */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* Callbacks and udata; dbg_read_cb != NULL is used to indicate attached state. */ - duk_debug_read_function dbg_read_cb; /* required, NULL implies detached */ - duk_debug_write_function dbg_write_cb; /* required */ - duk_debug_peek_function dbg_peek_cb; - duk_debug_read_flush_function dbg_read_flush_cb; - duk_debug_write_flush_function dbg_write_flush_cb; - duk_debug_request_function dbg_request_cb; - duk_debug_detached_function dbg_detached_cb; - void *dbg_udata; - - /* The following are only relevant when debugger is attached. */ - duk_bool_t dbg_processing; /* currently processing messages or breakpoints: don't enter message processing recursively (e.g. no breakpoints when processing debugger eval) */ - duk_bool_t dbg_state_dirty; /* resend state next time executor is about to run */ - duk_bool_t dbg_force_restart; /* force executor restart to recheck breakpoints; used to handle function returns (see GH-303) */ - duk_bool_t dbg_detaching; /* debugger detaching; used to avoid calling detach handler recursively */ - duk_small_uint_t dbg_pause_flags; /* flags for automatic pause behavior */ - duk_activation *dbg_pause_act; /* activation related to pause behavior (pause on line change, function entry/exit) */ - duk_uint32_t dbg_pause_startline; /* starting line number for line change related pause behavior */ - duk_breakpoint dbg_breakpoints[DUK_HEAP_MAX_BREAKPOINTS]; /* breakpoints: [0,breakpoint_count[ gc reachable */ - duk_small_uint_t dbg_breakpoint_count; - duk_breakpoint *dbg_breakpoints_active[DUK_HEAP_MAX_BREAKPOINTS + 1]; /* currently active breakpoints: NULL term, borrowed pointers */ - /* XXX: make active breakpoints actual copies instead of pointers? */ - - /* These are for rate limiting Status notifications and transport peeking. */ - duk_uint_t dbg_exec_counter; /* cumulative opcode execution count (overflows are OK) */ - duk_uint_t dbg_last_counter; /* value of dbg_exec_counter when we last did a Date-based check */ - duk_double_t dbg_last_time; /* time when status/peek was last done (Date-based rate limit) */ - - /* Used to support single-byte stream lookahead. */ - duk_bool_t dbg_have_next_byte; - duk_uint8_t dbg_next_byte; -#endif /* DUK_USE_DEBUGGER_SUPPORT */ -#if defined(DUK_USE_ASSERTIONS) - duk_bool_t dbg_calling_transport; /* transport call in progress, calling into Duktape forbidden */ -#endif - - /* String intern table (weak refs). */ -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *strtable16; -#else - duk_hstring **strtable; -#endif - duk_uint32_t st_mask; /* mask for lookup, st_size - 1 */ - duk_uint32_t st_size; /* stringtable size */ -#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE) - duk_uint32_t st_count; /* string count for resize load factor checks */ -#endif - duk_bool_t st_resizing; /* string table is being resized; avoid recursive resize */ - - /* String access cache (codepoint offset -> byte offset) for fast string - * character looping; 'weak' reference which needs special handling in GC. - */ - duk_strcache strcache[DUK_HEAP_STRCACHE_SIZE]; - - /* Built-in strings. */ -#if defined(DUK_USE_ROM_STRINGS) - /* No field needed when strings are in ROM. */ -#else -#if defined(DUK_USE_HEAPPTR16) - duk_uint16_t strs16[DUK_HEAP_NUM_STRINGS]; -#else - duk_hstring *strs[DUK_HEAP_NUM_STRINGS]; -#endif -#endif - - /* Stats. */ -#if defined(DUK_USE_DEBUG) - duk_int_t stats_exec_opcodes; - duk_int_t stats_exec_interrupt; - duk_int_t stats_exec_throw; - duk_int_t stats_call_all; - duk_int_t stats_call_tailcall; - duk_int_t stats_call_ecmatoecma; - duk_int_t stats_safecall_all; - duk_int_t stats_safecall_nothrow; - duk_int_t stats_safecall_throw; - duk_int_t stats_ms_try_count; - duk_int_t stats_ms_skip_count; - duk_int_t stats_ms_emergency_count; - duk_int_t stats_strtab_intern_hit; - duk_int_t stats_strtab_intern_miss; - duk_int_t stats_strtab_resize_check; - duk_int_t stats_strtab_resize_grow; - duk_int_t stats_strtab_resize_shrink; - duk_int_t stats_object_realloc_props; - duk_int_t stats_object_abandon_array; - duk_int_t stats_getownpropdesc_count; - duk_int_t stats_getownpropdesc_hit; - duk_int_t stats_getownpropdesc_miss; - duk_int_t stats_getpropdesc_count; - duk_int_t stats_getpropdesc_hit; - duk_int_t stats_getpropdesc_miss; - duk_int_t stats_getprop_all; - duk_int_t stats_getprop_arrayidx; - duk_int_t stats_getprop_bufobjidx; - duk_int_t stats_getprop_bufferidx; - duk_int_t stats_getprop_bufferlen; - duk_int_t stats_getprop_stringidx; - duk_int_t stats_getprop_stringlen; - duk_int_t stats_getprop_proxy; - duk_int_t stats_getprop_arguments; - duk_int_t stats_putprop_all; - duk_int_t stats_putprop_arrayidx; - duk_int_t stats_putprop_bufobjidx; - duk_int_t stats_putprop_bufferidx; - duk_int_t stats_putprop_proxy; - duk_int_t stats_getvar_all; - duk_int_t stats_putvar_all; -#endif -}; - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL -duk_heap *duk_heap_alloc(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *heap_udata, - duk_fatal_function fatal_func); -DUK_INTERNAL_DECL void duk_heap_free(duk_heap *heap); -DUK_INTERNAL_DECL void duk_free_hobject(duk_heap *heap, duk_hobject *h); -DUK_INTERNAL_DECL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h); -DUK_INTERNAL_DECL void duk_free_hstring(duk_heap *heap, duk_hstring *h); -DUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr); - -DUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL_DECL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr); -#endif -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL_DECL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr); -DUK_INTERNAL_DECL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr); -#endif -#if defined(DUK_USE_ASSERTIONS) -DUK_INTERNAL_DECL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr); -#endif -#if defined(DUK_USE_INTERRUPT_COUNTER) -DUK_INTERNAL_DECL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr); -#endif - -DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen); -DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len); -DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val); -DUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val); -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL_DECL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h); -#endif -DUK_INTERNAL_DECL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev); -DUK_INTERNAL_DECL void duk_heap_strtable_force_resize(duk_heap *heap); -DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap); -#if defined(DUK_USE_DEBUG) -DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap); -#endif - -DUK_INTERNAL_DECL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h); -DUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset); - -#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) -DUK_INTERNAL_DECL void *duk_default_alloc_function(void *udata, duk_size_t size); -DUK_INTERNAL_DECL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize); -DUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr); -#endif - -DUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size); -DUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize); -DUK_INTERNAL_DECL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize); -DUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr); - -DUK_INTERNAL_DECL void duk_heap_free_freelists(duk_heap *heap); - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL_DECL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj); -DUK_INTERNAL_DECL void duk_heap_process_finalize_list(duk_heap *heap); -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -DUK_INTERNAL_DECL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags); - -DUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len); - -#endif /* DUK_HEAP_H_INCLUDED */ -/* #include duk_debugger.h */ -#line 1 "duk_debugger.h" -#if !defined(DUK_DEBUGGER_H_INCLUDED) -#define DUK_DEBUGGER_H_INCLUDED - -/* Debugger protocol version is defined in the public API header. */ - -/* Initial bytes for markers. */ -#define DUK_DBG_IB_EOM 0x00 -#define DUK_DBG_IB_REQUEST 0x01 -#define DUK_DBG_IB_REPLY 0x02 -#define DUK_DBG_IB_ERROR 0x03 -#define DUK_DBG_IB_NOTIFY 0x04 - -/* Other initial bytes. */ -#define DUK_DBG_IB_INT4 0x10 -#define DUK_DBG_IB_STR4 0x11 -#define DUK_DBG_IB_STR2 0x12 -#define DUK_DBG_IB_BUF4 0x13 -#define DUK_DBG_IB_BUF2 0x14 -#define DUK_DBG_IB_UNUSED 0x15 -#define DUK_DBG_IB_UNDEFINED 0x16 -#define DUK_DBG_IB_NULL 0x17 -#define DUK_DBG_IB_TRUE 0x18 -#define DUK_DBG_IB_FALSE 0x19 -#define DUK_DBG_IB_NUMBER 0x1a -#define DUK_DBG_IB_OBJECT 0x1b -#define DUK_DBG_IB_POINTER 0x1c -#define DUK_DBG_IB_LIGHTFUNC 0x1d -#define DUK_DBG_IB_HEAPPTR 0x1e -/* The short string/integer initial bytes starting from 0x60 don't have - * defines now. - */ - -/* Error codes. */ -#define DUK_DBG_ERR_UNKNOWN 0x00 -#define DUK_DBG_ERR_UNSUPPORTED 0x01 -#define DUK_DBG_ERR_TOOMANY 0x02 -#define DUK_DBG_ERR_NOTFOUND 0x03 -#define DUK_DBG_ERR_APPLICATION 0x04 - -/* Commands and notifys initiated by Duktape. */ -#define DUK_DBG_CMD_STATUS 0x01 -#define DUK_DBG_CMD_UNUSED_2 0x02 /* Duktape 1.x: print notify */ -#define DUK_DBG_CMD_UNUSED_3 0x03 /* Duktape 1.x: alert notify */ -#define DUK_DBG_CMD_UNUSED_4 0x04 /* Duktape 1.x: log notify */ -#define DUK_DBG_CMD_THROW 0x05 -#define DUK_DBG_CMD_DETACHING 0x06 -#define DUK_DBG_CMD_APPNOTIFY 0x07 - -/* Commands initiated by debug client. */ -#define DUK_DBG_CMD_BASICINFO 0x10 -#define DUK_DBG_CMD_TRIGGERSTATUS 0x11 -#define DUK_DBG_CMD_PAUSE 0x12 -#define DUK_DBG_CMD_RESUME 0x13 -#define DUK_DBG_CMD_STEPINTO 0x14 -#define DUK_DBG_CMD_STEPOVER 0x15 -#define DUK_DBG_CMD_STEPOUT 0x16 -#define DUK_DBG_CMD_LISTBREAK 0x17 -#define DUK_DBG_CMD_ADDBREAK 0x18 -#define DUK_DBG_CMD_DELBREAK 0x19 -#define DUK_DBG_CMD_GETVAR 0x1a -#define DUK_DBG_CMD_PUTVAR 0x1b -#define DUK_DBG_CMD_GETCALLSTACK 0x1c -#define DUK_DBG_CMD_GETLOCALS 0x1d -#define DUK_DBG_CMD_EVAL 0x1e -#define DUK_DBG_CMD_DETACH 0x1f -#define DUK_DBG_CMD_DUMPHEAP 0x20 -#define DUK_DBG_CMD_GETBYTECODE 0x21 -#define DUK_DBG_CMD_APPREQUEST 0x22 -#define DUK_DBG_CMD_GETHEAPOBJINFO 0x23 -#define DUK_DBG_CMD_GETOBJPROPDESC 0x24 -#define DUK_DBG_CMD_GETOBJPROPDESCRANGE 0x25 - -/* The low 8 bits map directly to duk_hobject.h DUK_PROPDESC_FLAG_xxx. - * The remaining flags are specific to the debugger. - */ -#define DUK_DBG_PROPFLAG_SYMBOL (1U << 8) -#define DUK_DBG_PROPFLAG_HIDDEN (1U << 9) - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_INTERNAL_DECL void duk_debug_do_detach(duk_heap *heap); - -DUK_INTERNAL_DECL duk_bool_t duk_debug_read_peek(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_debug_write_flush(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length); -DUK_INTERNAL_DECL void duk_debug_skip_byte(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length); -DUK_INTERNAL_DECL duk_uint8_t duk_debug_read_byte(duk_hthread *thr); -DUK_INTERNAL_DECL duk_int32_t duk_debug_read_int(duk_hthread *thr); -DUK_INTERNAL_DECL duk_hstring *duk_debug_read_hstring(duk_hthread *thr); -/* XXX: exposed duk_debug_read_pointer */ -/* XXX: exposed duk_debug_read_buffer */ -/* XXX: exposed duk_debug_read_hbuffer */ -#if 0 -DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr); -#endif -#if defined(DUK_USE_DEBUGGER_INSPECT) -DUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr); -#endif -DUK_INTERNAL_DECL duk_tval *duk_debug_read_tval(duk_hthread *thr); - -DUK_INTERNAL_DECL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length); -DUK_INTERNAL_DECL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x); -DUK_INTERNAL_DECL void duk_debug_write_unused(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_debug_write_undefined(duk_hthread *thr); -#if defined(DUK_USE_DEBUGGER_INSPECT) -DUK_INTERNAL_DECL void duk_debug_write_null(duk_hthread *thr); -#endif -DUK_INTERNAL_DECL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val); -DUK_INTERNAL_DECL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x); -DUK_INTERNAL_DECL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x); -DUK_INTERNAL_DECL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length); -DUK_INTERNAL_DECL void duk_debug_write_cstring(duk_hthread *thr, const char *data); -DUK_INTERNAL_DECL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h); -DUK_INTERNAL_DECL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length); -DUK_INTERNAL_DECL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h); -DUK_INTERNAL_DECL void duk_debug_write_pointer(duk_hthread *thr, void *ptr); -#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT) -DUK_INTERNAL_DECL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h); -#endif -DUK_INTERNAL_DECL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj); -DUK_INTERNAL_DECL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv); -#if 0 /* unused */ -DUK_INTERNAL_DECL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command); -#endif -DUK_INTERNAL_DECL void duk_debug_write_reply(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg); -DUK_INTERNAL_DECL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command); -DUK_INTERNAL_DECL void duk_debug_write_eom(duk_hthread *thr); - -DUK_INTERNAL_DECL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr); -DUK_INTERNAL_DECL void duk_debug_send_status(duk_hthread *thr); -#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) -DUK_INTERNAL_DECL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal); -#endif - -DUK_INTERNAL_DECL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc); -DUK_INTERNAL_DECL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block); - -DUK_INTERNAL_DECL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line); -DUK_INTERNAL_DECL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index); - -DUK_INTERNAL_DECL duk_bool_t duk_debug_is_attached(duk_heap *heap); -DUK_INTERNAL_DECL duk_bool_t duk_debug_is_paused(duk_heap *heap); -DUK_INTERNAL_DECL void duk_debug_set_paused(duk_heap *heap); -DUK_INTERNAL_DECL void duk_debug_clear_paused(duk_heap *heap); -DUK_INTERNAL_DECL void duk_debug_clear_pause_state(duk_heap *heap); -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -#endif /* DUK_DEBUGGER_H_INCLUDED */ -/* #include duk_debug.h */ -#line 1 "duk_debug.h" -/* - * Debugging macros, DUK_DPRINT() and its variants in particular. - * - * DUK_DPRINT() allows formatted debug prints, and supports standard - * and Duktape specific formatters. See duk_debug_vsnprintf.c for details. - * - * DUK_D(x), DUK_DD(x), and DUK_DDD(x) are used together with log macros - * for technical reasons. They are concretely used to hide 'x' from the - * compiler when the corresponding log level is disabled. This allows - * clean builds on non-C99 compilers, at the cost of more verbose code. - * Examples: - * - * DUK_D(DUK_DPRINT("foo")); - * DUK_DD(DUK_DDPRINT("foo")); - * DUK_DDD(DUK_DDDPRINT("foo")); - * - * This approach is preferable to the old "double parentheses" hack because - * double parentheses make the C99 solution worse: __FILE__ and __LINE__ can - * no longer be added transparently without going through globals, which - * works poorly with threading. - */ - -#if !defined(DUK_DEBUG_H_INCLUDED) -#define DUK_DEBUG_H_INCLUDED - -#if defined(DUK_USE_DEBUG) - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) -#define DUK_D(x) x -#else -#define DUK_D(x) do { } while (0) /* omit */ -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) -#define DUK_DD(x) x -#else -#define DUK_DD(x) do { } while (0) /* omit */ -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -#define DUK_DDD(x) x -#else -#define DUK_DDD(x) do { } while (0) /* omit */ -#endif - -/* - * Exposed debug macros: debugging enabled - */ - -#if defined(DUK_USE_VARIADIC_MACROS) - -/* Note: combining __FILE__, __LINE__, and __func__ into fmt would be - * possible compile time, but waste some space with shared function names. - */ -#define DUK__DEBUG_LOG(lev,...) duk_debug_log((duk_int_t) (lev), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, DUK_FUNC_MACRO, __VA_ARGS__); - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) -#define DUK_DPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DEBUG, __VA_ARGS__) -#else -#define DUK_DPRINT(...) -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) -#define DUK_DDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDEBUG, __VA_ARGS__) -#else -#define DUK_DDPRINT(...) -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -#define DUK_DDDPRINT(...) DUK__DEBUG_LOG(DUK_LEVEL_DDDEBUG, __VA_ARGS__) -#else -#define DUK_DDDPRINT(...) -#endif - -#else /* DUK_USE_VARIADIC_MACROS */ - -#define DUK__DEBUG_STASH(lev) \ - (void) DUK_SNPRINTF(duk_debug_file_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FILE_MACRO), \ - (void) (duk_debug_file_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \ - (void) (duk_debug_line_stash = (duk_int_t) DUK_LINE_MACRO), \ - (void) DUK_SNPRINTF(duk_debug_func_stash, DUK_DEBUG_STASH_SIZE, "%s", (const char *) DUK_FUNC_MACRO), \ - (void) (duk_debug_func_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \ - (void) (duk_debug_level_stash = (lev)) - -/* Without variadic macros resort to comma expression trickery to handle debug - * prints. This generates a lot of harmless warnings. These hacks are not - * needed normally because DUK_D() and friends will hide the entire debug log - * statement from the compiler. - */ - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0) -#define DUK_DPRINT DUK__DEBUG_STASH(DUK_LEVEL_DEBUG), (void) duk_debug_log /* args go here in parens */ -#else -#define DUK_DPRINT 0 && /* args go here as a comma expression in parens */ -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) -#define DUK_DDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDEBUG), (void) duk_debug_log /* args go here in parens */ -#else -#define DUK_DDPRINT 0 && /* args */ -#endif - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -#define DUK_DDDPRINT DUK__DEBUG_STASH(DUK_LEVEL_DDDEBUG), (void) duk_debug_log /* args go here in parens */ -#else -#define DUK_DDDPRINT 0 && /* args */ -#endif - -#endif /* DUK_USE_VARIADIC_MACROS */ - -#else /* DUK_USE_DEBUG */ - -/* - * Exposed debug macros: debugging disabled - */ - -#define DUK_D(x) do { } while (0) /* omit */ -#define DUK_DD(x) do { } while (0) /* omit */ -#define DUK_DDD(x) do { } while (0) /* omit */ - -#if defined(DUK_USE_VARIADIC_MACROS) - -#define DUK_DPRINT(...) -#define DUK_DDPRINT(...) -#define DUK_DDDPRINT(...) - -#else /* DUK_USE_VARIADIC_MACROS */ - -#define DUK_DPRINT 0 && /* args go here as a comma expression in parens */ -#define DUK_DDPRINT 0 && /* args */ -#define DUK_DDDPRINT 0 && /* args */ - -#endif /* DUK_USE_VARIADIC_MACROS */ - -#endif /* DUK_USE_DEBUG */ - -/* - * Structs - */ - -#if defined(DUK_USE_DEBUG) -struct duk_fixedbuffer { - duk_uint8_t *buffer; - duk_size_t length; - duk_size_t offset; - duk_bool_t truncated; -}; -#endif - -/* - * Prototypes - */ - -#if defined(DUK_USE_DEBUG) -DUK_INTERNAL_DECL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap); -#if 0 /*unused*/ -DUK_INTERNAL_DECL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...); -#endif -DUK_INTERNAL_DECL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size); - -#if defined(DUK_USE_VARIADIC_MACROS) -DUK_INTERNAL_DECL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...); -#else /* DUK_USE_VARIADIC_MACROS */ -/* parameter passing, not thread safe */ -#define DUK_DEBUG_STASH_SIZE 128 -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE]; -DUK_INTERNAL_DECL duk_int_t duk_debug_line_stash; -DUK_INTERNAL_DECL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE]; -DUK_INTERNAL_DECL duk_int_t duk_debug_level_stash; -#endif -DUK_INTERNAL_DECL void duk_debug_log(const char *fmt, ...); -#endif /* DUK_USE_VARIADIC_MACROS */ - -DUK_INTERNAL_DECL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length); -DUK_INTERNAL_DECL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x); -DUK_INTERNAL_DECL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x); -DUK_INTERNAL_DECL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...); -DUK_INTERNAL_DECL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size); -DUK_INTERNAL_DECL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb); - -#endif /* DUK_USE_DEBUG */ - -#endif /* DUK_DEBUG_H_INCLUDED */ -/* #include duk_error.h */ -#line 1 "duk_error.h" -/* - * Error handling macros, assertion macro, error codes. - * - * There are three types of 'errors': - * - * 1. Ordinary errors relative to a thread, cause a longjmp, catchable. - * 2. Fatal errors relative to a heap, cause fatal handler to be called. - * 3. Fatal errors without context, cause the default (not heap specific) - * fatal handler to be called. - * - * Fatal errors without context are used by debug code such as assertions. - * By providing a fatal error handler for a Duktape heap, user code can - * avoid fatal errors without context in non-debug builds. - */ - -#if !defined(DUK_ERROR_H_INCLUDED) -#define DUK_ERROR_H_INCLUDED - -/* - * Error codes: defined in duktape.h - * - * Error codes are used as a shorthand to throw exceptions from inside - * the implementation. The appropriate Ecmascript object is constructed - * based on the code. Ecmascript code throws objects directly. The error - * codes are defined in the public API header because they are also used - * by calling code. - */ - -/* - * Normal error - * - * Normal error is thrown with a longjmp() through the current setjmp() - * catchpoint record in the duk_heap. The 'curr_thread' of the duk_heap - * identifies the throwing thread. - * - * Error formatting is usually unnecessary. The error macros provide a - * zero argument version (no formatting) and separate macros for small - * argument counts. Variadic macros are not used to avoid portability - * issues and avoid the need for stash-based workarounds when they're not - * available. Vararg calls are avoided for non-formatted error calls - * because vararg call sites are larger than normal, and there are a lot - * of call sites with no formatting. - * - * Note that special formatting provided by debug macros is NOT available. - * - * The _RAW variants allow the caller to specify file and line. This makes - * it easier to write checked calls which want to use the call site of the - * checked function, not the error macro call inside the checked function. - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) - -/* Because there are quite many call sites, pack error code (require at most - * 8-bit) into a single argument. - */ -#define DUK_ERROR(thr,err,msg) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \ - } while (0) -#define DUK_ERROR_RAW(thr,file,line,err,msg) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \ - } while (0) - -#define DUK_ERROR_FMT1(thr,err,fmt,arg1) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \ - } while (0) -#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \ - } while (0) - -#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \ - } while (0) -#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \ - } while (0) - -#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \ - } while (0) -#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \ - } while (0) - -#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \ - } while (0) -#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) do { \ - duk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \ - DUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \ - duk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \ - } while (0) - -#else /* DUK_USE_VERBOSE_ERRORS */ - -#define DUK_ERROR(thr,err,msg) duk_err_handle_error((thr), (err)) -#define DUK_ERROR_RAW(thr,file,line,err,msg) duk_err_handle_error((thr), (err)) - -#define DUK_ERROR_FMT1(thr,err,fmt,arg1) DUK_ERROR((thr),(err),(fmt)) -#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) - -#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) DUK_ERROR((thr),(err),(fmt)) -#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) - -#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) DUK_ERROR((thr),(err),(fmt)) -#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) - -#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR((thr),(err),(fmt)) -#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt)) - -#endif /* DUK_USE_VERBOSE_ERRORS */ - -/* - * Fatal error without context - * - * The macro is an expression to make it compatible with DUK_ASSERT_EXPR(). - */ - -#define DUK_FATAL_WITHOUT_CONTEXT(msg) \ - duk_default_fatal_handler(NULL, (msg)) - -/* - * Error throwing helpers - * - * The goal is to provide verbose and configurable error messages. Call - * sites should be clean in source code and compile to a small footprint. - * Small footprint is also useful for performance because small cold paths - * reduce code cache pressure. Adding macros here only makes sense if there - * are enough call sites to get concrete benefits. - * - * DUK_ERROR_xxx() macros are generic and can be used anywhere. - * - * DUK_DCERROR_xxx() macros can only be used in Duktape/C functions where - * the "return DUK_RET_xxx;" shorthand is available for low memory targets. - * The DUK_DCERROR_xxx() macros always either throw or perform a - * 'return DUK_RET_xxx' from the calling function. - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -/* Verbose errors with key/value summaries (non-paranoid) or without key/value - * summaries (paranoid, for some security sensitive environments), the paranoid - * vs. non-paranoid distinction affects only a few specific errors. - */ -#if defined(DUK_USE_PARANOID_ERRORS) -#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ - duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \ - } while (0) -#else /* DUK_USE_PARANOID_ERRORS */ -#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ - duk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \ - } while (0) -#endif /* DUK_USE_PARANOID_ERRORS */ - -#define DUK_ERROR_INTERNAL(thr) do { \ - duk_err_error_internal((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_DCERROR_INTERNAL(thr) do { \ - DUK_ERROR_INTERNAL((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_ALLOC_FAILED(thr) do { \ - duk_err_error_alloc_failed((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_ERROR_UNSUPPORTED(thr) do { \ - DUK_ERROR((thr), DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); \ - } while (0) -#define DUK_ERROR_ERROR(thr,msg) do { \ - duk_err_error((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \ - } while (0) -#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \ - duk_err_range_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx)); \ - } while (0) -#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \ - duk_err_range_push_beyond((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \ - DUK_ERROR_RANGE((thr), DUK_STR_INVALID_ARGS); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \ - DUK_ERROR_RANGE_INVALID_ARGS((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \ - DUK_ERROR_RANGE((thr), DUK_STR_INVALID_COUNT); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \ - DUK_ERROR_RANGE_INVALID_COUNT((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \ - DUK_ERROR_RANGE((thr), DUK_STR_INVALID_LENGTH); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \ - DUK_ERROR_RANGE_INVALID_LENGTH((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_RANGE(thr,msg) do { \ - duk_err_range((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \ - } while (0) -#define DUK_ERROR_EVAL(thr,msg) do { \ - DUK_ERROR((thr), DUK_ERR_EVAL_ERROR, (msg)); \ - } while (0) -#define DUK_ERROR_REFERENCE(thr,msg) do { \ - DUK_ERROR((thr), DUK_ERR_REFERENCE_ERROR, (msg)); \ - } while (0) -#define DUK_ERROR_SYNTAX(thr,msg) do { \ - DUK_ERROR((thr), DUK_ERR_SYNTAX_ERROR, (msg)); \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \ - duk_err_type_invalid_args((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \ - DUK_ERROR_TYPE_INVALID_ARGS((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \ - duk_err_type_invalid_state((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \ - DUK_ERROR_TYPE_INVALID_STATE((thr)); \ - return 0; \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ - duk_err_type_invalid_trap_result((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ - DUK_ERROR_TYPE((thr), DUK_STR_INVALID_TRAP_RESULT); \ - } while (0) -#define DUK_ERROR_TYPE(thr,msg) do { \ - DUK_ERROR((thr), DUK_ERR_TYPE_ERROR, (msg)); \ - } while (0) -#define DUK_ERROR_URI(thr,msg) do { \ - DUK_ERROR((thr), DUK_ERR_URI_ERROR, (msg)); \ - } while (0) -#else /* DUK_USE_VERBOSE_ERRORS */ -/* Non-verbose errors for low memory targets: no file, line, or message. */ - -#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \ - duk_err_type((thr)); \ - } while (0) - -#define DUK_ERROR_INTERNAL(thr) do { \ - duk_err_error((thr)); \ - } while (0) -#define DUK_DCERROR_INTERNAL(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_ERROR; \ - } while (0) -#define DUK_ERROR_ALLOC_FAILED(thr) do { \ - duk_err_error((thr)); \ - } while (0) -#define DUK_ERROR_UNSUPPORTED(thr) do { \ - duk_err_error((thr)); \ - } while (0) -#define DUK_ERROR_ERROR(thr,msg) do { \ - duk_err_error((thr)); \ - } while (0) -#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_RANGE_ERROR; \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_RANGE_ERROR; \ - } while (0) -#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_RANGE_ERROR; \ - } while (0) -#define DUK_ERROR_RANGE(thr,msg) do { \ - duk_err_range((thr)); \ - } while (0) -#define DUK_ERROR_EVAL(thr,msg) do { \ - duk_err_eval((thr)); \ - } while (0) -#define DUK_ERROR_REFERENCE(thr,msg) do { \ - duk_err_reference((thr)); \ - } while (0) -#define DUK_ERROR_SYNTAX(thr,msg) do { \ - duk_err_syntax((thr)); \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_TYPE_ERROR; \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ - DUK_UNREF((thr)); \ - return DUK_RET_TYPE_ERROR; \ - } while (0) -#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_ERROR_TYPE(thr,msg) do { \ - duk_err_type((thr)); \ - } while (0) -#define DUK_ERROR_URI(thr,msg) do { \ - duk_err_uri((thr)); \ - } while (0) -#endif /* DUK_USE_VERBOSE_ERRORS */ - -/* - * Assert macro: failure causes a fatal error. - * - * NOTE: since the assert macro doesn't take a heap/context argument, there's - * no way to look up a heap/context specific fatal error handler which may have - * been given by the application. Instead, assertion failures always use the - * internal default fatal error handler; it can be replaced via duk_config.h - * and then applies to all Duktape heaps. - */ - -#if defined(DUK_USE_ASSERTIONS) - -/* The message should be a compile time constant without formatting (less risk); - * we don't care about assertion text size because they're not used in production - * builds. - */ -#define DUK_ASSERT(x) do { \ - if (!(x)) { \ - DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \ - " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"); \ - } \ - } while (0) - -/* Assertion compatible inside a comma expression, evaluates to void. */ -#define DUK_ASSERT_EXPR(x) \ - ((void) ((x) ? 0 : (DUK_FATAL_WITHOUT_CONTEXT("assertion failed: " #x \ - " (" DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) ")"), 0))) - -#else /* DUK_USE_ASSERTIONS */ - -#define DUK_ASSERT(x) do { /* assertion omitted */ } while (0) - -#define DUK_ASSERT_EXPR(x) ((void) 0) - -#endif /* DUK_USE_ASSERTIONS */ - -/* this variant is used when an assert would generate a compile warning by - * being always true (e.g. >= 0 comparison for an unsigned value - */ -#define DUK_ASSERT_DISABLE(x) do { /* assertion disabled */ } while (0) - -/* - * Assertion helpers - */ - -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) -#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) do { \ - DUK_ASSERT((h) == NULL || DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) (h)) > 0); \ - } while (0) -#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) do { \ - if ((tv) != NULL && DUK_TVAL_IS_HEAP_ALLOCATED((tv))) { \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(DUK_TVAL_GET_HEAPHDR((tv))) > 0); \ - } \ - } while (0) -#else -#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h) /* no refcount check */ -#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv) /* no refcount check */ -#endif - -#define DUK_ASSERT_TOP(ctx,n) DUK_ASSERT((duk_idx_t) duk_get_top((ctx)) == (duk_idx_t) (n)) - -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_PACKED_TVAL) -#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) do { \ - duk_double_union duk__assert_tmp_du; \ - duk__assert_tmp_du.d = (dval); \ - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&duk__assert_tmp_du)); \ - } while (0) -#else -#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval) /* nop */ -#endif - -#define DUK_ASSERT_VS_SPACE(thr) \ - DUK_ASSERT(thr->valstack_top < thr->valstack_end) - -/* - * Helper to initialize a memory area (e.g. struct) with garbage when - * assertions enabled. - */ - -#if defined(DUK_USE_ASSERTIONS) -#define DUK_ASSERT_SET_GARBAGE(ptr,size) do { \ - DUK_MEMSET((void *) (ptr), 0x5a, size); \ - } while (0) -#else -#define DUK_ASSERT_SET_GARBAGE(ptr,size) do {} while (0) -#endif - -/* - * Helper for valstack space - * - * Caller of DUK_ASSERT_VALSTACK_SPACE() estimates the number of free stack entries - * required for its own use, and any child calls which are not (a) Duktape API calls - * or (b) Duktape calls which involve extending the valstack (e.g. getter call). - */ - -#define DUK_VALSTACK_ASSERT_EXTRA 5 /* this is added to checks to allow for Duktape - * API calls in addition to function's own use - */ -#if defined(DUK_USE_ASSERTIONS) -#define DUK_ASSERT_VALSTACK_SPACE(thr,n) do { \ - DUK_ASSERT((thr) != NULL); \ - DUK_ASSERT((thr)->valstack_end - (thr)->valstack_top >= (n) + DUK_VALSTACK_ASSERT_EXTRA); \ - } while (0) -#else -#define DUK_ASSERT_VALSTACK_SPACE(thr,n) /* no valstack space check */ -#endif - -/* - * Prototypes - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...)); -#else /* DUK_USE_VERBOSE_ERRORS */ -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code)); -#endif /* DUK_USE_VERBOSE_ERRORS */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line)); -#else -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code)); -#endif - -DUK_NORETURN(DUK_INTERNAL_DECL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc)); - -#define DUK_AUGMENT_FLAG_NOBLAME_FILELINE (1U << 0) /* if set, don't blame C file/line for .fileName and .lineNumber */ -#define DUK_AUGMENT_FLAG_SKIP_ONE (1U << 1) /* if set, skip topmost activation in traceback construction */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) -DUK_INTERNAL_DECL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, duk_int_t line, duk_small_uint_t flags); -#endif -#if defined(DUK_USE_AUGMENT_ERROR_THROW) -DUK_INTERNAL_DECL void duk_err_augment_error_throw(duk_hthread *thr); -#endif - -#if defined(DUK_USE_VERBOSE_ERRORS) -#if defined(DUK_USE_PARANOID_ERRORS) -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name)); -#else -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name)); -#endif -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber)); -#else /* DUK_VERBOSE_ERRORS */ -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_eval(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_reference(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_syntax(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type(duk_hthread *thr)); -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_uri(duk_hthread *thr)); -#endif /* DUK_VERBOSE_ERRORS */ - -DUK_NORETURN(DUK_INTERNAL_DECL void duk_err_longjmp(duk_hthread *thr)); - -DUK_NORETURN(DUK_INTERNAL_DECL void duk_default_fatal_handler(void *udata, const char *msg)); - -DUK_INTERNAL_DECL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val); -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_INTERNAL_DECL void duk_err_check_debugger_integration(duk_hthread *thr); -#endif - -DUK_INTERNAL_DECL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t err_code); - -#endif /* DUK_ERROR_H_INCLUDED */ -/* #include duk_unicode.h */ -#line 1 "duk_unicode.h" -/* - * Unicode helpers - */ - -#if !defined(DUK_UNICODE_H_INCLUDED) -#define DUK_UNICODE_H_INCLUDED - -/* - * UTF-8 / XUTF-8 / CESU-8 constants - */ - -#define DUK_UNICODE_MAX_XUTF8_LENGTH 7 /* up to 36 bit codepoints */ -#define DUK_UNICODE_MAX_XUTF8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */ -#define DUK_UNICODE_MAX_CESU8_LENGTH 6 /* all codepoints up to U+10FFFF */ -#define DUK_UNICODE_MAX_CESU8_BMP_LENGTH 3 /* all codepoints up to U+FFFF */ - -/* - * Useful Unicode codepoints - * - * Integer constants must be signed to avoid unexpected coercions - * in comparisons. - */ - -#define DUK_UNICODE_CP_ZWNJ 0x200cL /* zero-width non-joiner */ -#define DUK_UNICODE_CP_ZWJ 0x200dL /* zero-width joiner */ -#define DUK_UNICODE_CP_REPLACEMENT_CHARACTER 0xfffdL /* http://en.wikipedia.org/wiki/Replacement_character#Replacement_character */ - -/* - * ASCII character constants - * - * C character literals like 'x' have a platform specific value and do - * not match ASCII (UTF-8) values on e.g. EBCDIC platforms. So, use - * these (admittedly awkward) constants instead. These constants must - * also have signed values to avoid unexpected coercions in comparisons. - * - * http://en.wikipedia.org/wiki/ASCII - */ - -#define DUK_ASC_NUL 0x00 -#define DUK_ASC_SOH 0x01 -#define DUK_ASC_STX 0x02 -#define DUK_ASC_ETX 0x03 -#define DUK_ASC_EOT 0x04 -#define DUK_ASC_ENQ 0x05 -#define DUK_ASC_ACK 0x06 -#define DUK_ASC_BEL 0x07 -#define DUK_ASC_BS 0x08 -#define DUK_ASC_HT 0x09 -#define DUK_ASC_LF 0x0a -#define DUK_ASC_VT 0x0b -#define DUK_ASC_FF 0x0c -#define DUK_ASC_CR 0x0d -#define DUK_ASC_SO 0x0e -#define DUK_ASC_SI 0x0f -#define DUK_ASC_DLE 0x10 -#define DUK_ASC_DC1 0x11 -#define DUK_ASC_DC2 0x12 -#define DUK_ASC_DC3 0x13 -#define DUK_ASC_DC4 0x14 -#define DUK_ASC_NAK 0x15 -#define DUK_ASC_SYN 0x16 -#define DUK_ASC_ETB 0x17 -#define DUK_ASC_CAN 0x18 -#define DUK_ASC_EM 0x19 -#define DUK_ASC_SUB 0x1a -#define DUK_ASC_ESC 0x1b -#define DUK_ASC_FS 0x1c -#define DUK_ASC_GS 0x1d -#define DUK_ASC_RS 0x1e -#define DUK_ASC_US 0x1f -#define DUK_ASC_SPACE 0x20 -#define DUK_ASC_EXCLAMATION 0x21 -#define DUK_ASC_DOUBLEQUOTE 0x22 -#define DUK_ASC_HASH 0x23 -#define DUK_ASC_DOLLAR 0x24 -#define DUK_ASC_PERCENT 0x25 -#define DUK_ASC_AMP 0x26 -#define DUK_ASC_SINGLEQUOTE 0x27 -#define DUK_ASC_LPAREN 0x28 -#define DUK_ASC_RPAREN 0x29 -#define DUK_ASC_STAR 0x2a -#define DUK_ASC_PLUS 0x2b -#define DUK_ASC_COMMA 0x2c -#define DUK_ASC_MINUS 0x2d -#define DUK_ASC_PERIOD 0x2e -#define DUK_ASC_SLASH 0x2f -#define DUK_ASC_0 0x30 -#define DUK_ASC_1 0x31 -#define DUK_ASC_2 0x32 -#define DUK_ASC_3 0x33 -#define DUK_ASC_4 0x34 -#define DUK_ASC_5 0x35 -#define DUK_ASC_6 0x36 -#define DUK_ASC_7 0x37 -#define DUK_ASC_8 0x38 -#define DUK_ASC_9 0x39 -#define DUK_ASC_COLON 0x3a -#define DUK_ASC_SEMICOLON 0x3b -#define DUK_ASC_LANGLE 0x3c -#define DUK_ASC_EQUALS 0x3d -#define DUK_ASC_RANGLE 0x3e -#define DUK_ASC_QUESTION 0x3f -#define DUK_ASC_ATSIGN 0x40 -#define DUK_ASC_UC_A 0x41 -#define DUK_ASC_UC_B 0x42 -#define DUK_ASC_UC_C 0x43 -#define DUK_ASC_UC_D 0x44 -#define DUK_ASC_UC_E 0x45 -#define DUK_ASC_UC_F 0x46 -#define DUK_ASC_UC_G 0x47 -#define DUK_ASC_UC_H 0x48 -#define DUK_ASC_UC_I 0x49 -#define DUK_ASC_UC_J 0x4a -#define DUK_ASC_UC_K 0x4b -#define DUK_ASC_UC_L 0x4c -#define DUK_ASC_UC_M 0x4d -#define DUK_ASC_UC_N 0x4e -#define DUK_ASC_UC_O 0x4f -#define DUK_ASC_UC_P 0x50 -#define DUK_ASC_UC_Q 0x51 -#define DUK_ASC_UC_R 0x52 -#define DUK_ASC_UC_S 0x53 -#define DUK_ASC_UC_T 0x54 -#define DUK_ASC_UC_U 0x55 -#define DUK_ASC_UC_V 0x56 -#define DUK_ASC_UC_W 0x57 -#define DUK_ASC_UC_X 0x58 -#define DUK_ASC_UC_Y 0x59 -#define DUK_ASC_UC_Z 0x5a -#define DUK_ASC_LBRACKET 0x5b -#define DUK_ASC_BACKSLASH 0x5c -#define DUK_ASC_RBRACKET 0x5d -#define DUK_ASC_CARET 0x5e -#define DUK_ASC_UNDERSCORE 0x5f -#define DUK_ASC_GRAVE 0x60 -#define DUK_ASC_LC_A 0x61 -#define DUK_ASC_LC_B 0x62 -#define DUK_ASC_LC_C 0x63 -#define DUK_ASC_LC_D 0x64 -#define DUK_ASC_LC_E 0x65 -#define DUK_ASC_LC_F 0x66 -#define DUK_ASC_LC_G 0x67 -#define DUK_ASC_LC_H 0x68 -#define DUK_ASC_LC_I 0x69 -#define DUK_ASC_LC_J 0x6a -#define DUK_ASC_LC_K 0x6b -#define DUK_ASC_LC_L 0x6c -#define DUK_ASC_LC_M 0x6d -#define DUK_ASC_LC_N 0x6e -#define DUK_ASC_LC_O 0x6f -#define DUK_ASC_LC_P 0x70 -#define DUK_ASC_LC_Q 0x71 -#define DUK_ASC_LC_R 0x72 -#define DUK_ASC_LC_S 0x73 -#define DUK_ASC_LC_T 0x74 -#define DUK_ASC_LC_U 0x75 -#define DUK_ASC_LC_V 0x76 -#define DUK_ASC_LC_W 0x77 -#define DUK_ASC_LC_X 0x78 -#define DUK_ASC_LC_Y 0x79 -#define DUK_ASC_LC_Z 0x7a -#define DUK_ASC_LCURLY 0x7b -#define DUK_ASC_PIPE 0x7c -#define DUK_ASC_RCURLY 0x7d -#define DUK_ASC_TILDE 0x7e -#define DUK_ASC_DEL 0x7f - -/* - * Miscellaneous - */ - -/* Uppercase A is 0x41, lowercase a is 0x61; OR 0x20 to convert uppercase - * to lowercase. - */ -#define DUK_LOWERCASE_CHAR_ASCII(x) ((x) | 0x20) - -/* - * Unicode tables - */ - -#if defined(DUK_USE_SOURCE_NONBMP) -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_ids_noa[1036]; -#else -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_ids_noabmp[625]; -#endif - -#if defined(DUK_USE_SOURCE_NONBMP) -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_ids_m_let_noa[42]; -#else -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_ids_m_let_noabmp[24]; -#endif - -#if defined(DUK_USE_SOURCE_NONBMP) -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_idp_m_ids_noa[530]; -#else -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357]; -#endif - -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -extern const duk_uint8_t duk_unicode_caseconv_uc[1386]; -extern const duk_uint8_t duk_unicode_caseconv_lc[680]; - -#if defined(DUK_USE_REGEXP_CANON_WORKAROUND) -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -extern const duk_uint16_t duk_unicode_re_canon_lookup[65536]; -#endif - -#if defined(DUK_USE_REGEXP_CANON_BITMAP) -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -#define DUK_CANON_BITMAP_BLKSIZE 32 -#define DUK_CANON_BITMAP_BLKSHIFT 5 -#define DUK_CANON_BITMAP_BLKMASK 31 -extern const duk_uint8_t duk_unicode_re_canon_bitmap[256]; -#endif - -/* - * Extern - */ - -/* duk_unicode_support.c */ -#if !defined(DUK_SINGLE_FILE) -DUK_INTERNAL_DECL const duk_uint8_t duk_unicode_xutf8_markers[7]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_digit[2]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_white[22]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_wordchar[8]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_digit[4]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_white[24]; -DUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10]; -DUK_INTERNAL_DECL const duk_int8_t duk_is_idchar_tab[128]; -#endif /* !DUK_SINGLE_FILE */ - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp); -#if defined(DUK_USE_ASSERTIONS) -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp); -#endif -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp); -DUK_INTERNAL_DECL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end); -DUK_INTERNAL_DECL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp); -DUK_INTERNAL_DECL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase); -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_INTERNAL_DECL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp); -DUK_INTERNAL_DECL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t cp); -#endif - -#endif /* DUK_UNICODE_H_INCLUDED */ -/* #include duk_json.h */ -#line 1 "duk_json.h" -/* - * Defines for JSON, especially duk_bi_json.c. - */ - -#if !defined(DUK_JSON_H_INCLUDED) -#define DUK_JSON_H_INCLUDED - -/* Encoding/decoding flags */ -#define DUK_JSON_FLAG_ASCII_ONLY (1U << 0) /* escape any non-ASCII characters */ -#define DUK_JSON_FLAG_AVOID_KEY_QUOTES (1U << 1) /* avoid key quotes when key is an ASCII Identifier */ -#define DUK_JSON_FLAG_EXT_CUSTOM (1U << 2) /* extended types: custom encoding */ -#define DUK_JSON_FLAG_EXT_COMPATIBLE (1U << 3) /* extended types: compatible encoding */ - -/* How much stack to require on entry to object/array encode */ -#define DUK_JSON_ENC_REQSTACK 32 - -/* How much stack to require on entry to object/array decode */ -#define DUK_JSON_DEC_REQSTACK 32 - -/* How large a loop detection stack to use */ -#define DUK_JSON_ENC_LOOPARRAY 64 - -/* Encoding state. Heap object references are all borrowed. */ -typedef struct { - duk_hthread *thr; - duk_bufwriter_ctx bw; /* output bufwriter */ - duk_hobject *h_replacer; /* replacer function */ - duk_hstring *h_gap; /* gap (if empty string, NULL) */ - duk_idx_t idx_proplist; /* explicit PropertyList */ - duk_idx_t idx_loop; /* valstack index of loop detection object */ - duk_small_uint_t flags; - duk_small_uint_t flag_ascii_only; - duk_small_uint_t flag_avoid_key_quotes; -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - duk_small_uint_t flag_ext_custom; - duk_small_uint_t flag_ext_compatible; - duk_small_uint_t flag_ext_custom_or_compatible; -#endif - duk_uint_t recursion_depth; - duk_uint_t recursion_limit; - duk_uint_t mask_for_undefined; /* type bit mask: types which certainly produce 'undefined' */ -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - duk_small_uint_t stridx_custom_undefined; - duk_small_uint_t stridx_custom_nan; - duk_small_uint_t stridx_custom_neginf; - duk_small_uint_t stridx_custom_posinf; - duk_small_uint_t stridx_custom_function; -#endif - duk_hobject *visiting[DUK_JSON_ENC_LOOPARRAY]; /* indexed by recursion_depth */ -} duk_json_enc_ctx; - -typedef struct { - duk_hthread *thr; - const duk_uint8_t *p; - const duk_uint8_t *p_start; - const duk_uint8_t *p_end; - duk_idx_t idx_reviver; - duk_small_uint_t flags; -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - duk_small_uint_t flag_ext_custom; - duk_small_uint_t flag_ext_compatible; - duk_small_uint_t flag_ext_custom_or_compatible; -#endif - duk_int_t recursion_depth; - duk_int_t recursion_limit; -} duk_json_dec_ctx; - -#endif /* DUK_JSON_H_INCLUDED */ -/* #include duk_js.h */ -#line 1 "duk_js.h" -/* - * Ecmascript execution, support primitives. - */ - -#if !defined(DUK_JS_H_INCLUDED) -#define DUK_JS_H_INCLUDED - -/* Flags for call handling. Lowest flags must match bytecode DUK_BC_CALL_FLAG_xxx 1:1. */ -#define DUK_CALL_FLAG_TAILCALL (1U << 0) /* setup for a tail call */ -#define DUK_CALL_FLAG_CONSTRUCT (1U << 1) /* constructor call (i.e. called as 'new Foo()') */ -#define DUK_CALL_FLAG_CALLED_AS_EVAL (1U << 2) /* call was made using the identifier 'eval' */ -#define DUK_CALL_FLAG_ALLOW_ECMATOECMA (1U << 3) /* ecma-to-ecma call with executor reuse is possible */ -#define DUK_CALL_FLAG_DIRECT_EVAL (1U << 4) /* call is a direct eval call */ -#define DUK_CALL_FLAG_CONSTRUCT_PROXY (1U << 5) /* handled via 'construct' proxy trap, check return value invariant(s) */ -#define DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED (1U << 6) /* prototype of 'default instance' updated, temporary flag in call handling */ - -/* Flags for duk_js_equals_helper(). */ -#define DUK_EQUALS_FLAG_SAMEVALUE (1U << 0) /* use SameValue instead of non-strict equality */ -#define DUK_EQUALS_FLAG_STRICT (1U << 1) /* use strict equality instead of non-strict equality */ - -/* Flags for duk_js_compare_helper(). */ -#define DUK_COMPARE_FLAG_NEGATE (1U << 0) /* negate result */ -#define DUK_COMPARE_FLAG_EVAL_LEFT_FIRST (1U << 1) /* eval left argument first */ - -/* conversions, coercions, comparison, etc */ -DUK_INTERNAL_DECL duk_bool_t duk_js_toboolean(duk_tval *tv); -DUK_INTERNAL_DECL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x); -DUK_INTERNAL_DECL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv); -DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen); -#if !defined(DUK_USE_HSTRING_ARRIDX) -DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h); -DUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h); -#endif -DUK_INTERNAL_DECL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2); -DUK_INTERNAL_DECL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2); -#if 0 /* unused */ -DUK_INTERNAL_DECL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2); -#endif -DUK_INTERNAL_DECL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); -DUK_INTERNAL_DECL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y); -DUK_INTERNAL_DECL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x); - -/* arithmetic */ -DUK_INTERNAL_DECL double duk_js_arith_pow(double x, double y); -DUK_INTERNAL_DECL double duk_js_arith_mod(double x, double y); - -#define duk_js_equals(thr,tv_x,tv_y) \ - duk_js_equals_helper((thr), (tv_x), (tv_y), 0) -#define duk_js_strict_equals(tv_x,tv_y) \ - duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_STRICT) -#define duk_js_samevalue(tv_x,tv_y) \ - duk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_SAMEVALUE) - -/* E5 Sections 11.8.1, 11.8.5; x < y */ -#define duk_js_lessthan(thr,tv_x,tv_y) \ - duk_js_compare_helper((thr), (tv_x), (tv_Y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) - -/* E5 Sections 11.8.2, 11.8.5; x > y --> y < x */ -#define duk_js_greaterthan(thr,tv_x,tv_y) \ - duk_js_compare_helper((thr), (tv_y), (tv_x), 0) - -/* E5 Sections 11.8.3, 11.8.5; x <= y --> not (x > y) --> not (y < x) */ -#define duk_js_lessthanorequal(thr,tv_x,tv_y) \ - duk_js_compare_helper((thr), (tv_y), (tv_x), DUK_COMPARE_FLAG_NEGATE) - -/* E5 Sections 11.8.4, 11.8.5; x >= y --> not (x < y) */ -#define duk_js_greaterthanorequal(thr,tv_x,tv_y) \ - duk_js_compare_helper((thr), (tv_x), (tv_y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) - -/* identifiers and environment handling */ -#if 0 /*unused*/ -DUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); -#endif -DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag); -DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag); -DUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict); -DUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict); -#if 0 /*unused*/ -DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name); -#endif -DUK_INTERNAL_DECL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name); -DUK_INTERNAL_DECL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl); -DUK_INTERNAL_DECL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act); -DUK_INTERNAL_DECL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env); -DUK_INTERNAL_DECL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t bottom_byteoff); -DUK_INTERNAL_DECL void duk_js_push_closure(duk_hthread *thr, - duk_hcompfunc *fun_temp, - duk_hobject *outer_var_env, - duk_hobject *outer_lex_env, - duk_bool_t add_auto_proto); - -/* call handling */ -DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags); -DUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags); -DUK_INTERNAL_DECL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t num_stack_args, duk_idx_t num_stack_res); -DUK_INTERNAL_DECL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant); -#if defined(DUK_USE_VERBOSE_ERRORS) -DUK_INTERNAL_DECL void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key); -#endif - -/* bytecode execution */ -DUK_INTERNAL_DECL void duk_js_execute_bytecode(duk_hthread *exec_thr); - -#endif /* DUK_JS_H_INCLUDED */ -/* #include duk_numconv.h */ -#line 1 "duk_numconv.h" -/* - * Number-to-string conversion. The semantics of these is very tightly - * bound with the Ecmascript semantics required for call sites. - */ - -#if !defined(DUK_NUMCONV_H_INCLUDED) -#define DUK_NUMCONV_H_INCLUDED - -/* Output a specified number of digits instead of using the shortest - * form. Used for toPrecision() and toFixed(). - */ -#define DUK_N2S_FLAG_FIXED_FORMAT (1U << 0) - -/* Force exponential format. Used for toExponential(). */ -#define DUK_N2S_FLAG_FORCE_EXP (1U << 1) - -/* If number would need zero padding (for whole number part), use - * exponential format instead. E.g. if input number is 12300, 3 - * digits are generated ("123"), output "1.23e+4" instead of "12300". - * Used for toPrecision(). - */ -#define DUK_N2S_FLAG_NO_ZERO_PAD (1U << 2) - -/* Digit count indicates number of fractions (i.e. an absolute - * digit index instead of a relative one). Used together with - * DUK_N2S_FLAG_FIXED_FORMAT for toFixed(). - */ -#define DUK_N2S_FLAG_FRACTION_DIGITS (1U << 3) - -/* - * String-to-number conversion - */ - -/* Maximum exponent value when parsing numbers. This is not strictly - * compliant as there should be no upper limit, but as we parse the - * exponent without a bigint, impose some limit. - */ -#define DUK_S2N_MAX_EXPONENT 1000000000 - -/* Trim white space (= allow leading and trailing whitespace) */ -#define DUK_S2N_FLAG_TRIM_WHITE (1U << 0) - -/* Allow exponent */ -#define DUK_S2N_FLAG_ALLOW_EXP (1U << 1) - -/* Allow trailing garbage (e.g. treat "123foo" as "123) */ -#define DUK_S2N_FLAG_ALLOW_GARBAGE (1U << 2) - -/* Allow leading plus sign */ -#define DUK_S2N_FLAG_ALLOW_PLUS (1U << 3) - -/* Allow leading minus sign */ -#define DUK_S2N_FLAG_ALLOW_MINUS (1U << 4) - -/* Allow 'Infinity' */ -#define DUK_S2N_FLAG_ALLOW_INF (1U << 5) - -/* Allow fraction part */ -#define DUK_S2N_FLAG_ALLOW_FRAC (1U << 6) - -/* Allow naked fraction (e.g. ".123") */ -#define DUK_S2N_FLAG_ALLOW_NAKED_FRAC (1U << 7) - -/* Allow empty fraction (e.g. "123.") */ -#define DUK_S2N_FLAG_ALLOW_EMPTY_FRAC (1U << 8) - -/* Allow empty string to be interpreted as 0 */ -#define DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO (1U << 9) - -/* Allow leading zeroes (e.g. "0123" -> "123") */ -#define DUK_S2N_FLAG_ALLOW_LEADING_ZERO (1U << 10) - -/* Allow automatic detection of hex base ("0x" or "0X" prefix), - * overrides radix argument and forces integer mode. - */ -#define DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT (1U << 11) - -/* Allow automatic detection of legacy octal base ("0n"), - * overrides radix argument and forces integer mode. - */ -#define DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT (1U << 12) - -/* Allow automatic detection of ES2015 octal base ("0o123"), - * overrides radix argument and forces integer mode. - */ -#define DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT (1U << 13) - -/* Allow automatic detection of ES2015 binary base ("0b10001"), - * overrides radix argument and forces integer mode. - */ -#define DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT (1U << 14) - -/* - * Prototypes - */ - -DUK_INTERNAL_DECL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags); -DUK_INTERNAL_DECL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags); - -#endif /* DUK_NUMCONV_H_INCLUDED */ -/* #include duk_bi_protos.h */ -#line 1 "duk_bi_protos.h" -/* - * Prototypes for built-in functions not automatically covered by the - * header declarations emitted by genbuiltins.py. - */ - -#if !defined(DUK_BUILTIN_PROTOS_H_INCLUDED) -#define DUK_BUILTIN_PROTOS_H_INCLUDED - -/* Buffer size needed for ISO 8601 formatting. - * Accurate value is 32 + 1 for NUL termination: - * >>> len('+123456-01-23T12:34:56.123+12:34') - * 32 - * Include additional space to be safe. - */ -#define DUK_BI_DATE_ISO8601_BUFSIZE 40 - -/* Helpers exposed for internal use */ -DUK_INTERNAL_DECL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags); -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year); -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x); -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t year); -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x); -/* Built-in providers */ -#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_gettimeofday(void); -#endif -#if defined(DUK_USE_DATE_NOW_TIME) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_time(void); -#endif -#if defined(DUK_USE_DATE_NOW_WINDOWS) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows(void); -#endif -#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows_subms(void); -#endif -#if defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME) -DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d); -#endif -#if defined(DUK_USE_DATE_TZO_WINDOWS) -DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d); -#endif -#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) -DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d); -#endif -#if defined(DUK_USE_DATE_PRS_STRPTIME) -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str); -#endif -#if defined(DUK_USE_DATE_PRS_GETDATE) -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str); -#endif -#if defined(DUK_USE_DATE_FMT_STRFTIME) -DUK_INTERNAL_DECL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags); -#endif - -#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void); -#endif -#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) -DUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void); -#endif - -DUK_INTERNAL_DECL -void duk_bi_json_parse_helper(duk_hthread *thr, - duk_idx_t idx_value, - duk_idx_t idx_reviver, - duk_small_uint_t flags); -DUK_INTERNAL_DECL -void duk_bi_json_stringify_helper(duk_hthread *thr, - duk_idx_t idx_value, - duk_idx_t idx_replacer, - duk_idx_t idx_space, - duk_small_uint_t flags); - -DUK_INTERNAL_DECL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr); - -#if defined(DUK_USE_ES6_PROXY) -DUK_INTERNAL_DECL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags); -#endif - -#endif /* DUK_BUILTIN_PROTOS_H_INCLUDED */ -/* #include duk_selftest.h */ -#line 1 "duk_selftest.h" -/* - * Selftest code - */ - -#if !defined(DUK_SELFTEST_H_INCLUDED) -#define DUK_SELFTEST_H_INCLUDED - -#if defined(DUK_USE_SELF_TESTS) -DUK_INTERNAL_DECL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *udata); -#endif - -#endif /* DUK_SELFTEST_H_INCLUDED */ -#line 82 "duk_internal.h" - -#endif /* DUK_INTERNAL_H_INCLUDED */ -#line 10 "duk_replacements.c" - -#if defined(DUK_USE_COMPUTED_NAN) -DUK_INTERNAL double duk_computed_nan; -#endif - -#if defined(DUK_USE_COMPUTED_INFINITY) -DUK_INTERNAL double duk_computed_infinity; -#endif - -#if defined(DUK_USE_REPL_FPCLASSIFY) -DUK_INTERNAL int duk_repl_fpclassify(double x) { - duk_double_union u; - duk_uint_fast16_t expt; - duk_small_int_t mzero; - - u.d = x; - expt = (duk_uint_fast16_t) (u.us[DUK_DBL_IDX_US0] & 0x7ff0UL); - if (expt > 0x0000UL && expt < 0x7ff0UL) { - /* expt values [0x001,0x7fe] = normal */ - return DUK_FP_NORMAL; - } - - mzero = (u.ui[DUK_DBL_IDX_UI1] == 0 && (u.ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) == 0); - if (expt == 0x0000UL) { - /* expt 0x000 is zero/subnormal */ - if (mzero) { - return DUK_FP_ZERO; - } else { - return DUK_FP_SUBNORMAL; - } - } else { - /* expt 0xfff is infinite/nan */ - if (mzero) { - return DUK_FP_INFINITE; - } else { - return DUK_FP_NAN; - } - } -} -#endif - -#if defined(DUK_USE_REPL_SIGNBIT) -DUK_INTERNAL int duk_repl_signbit(double x) { - duk_double_union u; - u.d = x; - return (int) (u.uc[DUK_DBL_IDX_UC0] & 0x80UL); -} -#endif - -#if defined(DUK_USE_REPL_ISFINITE) -DUK_INTERNAL int duk_repl_isfinite(double x) { - int c = DUK_FPCLASSIFY(x); - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { - return 0; - } else { - return 1; - } -} -#endif - -#if defined(DUK_USE_REPL_ISNAN) -DUK_INTERNAL int duk_repl_isnan(double x) { - int c = DUK_FPCLASSIFY(x); - return (c == DUK_FP_NAN); -} -#endif - -#if defined(DUK_USE_REPL_ISINF) -DUK_INTERNAL int duk_repl_isinf(double x) { - int c = DUK_FPCLASSIFY(x); - return (c == DUK_FP_INFINITE); -} -#endif -#line 1 "duk_debug_macros.c" -/* - * Debugging macro calls. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_DEBUG) - -/* - * Debugging enabled - */ - -#include -#include -#include - -#if !defined(DUK_USE_DEBUG_WRITE) -#error debugging enabled (DUK_USE_DEBUG) but DUK_USE_DEBUG_WRITE not defined -#endif - -#define DUK__DEBUG_BUFSIZE DUK_USE_DEBUG_BUFSIZE - -#if defined(DUK_USE_VARIADIC_MACROS) - -DUK_INTERNAL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...) { - va_list ap; - long arg_level; - const char *arg_file; - long arg_line; - const char *arg_func; - const char *arg_msg; - char buf[DUK__DEBUG_BUFSIZE]; - - va_start(ap, fmt); - - DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE); - duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap); - - arg_level = (long) level; - arg_file = (const char *) file; - arg_line = (long) line; - arg_func = (const char *) func; - arg_msg = (const char *) buf; - DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg); - - va_end(ap); -} - -#else /* DUK_USE_VARIADIC_MACROS */ - -DUK_INTERNAL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE]; -DUK_INTERNAL duk_int_t duk_debug_line_stash; -DUK_INTERNAL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE]; -DUK_INTERNAL duk_int_t duk_debug_level_stash; - -DUK_INTERNAL void duk_debug_log(const char *fmt, ...) { - va_list ap; - long arg_level; - const char *arg_file; - long arg_line; - const char *arg_func; - const char *arg_msg; - char buf[DUK__DEBUG_BUFSIZE]; - - va_start(ap, fmt); - - DUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE); - duk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap); - - arg_level = (long) duk_debug_level_stash; - arg_file = (const char *) duk_debug_file_stash; - arg_line = (long) duk_debug_line_stash; - arg_func = (const char *) duk_debug_func_stash; - arg_msg = (const char *) buf; - DUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg); - - va_end(ap); -} - -#endif /* DUK_USE_VARIADIC_MACROS */ - -#else /* DUK_USE_DEBUG */ - -/* - * Debugging disabled - */ - -#endif /* DUK_USE_DEBUG */ - -/* automatic undefs */ -#undef DUK__DEBUG_BUFSIZE -#line 1 "duk_builtins.c" -/* - * Automatically generated by genbuiltins.py, do not edit! - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_ASSERTIONS) -#define DUK__REFCINIT(refc) 0 /*h_assert_refcount*/, (refc) /*actual*/ -#else -#define DUK__REFCINIT(refc) (refc) /*actual*/ -#endif - -#if defined(DUK_USE_ROM_STRINGS) -#error ROM support not enabled, rerun configure.py with --rom-support -#else /* DUK_USE_ROM_STRINGS */ -DUK_INTERNAL const duk_uint8_t duk_strings_data[892] = { -79,40,209,144,168,105,6,78,54,139,89,185,44,48,46,90,120,8,154,140,35,103, -35,113,193,73,5,52,112,180,104,166,135,52,188,4,98,12,27,146,156,80,211,31, -129,115,150,64,52,220,109,24,18,68,156,24,38,67,114,36,55,9,119,151,132, -140,93,18,113,128,153,201,212,201,205,2,248,8,196,24,224,104,82,146,40,224, -193,48,114,168,37,147,196,54,123,28,4,98,12,43,148,67,103,177,192,70,32, -196,121,68,54,123,28,18,192,199,144,124,4,98,12,43,136,108,244,117,184,8, -196,24,95,40,134,207,71,91,128,140,65,133,113,13,158,158,151,1,24,131,11, -229,16,217,233,233,112,17,136,48,206,21,110,4,244,244,184,8,196,24,103,10, -183,2,122,218,156,4,98,12,24,203,112,64,179,113,193,79,8,218,155,131,32, -184,70,212,220,13,10,82,68,252,123,144,217,146,38,228,207,18,0,100,37,64, -178,212,11,161,17,104,162,96,10,200,193,57,165,65,169,16,5,100,81,27,70,18, -32,10,200,68,185,13,116,221,197,184,64,89,57,41,197,13,49,234,5,208,156, -113,87,55,118,147,20,187,56,161,166,92,221,212,73,210,236,226,134,153,115, -119,76,201,203,179,138,26,99,73,212,136,136,164,25,174,137,56,32,72,137, -101,23,52,45,13,34,86,9,79,136,104,201,114,149,96,52,138,134,140,151,75, -226,233,186,120,121,22,39,54,83,141,5,55,68,236,36,164,3,16,225,115,150,64, -52,205,163,2,72,154,83,138,26,99,75,12,11,150,103,5,36,20,211,70,140,133, -67,72,49,241,160,227,81,196,52,168,106,39,132,252,183,136,105,80,212,79,2, -249,110,128,126,88,95,133,109,237,237,237,151,235,127,46,249,119,203,190, -186,206,33,181,2,208,61,190,12,19,34,65,19,81,132,108,228,97,1,107,33,12, -32,45,100,137,64,247,175,9,19,155,41,198,130,155,134,69,146,100,227,226, -231,146,51,192,204,73,140,224,145,221,102,241,68,196,157,34,79,143,139,166, -233,225,228,227,138,157,173,167,197,211,118,214,210,38,238,74,113,67,76, -105,187,169,147,154,73,225,228,32,193,48,25,100,105,166,113,200,147,44,166, -1,40,79,18,150,134,147,141,163,2,72,171,115,147,136,4,65,130,96,35,64,194, -32,168,89,56,208,48,135,123,144,217,146,39,220,228,193,19,18,101,220,227, -73,121,167,115,129,196,200,39,12,136,220,225,93,22,1,114,62,231,42,8,176, -15,62,231,36,234,68,68,70,231,30,45,37,161,164,38,231,24,7,159,115,149,4, -72,218,171,115,133,67,64,180,100,145,54,231,42,5,208,135,19,152,244,44,133, -67,95,73,164,145,143,5,18,2,100,65,35,30,76,241,117,134,70,212,103,37,204, -16,72,154,218,130,77,196,145,63,127,123,106,141,25,11,189,243,169,198,132, -251,235,119,247,182,154,6,239,124,234,113,161,62,250,221,253,237,164,52, -187,223,58,156,104,79,190,187,127,123,105,168,105,119,190,117,56,208,159, -125,118,254,246,209,104,209,111,124,234,113,161,62,250,205,253,162,209,162, -249,212,227,66,125,244,161,137,0,162,8,18,33,68,9,136,232,19,155,52,54,132, -64,200,26,24,196,137,198,66,130,139,153,134,69,146,100,16,220,66,46,68,57, -80,208,45,120,25,93,20,22,141,20,208,230,137,5,18,26,164,54,83,3,68,71,20, -109,37,141,18,78,145,105,165,100,76,71,36,206,137,22,103,139,172,57,199,6, -158,30,71,20,117,4,74,39,54,83,37,92,129,150,199,66,200,75,34,103,40,150,9, -72,132,109,24,98,93,238,140,206,75,204,141,28,140,134,61,209,153,101,71, -146,36,109,22,178,78,52,33,74,5,200,138,67,30,178,48,141,156,146,134,204, -145,40,4,65,172,147,59,192,37,0,196,59,226,138,130,100,75,226,233,144,83, -32,204,250,5,104,17,165,48,77,2,46,16,69,140, -}; -#endif /* DUK_USE_ROM_STRINGS */ - -#if defined(DUK_USE_ROM_OBJECTS) -#error ROM support not enabled, rerun configure.py with --rom-support -#else /* DUK_USE_ROM_OBJECTS */ -/* native functions: 176 */ -DUK_INTERNAL const duk_c_function duk_bi_native_functions[176] = { - NULL, - duk_bi_array_constructor, - duk_bi_array_constructor_is_array, - duk_bi_array_prototype_concat, - duk_bi_array_prototype_indexof_shared, - duk_bi_array_prototype_iter_shared, - duk_bi_array_prototype_join_shared, - duk_bi_array_prototype_pop, - duk_bi_array_prototype_push, - duk_bi_array_prototype_reduce_shared, - duk_bi_array_prototype_reverse, - duk_bi_array_prototype_shift, - duk_bi_array_prototype_slice, - duk_bi_array_prototype_sort, - duk_bi_array_prototype_splice, - duk_bi_array_prototype_to_string, - duk_bi_array_prototype_unshift, - duk_bi_arraybuffer_constructor, - duk_bi_arraybuffer_isview, - duk_bi_boolean_constructor, - duk_bi_boolean_prototype_tostring_shared, - duk_bi_buffer_compare_shared, - duk_bi_buffer_readfield, - duk_bi_buffer_slice_shared, - duk_bi_buffer_writefield, - duk_bi_dataview_constructor, - duk_bi_date_constructor, - duk_bi_date_constructor_now, - duk_bi_date_constructor_parse, - duk_bi_date_constructor_utc, - duk_bi_date_prototype_get_shared, - duk_bi_date_prototype_get_timezone_offset, - duk_bi_date_prototype_set_shared, - duk_bi_date_prototype_set_time, - duk_bi_date_prototype_to_json, - duk_bi_date_prototype_tostring_shared, - duk_bi_date_prototype_value_of, - duk_bi_duktape_object_act, - duk_bi_duktape_object_compact, - duk_bi_duktape_object_dec, - duk_bi_duktape_object_enc, - duk_bi_duktape_object_fin, - duk_bi_duktape_object_gc, - duk_bi_duktape_object_info, - duk_bi_error_constructor_shared, - duk_bi_error_prototype_filename_getter, - duk_bi_error_prototype_filename_setter, - duk_bi_error_prototype_linenumber_getter, - duk_bi_error_prototype_linenumber_setter, - duk_bi_error_prototype_stack_getter, - duk_bi_error_prototype_stack_setter, - duk_bi_error_prototype_to_string, - duk_bi_function_constructor, - duk_bi_function_prototype, - duk_bi_function_prototype_apply, - duk_bi_function_prototype_bind, - duk_bi_function_prototype_call, - duk_bi_function_prototype_to_string, - duk_bi_global_object_decode_uri, - duk_bi_global_object_decode_uri_component, - duk_bi_global_object_encode_uri, - duk_bi_global_object_encode_uri_component, - duk_bi_global_object_escape, - duk_bi_global_object_eval, - duk_bi_global_object_is_finite, - duk_bi_global_object_is_nan, - duk_bi_global_object_parse_float, - duk_bi_global_object_parse_int, - duk_bi_global_object_unescape, - duk_bi_json_object_parse, - duk_bi_json_object_stringify, - duk_bi_math_object_clz32, - duk_bi_math_object_hypot, - duk_bi_math_object_imul, - duk_bi_math_object_max, - duk_bi_math_object_min, - duk_bi_math_object_onearg_shared, - duk_bi_math_object_random, - duk_bi_math_object_sign, - duk_bi_math_object_twoarg_shared, - duk_bi_native_function_length, - duk_bi_native_function_name, - duk_bi_nodejs_buffer_byte_length, - duk_bi_nodejs_buffer_concat, - duk_bi_nodejs_buffer_constructor, - duk_bi_nodejs_buffer_copy, - duk_bi_nodejs_buffer_fill, - duk_bi_nodejs_buffer_is_buffer, - duk_bi_nodejs_buffer_is_encoding, - duk_bi_nodejs_buffer_tojson, - duk_bi_nodejs_buffer_tostring, - duk_bi_nodejs_buffer_write, - duk_bi_number_constructor, - duk_bi_number_prototype_to_exponential, - duk_bi_number_prototype_to_fixed, - duk_bi_number_prototype_to_locale_string, - duk_bi_number_prototype_to_precision, - duk_bi_number_prototype_to_string, - duk_bi_number_prototype_value_of, - duk_bi_object_constructor, - duk_bi_object_constructor_assign, - duk_bi_object_constructor_create, - duk_bi_object_constructor_define_properties, - duk_bi_object_constructor_define_property, - duk_bi_object_constructor_get_own_property_descriptor, - duk_bi_object_constructor_is, - duk_bi_object_constructor_is_extensible, - duk_bi_object_constructor_is_sealed_frozen_shared, - duk_bi_object_constructor_keys_shared, - duk_bi_object_constructor_prevent_extensions, - duk_bi_object_constructor_seal_freeze_shared, - duk_bi_object_getprototype_shared, - duk_bi_object_prototype_defineaccessor, - duk_bi_object_prototype_has_own_property, - duk_bi_object_prototype_is_prototype_of, - duk_bi_object_prototype_lookupaccessor, - duk_bi_object_prototype_property_is_enumerable, - duk_bi_object_prototype_to_locale_string, - duk_bi_object_prototype_to_string, - duk_bi_object_prototype_value_of, - duk_bi_object_setprototype_shared, - duk_bi_performance_now, - duk_bi_pointer_constructor, - duk_bi_pointer_prototype_tostring_shared, - duk_bi_proxy_constructor, - duk_bi_reflect_apply, - duk_bi_reflect_construct, - duk_bi_reflect_object_delete_property, - duk_bi_reflect_object_get, - duk_bi_reflect_object_has, - duk_bi_reflect_object_set, - duk_bi_regexp_constructor, - duk_bi_regexp_prototype_exec, - duk_bi_regexp_prototype_flags, - duk_bi_regexp_prototype_shared_getter, - duk_bi_regexp_prototype_test, - duk_bi_regexp_prototype_tostring, - duk_bi_string_constructor, - duk_bi_string_constructor_from_char_code, - duk_bi_string_constructor_from_code_point, - duk_bi_string_prototype_caseconv_shared, - duk_bi_string_prototype_char_at, - duk_bi_string_prototype_char_code_at, - duk_bi_string_prototype_concat, - duk_bi_string_prototype_includes, - duk_bi_string_prototype_indexof_shared, - duk_bi_string_prototype_locale_compare, - duk_bi_string_prototype_match, - duk_bi_string_prototype_repeat, - duk_bi_string_prototype_replace, - duk_bi_string_prototype_search, - duk_bi_string_prototype_slice, - duk_bi_string_prototype_split, - duk_bi_string_prototype_startswith_endswith, - duk_bi_string_prototype_substr, - duk_bi_string_prototype_substring, - duk_bi_string_prototype_to_string, - duk_bi_string_prototype_trim, - duk_bi_textdecoder_constructor, - duk_bi_textdecoder_prototype_decode, - duk_bi_textdecoder_prototype_shared_getter, - duk_bi_textencoder_constructor, - duk_bi_textencoder_prototype_encode, - duk_bi_textencoder_prototype_encoding_getter, - duk_bi_thread_constructor, - duk_bi_thread_current, - duk_bi_thread_resume, - duk_bi_thread_yield, - duk_bi_type_error_thrower, - duk_bi_typedarray_buffer_getter, - duk_bi_typedarray_bytelength_getter, - duk_bi_typedarray_byteoffset_getter, - duk_bi_typedarray_constructor, - duk_bi_typedarray_set, - duk_bi_uint8array_allocplain, - duk_bi_uint8array_plainof, -}; -#if defined(DUK_USE_DOUBLE_LE) -DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { -144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, -252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, -167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, -64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, -142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, -242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, -1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, -33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, -13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, -0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, -0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, -217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, -146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,0,0, -0,0,3,225,255,51,0,0,0,0,0,0,3,193,255,47,18,1,172,19,120,71,10,25,196,136, -113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,2, -185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,130, -249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,138, -9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,190,15, -38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,53,64, -243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,124, -35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,116, -88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,240,70, -68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,51,132, -9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,105,27, -60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,117,204, -123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,65,112, -152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,39,199, -89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,58,205, -227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,133,18, -2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,39,31,23, -60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,18,84,141, -159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,194,197, -217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,32,130, -166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,151,21,0, -100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,214,111, -31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,10,62, -46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,52, -156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, -214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, -165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, -143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, -180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, -54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, -178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, -129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, -201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, -132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, -46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, -193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, -133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, -9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, -134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, -64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, -145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, -77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, -110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, -110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, -127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, -33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, -4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,255,255,255,255, -239,127,19,214,33,187,85,2,232,72,0,32,0,0,0,0,0,0,25,136,0,0,0,0,0,0,31, -15,228,122,247,73,19,69,73,180,134,149,13,68,241,0,0,0,0,0,0,3,193,252,143, -90,67,2,104,169,54,144,210,161,168,158,32,0,0,0,0,0,0,120,127,142,73,78,20, -0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68, -13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205, -222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90, -112,164,0,0,0,0,0,0,124,63,226,117,119,128,25,55,112,96,153,57,41,197,13, -53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16, -22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74, -113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104, -97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22, -190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196, -206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208, -76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49, -39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49, -39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112, -163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229, -100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117, -11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68, -157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149, -178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34, -9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62, -49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17, -34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60, -137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248, -199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200, -147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2, -54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56, -7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49, -89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0, -131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217, -231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232, -228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19, -235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1, -64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93, -168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20, -19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,0,0,0,32,93,105,160, -91,60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12, -168,110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136, -115,36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112, -145,139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161, -166,28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148, -145,92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142, -41,100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103, -177,69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138, -99,68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199, -9,49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20, -98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36, -249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242, -136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229, -16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39, -194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68, -89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,104,71,161,196,201,45,167,146,59, -68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,136,71,161,196,201,45,167,146, -59,68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,168,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,200,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,232,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,8,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,40,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,72,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,0,0,0,1,2,1,135,52,102,32,76,72,1,246,136,235, -103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91, -171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13, -158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1, -246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161, -37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79, -75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112, -39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186, -129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237, -17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134, -207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134, -207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38, -78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213, -146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39, -104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208, -146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16, -217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101, -162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201, -77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68, -117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104, -162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123, -102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160, -72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32, -52,171,138,69,133,95,130,160,4,234,219,163,161,0,89,86,214,238,197,172,9,0, -31,86,221,40,29,231,63,95,200,69,220,199,225,122,183,27,72,144,63,160,138, -217,81,197,125,207,195,117,110,54,142,129,32,7,114,147,10,189,229,237,159, -130,235,209,0,96,181,17,83,236,132,37,0,63,101,8,207,71,107,74,6,105,219, -251,52,245,7,49,248,94,202,17,158,148,12,211,183,246,105,234,15,99,242,159, -129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160, -192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152, -27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163, -32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72, -188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29, -13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205, -72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80, -81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128, -153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9, -128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203, -164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113, -120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17, -16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94, -100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14, -108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7, -10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227, -138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43, -80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178, -48,141,156,0,0,0,0,0,0,15,3,243,49,135,16,143,67,137,146,91,79,36,118,136, -178,48,141,156,0,0,0,0,0,0,15,3,245,20,5,173,194,227,214,4,55,0,0,21,196,7, -122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180, -69,145,132,108,224,0,0,0,0,0,0,120,31,153,140,72,132,122,28,76,146,218,121, -35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,80,132,122,28,76,146,218, -121,35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,88,132,122,28,76,146, -218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,96,132,122,28,76, -146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,104,132,122, -28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,112, -132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,16,32,16, -113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224, -104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131, -165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3, -154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232, -147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, -}; -#elif defined(DUK_USE_DOUBLE_BE) -DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { -144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, -252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, -167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, -64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, -142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, -242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, -1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, -33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, -13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, -0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, -0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, -217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, -146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,1,255, -224,0,0,0,0,0,3,51,1,255,192,0,0,0,0,0,3,47,18,1,172,19,120,71,10,25,196, -136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58, -2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58, -130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180, -138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46, -190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207, -53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94, -124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37, -116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20, -240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153, -51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238, -105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129, -117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0, -65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49, -39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62, -58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129, -133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13, -39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95, -18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37, -194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151, -32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72, -151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113, -214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226, -10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84, -52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, -214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, -165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, -143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, -180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, -54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, -178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, -129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, -201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, -132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, -46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, -193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, -133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, -9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, -134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, -64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, -145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, -77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, -110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, -110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, -127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, -33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, -4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,127,239,255,255,255,255, -255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,0,0,0,57,136,15,255,0,0,0,0,0, -0,4,122,247,73,19,69,73,180,134,149,13,68,241,1,255,192,0,0,0,0,0,0,143,90, -67,2,104,169,54,144,210,161,168,158,32,127,248,0,0,0,0,0,0,14,73,78,20,0,0, -0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,13, -155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,222, -17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,112, -164,63,252,0,0,0,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,53,224, -65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,22,78, -12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,113,67, -77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,97,47, -128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,190, -96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,206, -185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,76, -150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,39, -195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,39, -198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,163, -18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,100,40, -15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,11,90, -36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,157,160, -3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,178,166, -74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,9,205, -28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,49,13, -164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,34,79, -135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,137,62, -12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,199,54, -103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,147,225, -104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,54,223, -224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,7,38, -193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,89, -252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,131, -64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,231, -197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,228, -74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,235,1, -64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,64, -174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,168, -167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,19, -177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,32,105,221,32,0,0,0,0,91, -60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168, -110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115, -36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145, -139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166, -28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145, -92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41, -100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177, -69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99, -68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9, -49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20, -98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36, -249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242, -136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229, -16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39, -194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68, -89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59, -68,89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,136,71,161,196,201,45,167,146, -59,68,89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,168,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,200,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,232,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,8,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,40,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,72,71,161,196,201,45,167, -146,59,68,89,24,70,206,2,1,0,0,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235, -103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91, -171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13, -158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1, -246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161, -37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79, -75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112, -39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186, -129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237, -17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134, -207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134, -207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38, -78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213, -146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39, -104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208, -146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16, -217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101, -162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201, -77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68, -117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104, -162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123, -102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160, -72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32, -32,2,223,133,69,138,43,180,132,234,219,163,161,1,0,9,174,198,238,213,84,88, -31,86,221,40,7,252,197,200,95,223,71,61,225,122,183,27,72,144,15,253,197, -81,217,74,224,191,131,117,110,54,142,129,32,31,237,229,189,138,147,114,135, -2,235,209,1,0,36,135,237,81,16,180,96,63,101,8,207,71,107,74,1,255,53,4, -243,51,249,222,104,94,202,17,158,148,3,255,106,9,230,103,243,188,210,159, -129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160, -192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152, -27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163, -32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72, -188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29, -13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205, -72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80, -81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128, -153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9, -128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203, -164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113, -120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17, -16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94, -100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14, -108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7, -10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227, -138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43, -80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178, -48,141,156,3,255,0,0,0,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136, -178,48,141,156,3,255,0,0,0,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7, -122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180, -69,145,132,108,224,31,248,0,0,0,0,0,0,25,140,72,132,122,28,76,146,218,121, -35,180,69,145,132,108,224,32,0,0,0,0,0,0,0,25,140,80,132,122,28,76,146,218, -121,35,180,69,145,132,108,224,32,0,0,0,0,0,0,0,25,140,88,132,122,28,76,146, -218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,96,132,122,28,76, -146,218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,104,132,122, -28,76,146,218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,112, -132,122,28,76,146,218,121,35,180,69,145,132,108,224,32,16,0,0,0,0,0,0,16, -113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224, -104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131, -165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3, -154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232, -147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, -}; -#elif defined(DUK_USE_DOUBLE_ME) -DUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = { -144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242, -252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33, -167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228, -64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46, -142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240, -242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0, -1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132, -33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17, -13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192, -0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188, -0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85, -217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225, -146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,3, -225,252,0,0,0,3,51,0,0,3,193,252,0,0,0,3,47,18,1,172,19,120,71,10,25,196, -136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58, -2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58, -130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180, -138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46, -190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207, -53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94, -124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37, -116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20, -240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153, -51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238, -105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129, -117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0, -65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49, -39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62, -58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129, -133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13, -39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95, -18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37, -194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151, -32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72, -151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113, -214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226, -10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84, -52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142, -214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173, -165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6, -143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62, -180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129, -54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0, -178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87, -129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104, -201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71, -132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232, -46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35, -193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194, -133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56, -9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14, -134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184, -64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6, -145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67, -77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113, -110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113, -110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2, -127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4, -33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207, -4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,239,127,255,255, -255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,32,0,0,25,136,0,0,31,15,224,0, -0,0,4,122,247,73,19,69,73,180,134,149,13,68,241,0,0,3,193,252,0,0,0,0,143, -90,67,2,104,169,54,144,210,161,168,158,32,0,0,120,127,128,0,0,0,14,73,78, -20,0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247, -68,13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205, -222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90, -112,164,0,0,124,63,128,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13, -53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16, -22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74, -113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104, -97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22, -190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196, -206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208, -76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49, -39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49, -39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112, -163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229, -100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117, -11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68, -157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149, -178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34, -9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62, -49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17, -34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60, -137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248, -199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200, -147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2, -54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56, -7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49, -89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0, -131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217, -231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232, -228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19, -235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1, -64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93, -168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20, -19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,32,93,105,160,0,0,0,0, -91,60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12, -168,110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136, -115,36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112, -145,139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161, -166,28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148, -145,92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142, -41,100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103, -177,69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138, -99,68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199, -9,49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20, -98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36, -249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242, -136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229, -16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39, -194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68, -89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59, -68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,136,71,161,196,201,45,167,146, -59,68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,168,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,200,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,232,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,8,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,40,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,72,71,161,196,201,45,167, -146,59,68,89,24,70,206,0,0,1,2,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235, -103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91, -171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13, -158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1, -246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161, -37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79, -75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112, -39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186, -129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237, -17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134, -207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134, -207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38, -78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213, -146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39, -104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208, -146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16, -217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101, -162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201, -77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68, -117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104, -162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123, -102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160, -72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,5, -95,130,160,52,171,138,69,132,234,219,163,161,2,197,172,9,0,89,86,214,236, -31,86,221,40,8,69,220,199,253,231,63,95,193,122,183,27,72,144,17,197,125, -207,255,160,138,217,67,117,110,54,142,129,32,61,229,237,159,135,114,147,10, -130,235,209,3,236,132,37,0,96,181,17,80,63,101,8,207,71,107,74,4,245,7,49, -254,105,219,251,48,94,202,17,158,148,9,234,15,99,252,211,183,246,98,159, -129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160, -192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152, -27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163, -32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72, -188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29, -13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205, -72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80, -81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128, -153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9, -128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203, -164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113, -120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17, -16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94, -100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14, -108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7, -10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227, -138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43, -80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178, -48,141,156,0,0,15,3,240,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136, -178,48,141,156,0,0,15,3,240,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7, -122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180, -69,145,132,108,224,0,0,120,31,128,0,0,0,25,140,72,132,122,28,76,146,218, -121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,80,132,122,28,76,146, -218,121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,88,132,122,28,76, -146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,96,132,122, -28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,104, -132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25, -140,112,132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,16,32,0,0, -0,0,16,113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33, -18,224,104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80, -70,131,165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73, -7,78,3,154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154, -232,147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0, -}; -#else -#error invalid endianness defines -#endif -#endif /* DUK_USE_ROM_OBJECTS */ - -/* automatic undefs */ -#undef DUK__REFCINIT -#line 1 "duk_error_macros.c" -/* - * Error and fatal handling. - */ - -/* #include duk_internal.h -> already included */ - -#define DUK__ERRFMT_BUFSIZE 256 /* size for formatting buffers */ - -#if defined(DUK_USE_VERBOSE_ERRORS) - -DUK_INTERNAL DUK_COLD void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...) { - va_list ap; - char msg[DUK__ERRFMT_BUFSIZE]; - va_start(ap, fmt); - (void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap); - msg[sizeof(msg) - 1] = (char) 0; - duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL)); - va_end(ap); /* dead code, but ensures portability (see Linux man page notes) */ -} - -DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg) { - duk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL)); -} - -#else /* DUK_USE_VERBOSE_ERRORS */ - -DUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code) { - duk_err_create_and_throw(thr, code); -} - -#endif /* DUK_USE_VERBOSE_ERRORS */ - -/* - * Error throwing helpers - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -#if defined(DUK_USE_PARANOID_ERRORS) -DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) { - DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)", - expect_name, duk_get_type_name(thr, idx), (long) idx); -} -#else -DUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) { - DUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, "%s required, found %s (stack index %ld)", - expect_name, duk_push_string_readable(thr, idx), (long) idx); -} -#endif -DUK_INTERNAL DUK_COLD void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_INTERNAL_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_ALLOC_FAILED); -} -DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, message); -} -DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, message); -} -DUK_INTERNAL DUK_COLD void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx) { - DUK_ERROR_RAW_FMT1(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, "invalid stack index %ld", (long) (idx)); -} -DUK_INTERNAL DUK_COLD void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); -} -DUK_INTERNAL DUK_COLD void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_ARGS); -} -DUK_INTERNAL DUK_COLD void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_STATE); -} -DUK_INTERNAL DUK_COLD void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber) { - DUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_TRAP_RESULT); -} -#else -/* The file/line arguments are NULL and 0, they're ignored by DUK_ERROR_RAW() - * when non-verbose errors are used. - */ - -DUK_NORETURN(DUK_LOCAL_DECL void duk__err_shared(duk_hthread *thr, duk_errcode_t code)); -DUK_LOCAL void duk__err_shared(duk_hthread *thr, duk_errcode_t code) { - DUK_ERROR_RAW(thr, NULL, 0, code, NULL); -} -DUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_RANGE_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_eval(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_EVAL_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_reference(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_REFERENCE_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_syntax(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_SYNTAX_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_type(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_TYPE_ERROR); -} -DUK_INTERNAL DUK_COLD void duk_err_uri(duk_hthread *thr) { - duk__err_shared(thr, DUK_ERR_URI_ERROR); -} -#endif - -/* - * Default fatal error handler - */ - -DUK_INTERNAL DUK_COLD void duk_default_fatal_handler(void *udata, const char *msg) { - DUK_UNREF(udata); - DUK_UNREF(msg); - -#if defined(DUK_USE_FATAL_HANDLER) - /* duk_config.h provided a custom default fatal handler. */ - DUK_D(DUK_DPRINT("custom default fatal error handler called: %s", msg ? msg : "NULL")); - DUK_USE_FATAL_HANDLER(udata, msg); -#else - /* Default behavior is to abort() on error. There's no printout - * which makes this awkward, so it's always recommended to use an - * explicit fatal error handler. - * - * ==================================================================== - * NOTE: If you are seeing this, you are most likely dealing with an - * uncaught error. You should provide a fatal error handler in Duktape - * heap creation, and should consider using a protected call as your - * first call into an empty Duktape context to properly handle errors. - * See: - * - http://duktape.org/guide.html#error-handling - * - http://wiki.duktape.org/HowtoFatalErrors.html - * - http://duktape.org/api.html#taglist-protected - * ==================================================================== - */ - DUK_D(DUK_DPRINT("built-in default fatal error handler called: %s", msg ? msg : "NULL")); - DUK_ABORT(); -#endif - - DUK_D(DUK_DPRINT("fatal error handler returned, enter forever loop")); - for (;;) { - /* Loop forever to ensure we don't return. */ - } -} - -/* automatic undefs */ -#undef DUK__ERRFMT_BUFSIZE -#line 1 "duk_unicode_support.c" -/* - * Various Unicode help functions for character classification predicates, - * case conversion, decoding, etc. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Fast path tables - */ - -#if defined(DUK_USE_IDCHAR_FASTPATH) -DUK_INTERNAL const duk_int8_t duk_is_idchar_tab[128] = { - /* 0: not IdentifierStart or IdentifierPart - * 1: IdentifierStart and IdentifierPart - * -1: IdentifierPart only - */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00...0x0f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10...0x1f */ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20...0x2f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, /* 0x30...0x3f */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40...0x4f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50...0x5f */ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60...0x6f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 /* 0x70...0x7f */ -}; -#endif - -/* - * XUTF-8 and CESU-8 encoding/decoding - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp) { - duk_uint_fast32_t x = (duk_uint_fast32_t) cp; - if (x < 0x80UL) { - /* 7 bits */ - return 1; - } else if (x < 0x800UL) { - /* 11 bits */ - return 2; - } else if (x < 0x10000UL) { - /* 16 bits */ - return 3; - } else if (x < 0x200000UL) { - /* 21 bits */ - return 4; - } else if (x < 0x4000000UL) { - /* 26 bits */ - return 5; - } else if (x < (duk_ucodepoint_t) 0x80000000UL) { - /* 31 bits */ - return 6; - } else { - /* 36 bits */ - return 7; - } -} - -#if defined(DUK_USE_ASSERTIONS) -DUK_INTERNAL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp) { - duk_uint_fast32_t x = (duk_uint_fast32_t) cp; - if (x < 0x80UL) { - /* 7 bits */ - return 1; - } else if (x < 0x800UL) { - /* 11 bits */ - return 2; - } else if (x < 0x10000UL) { - /* 16 bits */ - return 3; - } else { - /* Encoded as surrogate pair, each encoding to 3 bytes for - * 6 bytes total. Codepoints above U+10FFFF encode as 6 bytes - * too, see duk_unicode_encode_cesu8(). - */ - return 3 + 3; - } -} -#endif /* DUK_USE_ASSERTIONS */ - -DUK_INTERNAL const duk_uint8_t duk_unicode_xutf8_markers[7] = { - 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe -}; - -/* Encode to extended UTF-8; 'out' must have space for at least - * DUK_UNICODE_MAX_XUTF8_LENGTH bytes. Allows encoding of any - * 32-bit (unsigned) codepoint. - */ -DUK_INTERNAL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out) { - duk_uint_fast32_t x = (duk_uint_fast32_t) cp; - duk_small_int_t len; - duk_uint8_t marker; - duk_small_int_t i; - - len = duk_unicode_get_xutf8_length(cp); - DUK_ASSERT(len > 0); - - marker = duk_unicode_xutf8_markers[len - 1]; /* 64-bit OK because always >= 0 */ - - i = len; - DUK_ASSERT(i > 0); - do { - i--; - if (i > 0) { - out[i] = (duk_uint8_t) (0x80 + (x & 0x3f)); - x >>= 6; - } else { - /* Note: masking of 'x' is not necessary because of - * range check and shifting -> no bits overlapping - * the marker should be set. - */ - out[0] = (duk_uint8_t) (marker + x); - } - } while (i > 0); - - return len; -} - -/* Encode to CESU-8; 'out' must have space for at least - * DUK_UNICODE_MAX_CESU8_LENGTH bytes; codepoints above U+10FFFF - * will encode to garbage but won't overwrite the output buffer. - */ -DUK_INTERNAL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out) { - duk_uint_fast32_t x = (duk_uint_fast32_t) cp; - duk_small_int_t len; - - if (x < 0x80UL) { - out[0] = (duk_uint8_t) x; - len = 1; - } else if (x < 0x800UL) { - out[0] = (duk_uint8_t) (0xc0 + ((x >> 6) & 0x1f)); - out[1] = (duk_uint8_t) (0x80 + (x & 0x3f)); - len = 2; - } else if (x < 0x10000UL) { - /* surrogate pairs get encoded here */ - out[0] = (duk_uint8_t) (0xe0 + ((x >> 12) & 0x0f)); - out[1] = (duk_uint8_t) (0x80 + ((x >> 6) & 0x3f)); - out[2] = (duk_uint8_t) (0x80 + (x & 0x3f)); - len = 3; - } else { - /* - * Unicode codepoints above U+FFFF are encoded as surrogate - * pairs here. This ensures that all CESU-8 codepoints are - * 16-bit values as expected in Ecmascript. The surrogate - * pairs always get a 3-byte encoding (each) in CESU-8. - * See: http://en.wikipedia.org/wiki/Surrogate_pair - * - * 20-bit codepoint, 10 bits (A and B) per surrogate pair: - * - * x = 0b00000000 0000AAAA AAAAAABB BBBBBBBB - * sp1 = 0b110110AA AAAAAAAA (0xd800 + ((x >> 10) & 0x3ff)) - * sp2 = 0b110111BB BBBBBBBB (0xdc00 + (x & 0x3ff)) - * - * Encoded into CESU-8: - * - * sp1 -> 0b11101101 (0xe0 + ((sp1 >> 12) & 0x0f)) - * -> 0b1010AAAA (0x80 + ((sp1 >> 6) & 0x3f)) - * -> 0b10AAAAAA (0x80 + (sp1 & 0x3f)) - * sp2 -> 0b11101101 (0xe0 + ((sp2 >> 12) & 0x0f)) - * -> 0b1011BBBB (0x80 + ((sp2 >> 6) & 0x3f)) - * -> 0b10BBBBBB (0x80 + (sp2 & 0x3f)) - * - * Note that 0x10000 must be subtracted first. The code below - * avoids the sp1, sp2 temporaries which saves around 20 bytes - * of code. - */ - - x -= 0x10000UL; - - out[0] = (duk_uint8_t) (0xed); - out[1] = (duk_uint8_t) (0xa0 + ((x >> 16) & 0x0f)); - out[2] = (duk_uint8_t) (0x80 + ((x >> 10) & 0x3f)); - out[3] = (duk_uint8_t) (0xed); - out[4] = (duk_uint8_t) (0xb0 + ((x >> 6) & 0x0f)); - out[5] = (duk_uint8_t) (0x80 + (x & 0x3f)); - len = 6; - } - - return len; -} - -/* Decode helper. Return zero on error. */ -DUK_INTERNAL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp) { - const duk_uint8_t *p; - duk_uint32_t res; - duk_uint_fast8_t ch; - duk_small_int_t n; - - DUK_UNREF(thr); - - p = *ptr; - if (p < ptr_start || p >= ptr_end) { - goto fail; - } - - /* - * UTF-8 decoder which accepts longer than standard byte sequences. - * This allows full 32-bit code points to be used. - */ - - ch = (duk_uint_fast8_t) (*p++); - if (ch < 0x80) { - /* 0xxx xxxx [7 bits] */ - res = (duk_uint32_t) (ch & 0x7f); - n = 0; - } else if (ch < 0xc0) { - /* 10xx xxxx -> invalid */ - goto fail; - } else if (ch < 0xe0) { - /* 110x xxxx 10xx xxxx [11 bits] */ - res = (duk_uint32_t) (ch & 0x1f); - n = 1; - } else if (ch < 0xf0) { - /* 1110 xxxx 10xx xxxx 10xx xxxx [16 bits] */ - res = (duk_uint32_t) (ch & 0x0f); - n = 2; - } else if (ch < 0xf8) { - /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx [21 bits] */ - res = (duk_uint32_t) (ch & 0x07); - n = 3; - } else if (ch < 0xfc) { - /* 1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [26 bits] */ - res = (duk_uint32_t) (ch & 0x03); - n = 4; - } else if (ch < 0xfe) { - /* 1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [31 bits] */ - res = (duk_uint32_t) (ch & 0x01); - n = 5; - } else if (ch < 0xff) { - /* 1111 1110 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [36 bits] */ - res = (duk_uint32_t) (0); - n = 6; - } else { - /* 8-byte format could be: - * 1111 1111 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx [41 bits] - * - * However, this format would not have a zero bit following the - * leading one bits and would not allow 0xFF to be used as an - * "invalid xutf-8" marker for internal keys. Further, 8-byte - * encodings (up to 41 bit code points) are not currently needed. - */ - goto fail; - } - - DUK_ASSERT(p >= ptr_start); /* verified at beginning */ - if (p + n > ptr_end) { - /* check pointer at end */ - goto fail; - } - - while (n > 0) { - DUK_ASSERT(p >= ptr_start && p < ptr_end); - ch = (duk_uint_fast8_t) (*p++); -#if 0 - if (ch & 0xc0 != 0x80) { - /* not a continuation byte */ - p--; - *ptr = p; - *out_cp = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - return 1; - } -#endif - res = (res << 6) + (duk_uint32_t) (ch & 0x3f); - n--; - } - - *ptr = p; - *out_cp = res; - return 1; - - fail: - return 0; -} - -/* used by e.g. duk_regexp_executor.c, string built-ins */ -DUK_INTERNAL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end) { - duk_ucodepoint_t cp; - - if (duk_unicode_decode_xutf8(thr, ptr, ptr_start, ptr_end, &cp)) { - return cp; - } - DUK_ERROR_INTERNAL(thr); - DUK_UNREACHABLE(); - return 0; -} - -/* Compute (extended) utf-8 length without codepoint encoding validation, - * used for string interning. - * - * NOTE: This algorithm is performance critical, more so than string hashing - * in some cases. It is needed when interning a string and needs to scan - * every byte of the string with no skipping. Having an ASCII fast path - * is useful if possible in the algorithm. The current algorithms were - * chosen from several variants, based on x64 gcc -O2 testing. See: - * https://github.com/svaarala/duktape/pull/422 - * - * NOTE: must match tools/dukutil.py:duk_unicode_unvalidated_utf8_length(). - */ - -#if defined(DUK_USE_PREFER_SIZE) -/* Small variant; roughly 150 bytes smaller than the fast variant. */ -DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) { - const duk_uint8_t *p; - const duk_uint8_t *p_end; - duk_size_t ncont; - duk_size_t clen; - - p = data; - p_end = data + blen; - ncont = 0; - while (p != p_end) { - duk_uint8_t x; - x = *p++; - if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { - ncont++; - } - } - - DUK_ASSERT(ncont <= blen); - clen = blen - ncont; - DUK_ASSERT(clen <= blen); - return clen; -} -#else /* DUK_USE_PREFER_SIZE */ -/* This seems like a good overall approach. Fast path for ASCII in 4 byte - * blocks. - */ -DUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) { - const duk_uint8_t *p; - const duk_uint8_t *p_end; - const duk_uint32_t *p32_end; - const duk_uint32_t *p32; - duk_size_t ncont; - duk_size_t clen; - - ncont = 0; /* number of continuation (non-initial) bytes in [0x80,0xbf] */ - p = data; - p_end = data + blen; - if (blen < 16) { - goto skip_fastpath; - } - - /* Align 'p' to 4; the input data may have arbitrary alignment. - * End of string check not needed because blen >= 16. - */ - while (((duk_size_t) (const void *) p) & 0x03U) { - duk_uint8_t x; - x = *p++; - if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { - ncont++; - } - } - - /* Full, aligned 4-byte reads. */ - p32_end = (const duk_uint32_t *) (const void *) (p + ((duk_size_t) (p_end - p) & (duk_size_t) (~0x03))); - p32 = (const duk_uint32_t *) (const void *) p; - while (p32 != (const duk_uint32_t *) p32_end) { - duk_uint32_t x; - x = *p32++; - if (DUK_LIKELY((x & 0x80808080UL) == 0)) { - ; /* ASCII fast path */ - } else { - /* Flip highest bit of each byte which changes - * the bit pattern 10xxxxxx into 00xxxxxx which - * allows an easy bit mask test. - */ - x ^= 0x80808080UL; - if (DUK_UNLIKELY(!(x & 0xc0000000UL))) { - ncont++; - } - if (DUK_UNLIKELY(!(x & 0x00c00000UL))) { - ncont++; - } - if (DUK_UNLIKELY(!(x & 0x0000c000UL))) { - ncont++; - } - if (DUK_UNLIKELY(!(x & 0x000000c0UL))) { - ncont++; - } - } - } - p = (const duk_uint8_t *) p32; - /* Fall through to handle the rest. */ - - skip_fastpath: - while (p != p_end) { - duk_uint8_t x; - x = *p++; - if (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) { - ncont++; - } - } - - DUK_ASSERT(ncont <= blen); - clen = blen - ncont; - DUK_ASSERT(clen <= blen); - return clen; -} -#endif /* DUK_USE_PREFER_SIZE */ - -/* - * Unicode range matcher - * - * Matches a codepoint against a packed bitstream of character ranges. - * Used for slow path Unicode matching. - */ - -/* Must match tools/extract_chars.py, generate_match_table3(). */ -DUK_LOCAL duk_uint32_t duk__uni_decode_value(duk_bitdecoder_ctx *bd_ctx) { - duk_uint32_t t; - - t = (duk_uint32_t) duk_bd_decode(bd_ctx, 4); - if (t <= 0x0eU) { - return t; - } - t = (duk_uint32_t) duk_bd_decode(bd_ctx, 8); - if (t <= 0xfdU) { - return t + 0x0f; - } - if (t == 0xfeU) { - t = (duk_uint32_t) duk_bd_decode(bd_ctx, 12); - return t + 0x0fU + 0xfeU; - } else { - t = (duk_uint32_t) duk_bd_decode(bd_ctx, 24); - return t + 0x0fU + 0xfeU + 0x1000UL; - } -} - -DUK_LOCAL duk_small_int_t duk__uni_range_match(const duk_uint8_t *unitab, duk_size_t unilen, duk_codepoint_t cp) { - duk_bitdecoder_ctx bd_ctx; - duk_codepoint_t prev_re; - - DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); - bd_ctx.data = (const duk_uint8_t *) unitab; - bd_ctx.length = (duk_size_t) unilen; - - prev_re = 0; - for (;;) { - duk_codepoint_t r1, r2; - r1 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx); - if (r1 == 0) { - break; - } - r2 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx); - - r1 = prev_re + r1; - r2 = r1 + r2; - prev_re = r2; - - /* [r1,r2] is the range */ - - DUK_DDD(DUK_DDDPRINT("duk__uni_range_match: cp=%06lx range=[0x%06lx,0x%06lx]", - (unsigned long) cp, (unsigned long) r1, (unsigned long) r2)); - if (cp >= r1 && cp <= r2) { - return 1; - } - } - - return 0; -} - -/* - * "WhiteSpace" production check. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp) { - /* - * E5 Section 7.2 specifies six characters specifically as - * white space: - * - * 0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; - * 000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; - * 000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; - * 0020;SPACE;Zs;0;WS;;;;;N;;;;; - * 00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; - * FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; - * - * It also specifies any Unicode category 'Zs' characters as white - * space. These can be extracted with the "tools/extract_chars.py" script. - * Current result: - * - * RAW OUTPUT: - * =========== - * 0020;SPACE;Zs;0;WS;;;;;N;;;;; - * 00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; - * 1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; - * 180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;; - * 2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; - * 2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; - * 2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; - * 205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; - * 3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; - * - * RANGES: - * ======= - * 0x0020 - * 0x00a0 - * 0x1680 - * 0x180e - * 0x2000 ... 0x200a - * 0x202f - * 0x205f - * 0x3000 - * - * A manual decoder (below) is probably most compact for this. - */ - - duk_uint_fast8_t lo; - duk_uint_fast32_t hi; - - /* cp == -1 (EOF) never matches and causes return value 0 */ - - lo = (duk_uint_fast8_t) (cp & 0xff); - hi = (duk_uint_fast32_t) (cp >> 8); /* does not fit into an uchar */ - - if (hi == 0x0000UL) { - if (lo == 0x09U || lo == 0x0bU || lo == 0x0cU || - lo == 0x20U || lo == 0xa0U) { - return 1; - } - } else if (hi == 0x0020UL) { - if (lo <= 0x0aU || lo == 0x2fU || lo == 0x5fU) { - return 1; - } - } else if (cp == 0x1680L || cp == 0x180eL || cp == 0x3000L || - cp == 0xfeffL) { - return 1; - } - - return 0; -} - -/* - * "LineTerminator" production check. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp) { - /* - * E5 Section 7.3 - * - * A LineTerminatorSequence essentially merges sequences - * into a single line terminator. This must be handled by the caller. - */ - - if (cp == 0x000aL || cp == 0x000dL || cp == 0x2028L || - cp == 0x2029L) { - return 1; - } - - return 0; -} - -/* - * "IdentifierStart" production check. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp) { - /* - * E5 Section 7.6: - * - * IdentifierStart: - * UnicodeLetter - * $ - * _ - * \ UnicodeEscapeSequence - * - * IdentifierStart production has one multi-character production: - * - * \ UnicodeEscapeSequence - * - * The '\' character is -not- matched by this function. Rather, the caller - * should decode the escape and then call this function to check whether the - * decoded character is acceptable (see discussion in E5 Section 7.6). - * - * The "UnicodeLetter" alternative of the production allows letters - * from various Unicode categories. These can be extracted with the - * "tools/extract_chars.py" script. - * - * Because the result has hundreds of Unicode codepoint ranges, matching - * for any values >= 0x80 are done using a very slow range-by-range scan - * and a packed range format. - * - * The ASCII portion (codepoints 0x00 ... 0x7f) is fast-pathed below because - * it matters the most. The ASCII related ranges of IdentifierStart are: - * - * 0x0041 ... 0x005a ['A' ... 'Z'] - * 0x0061 ... 0x007a ['a' ... 'z'] - * 0x0024 ['$'] - * 0x005f ['_'] - */ - - /* ASCII (and EOF) fast path -- quick accept and reject */ - if (cp <= 0x7fL) { -#if defined(DUK_USE_IDCHAR_FASTPATH) - return (cp >= 0) && (duk_is_idchar_tab[cp] > 0); -#else - if ((cp >= 'a' && cp <= 'z') || - (cp >= 'A' && cp <= 'Z') || - cp == '_' || cp == '$') { - return 1; - } - return 0; -#endif - } - - /* Non-ASCII slow path (range-by-range linear comparison), very slow */ - -#if defined(DUK_USE_SOURCE_NONBMP) - if (duk__uni_range_match(duk_unicode_ids_noa, - (duk_size_t) sizeof(duk_unicode_ids_noa), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; -#else - if (cp < 0x10000L) { - if (duk__uni_range_match(duk_unicode_ids_noabmp, - sizeof(duk_unicode_ids_noabmp), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; - } else { - /* without explicit non-BMP support, assume non-BMP characters - * are always accepted as identifier characters. - */ - return 1; - } -#endif -} - -/* - * "IdentifierPart" production check. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp) { - /* - * E5 Section 7.6: - * - * IdentifierPart: - * IdentifierStart - * UnicodeCombiningMark - * UnicodeDigit - * UnicodeConnectorPunctuation - * [U+200C] - * [U+200D] - * - * IdentifierPart production has one multi-character production - * as part of its IdentifierStart alternative. The '\' character - * of an escape sequence is not matched here, see discussion in - * duk_unicode_is_identifier_start(). - * - * To match non-ASCII characters (codepoints >= 0x80), a very slow - * linear range-by-range scan is used. The codepoint is first compared - * to the IdentifierStart ranges, and if it doesn't match, then to a - * set consisting of code points in IdentifierPart but not in - * IdentifierStart. This is done to keep the unicode range data small, - * at the expense of speed. - * - * The ASCII fast path consists of: - * - * 0x0030 ... 0x0039 ['0' ... '9', UnicodeDigit] - * 0x0041 ... 0x005a ['A' ... 'Z', IdentifierStart] - * 0x0061 ... 0x007a ['a' ... 'z', IdentifierStart] - * 0x0024 ['$', IdentifierStart] - * 0x005f ['_', IdentifierStart and - * UnicodeConnectorPunctuation] - * - * UnicodeCombiningMark has no code points <= 0x7f. - * - * The matching code reuses the "identifier start" tables, and then - * consults a separate range set for characters in "identifier part" - * but not in "identifier start". These can be extracted with the - * "tools/extract_chars.py" script. - * - * UnicodeCombiningMark -> categories Mn, Mc - * UnicodeDigit -> categories Nd - * UnicodeConnectorPunctuation -> categories Pc - */ - - /* ASCII (and EOF) fast path -- quick accept and reject */ - if (cp <= 0x7fL) { -#if defined(DUK_USE_IDCHAR_FASTPATH) - return (cp >= 0) && (duk_is_idchar_tab[cp] != 0); -#else - if ((cp >= 'a' && cp <= 'z') || - (cp >= 'A' && cp <= 'Z') || - (cp >= '0' && cp <= '9') || - cp == '_' || cp == '$') { - return 1; - } - return 0; -#endif - } - - /* Non-ASCII slow path (range-by-range linear comparison), very slow */ - -#if defined(DUK_USE_SOURCE_NONBMP) - if (duk__uni_range_match(duk_unicode_ids_noa, - sizeof(duk_unicode_ids_noa), - (duk_codepoint_t) cp) || - duk__uni_range_match(duk_unicode_idp_m_ids_noa, - sizeof(duk_unicode_idp_m_ids_noa), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; -#else - if (cp < 0x10000L) { - if (duk__uni_range_match(duk_unicode_ids_noabmp, - sizeof(duk_unicode_ids_noabmp), - (duk_codepoint_t) cp) || - duk__uni_range_match(duk_unicode_idp_m_ids_noabmp, - sizeof(duk_unicode_idp_m_ids_noabmp), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; - } else { - /* without explicit non-BMP support, assume non-BMP characters - * are always accepted as identifier characters. - */ - return 1; - } -#endif -} - -/* - * Unicode letter check. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp) { - /* - * Unicode letter is now taken to be the categories: - * - * Lu, Ll, Lt, Lm, Lo - * - * (Not sure if this is exactly correct.) - * - * The ASCII fast path consists of: - * - * 0x0041 ... 0x005a ['A' ... 'Z'] - * 0x0061 ... 0x007a ['a' ... 'z'] - */ - - /* ASCII (and EOF) fast path -- quick accept and reject */ - if (cp <= 0x7fL) { - if ((cp >= 'a' && cp <= 'z') || - (cp >= 'A' && cp <= 'Z')) { - return 1; - } - return 0; - } - - /* Non-ASCII slow path (range-by-range linear comparison), very slow */ - -#if defined(DUK_USE_SOURCE_NONBMP) - if (duk__uni_range_match(duk_unicode_ids_noa, - sizeof(duk_unicode_ids_noa), - (duk_codepoint_t) cp) && - !duk__uni_range_match(duk_unicode_ids_m_let_noa, - sizeof(duk_unicode_ids_m_let_noa), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; -#else - if (cp < 0x10000L) { - if (duk__uni_range_match(duk_unicode_ids_noabmp, - sizeof(duk_unicode_ids_noabmp), - (duk_codepoint_t) cp) && - !duk__uni_range_match(duk_unicode_ids_m_let_noabmp, - sizeof(duk_unicode_ids_m_let_noabmp), - (duk_codepoint_t) cp)) { - return 1; - } - return 0; - } else { - /* without explicit non-BMP support, assume non-BMP characters - * are always accepted as letters. - */ - return 1; - } -#endif -} - -/* - * Complex case conversion helper which decodes a bit-packed conversion - * control stream generated by tools/extract_caseconv.py. The conversion - * is very slow because it runs through the conversion data in a linear - * fashion to save space (which is why ASCII characters have a special - * fast path before arriving here). - * - * The particular bit counts etc have been determined experimentally to - * be small but still sufficient, and must match the Python script - * (tools/extract_caseconv.py). - * - * The return value is the case converted codepoint or -1 if the conversion - * results in multiple characters (this is useful for regexp Canonicalization - * operation). If 'buf' is not NULL, the result codepoint(s) are also - * appended to the hbuffer. - * - * Context and locale specific rules must be checked before consulting - * this function. - */ - -DUK_LOCAL -duk_codepoint_t duk__slow_case_conversion(duk_hthread *thr, - duk_bufwriter_ctx *bw, - duk_codepoint_t cp, - duk_bitdecoder_ctx *bd_ctx) { - duk_small_int_t skip = 0; - duk_small_int_t n; - duk_small_int_t t; - duk_small_int_t count; - duk_codepoint_t tmp_cp; - duk_codepoint_t start_i; - duk_codepoint_t start_o; - - DUK_ASSERT(bd_ctx != NULL); - DUK_UNREF(thr); - - DUK_DDD(DUK_DDDPRINT("slow case conversion for codepoint: %ld", (long) cp)); - - /* range conversion with a "skip" */ - DUK_DDD(DUK_DDDPRINT("checking ranges")); - for (;;) { - skip++; - n = (duk_small_int_t) duk_bd_decode(bd_ctx, 6); - if (n == 0x3f) { - /* end marker */ - break; - } - DUK_DDD(DUK_DDDPRINT("skip=%ld, n=%ld", (long) skip, (long) n)); - - while (n--) { - start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - count = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); - DUK_DDD(DUK_DDDPRINT("range: start_i=%ld, start_o=%ld, count=%ld, skip=%ld", - (long) start_i, (long) start_o, (long) count, (long) skip)); - - if (cp >= start_i) { - tmp_cp = cp - start_i; /* always >= 0 */ - if (tmp_cp < (duk_codepoint_t) count * (duk_codepoint_t) skip && - (tmp_cp % (duk_codepoint_t) skip) == 0) { - DUK_DDD(DUK_DDDPRINT("range matches input codepoint")); - cp = start_o + tmp_cp; - goto single; - } - } - } - } - - /* 1:1 conversion */ - n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); - DUK_DDD(DUK_DDDPRINT("checking 1:1 conversions (count %ld)", (long) n)); - while (n--) { - start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - start_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - DUK_DDD(DUK_DDDPRINT("1:1 conversion %ld -> %ld", (long) start_i, (long) start_o)); - if (cp == start_i) { - DUK_DDD(DUK_DDDPRINT("1:1 matches input codepoint")); - cp = start_o; - goto single; - } - } - - /* complex, multicharacter conversion */ - n = (duk_small_int_t) duk_bd_decode(bd_ctx, 7); - DUK_DDD(DUK_DDDPRINT("checking 1:n conversions (count %ld)", (long) n)); - while (n--) { - start_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - t = (duk_small_int_t) duk_bd_decode(bd_ctx, 2); - DUK_DDD(DUK_DDDPRINT("1:n conversion %ld -> %ld chars", (long) start_i, (long) t)); - if (cp == start_i) { - DUK_DDD(DUK_DDDPRINT("1:n matches input codepoint")); - if (bw != NULL) { - while (t--) { - tmp_cp = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16); - DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) tmp_cp); - } - } - return -1; - } else { - while (t--) { - (void) duk_bd_decode(bd_ctx, 16); - } - } - } - - /* default: no change */ - DUK_DDD(DUK_DDDPRINT("no rule matches, output is same as input")); - /* fall through */ - - single: - if (bw != NULL) { - DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp); - } - return cp; -} - -/* - * Case conversion helper, with context/local sensitivity. - * For proper case conversion, one needs to know the character - * and the preceding and following characters, as well as - * locale/language. - */ - -/* XXX: add 'language' argument when locale/language sensitive rule - * support added. - */ -DUK_LOCAL -duk_codepoint_t duk__case_transform_helper(duk_hthread *thr, - duk_bufwriter_ctx *bw, - duk_codepoint_t cp, - duk_codepoint_t prev, - duk_codepoint_t next, - duk_bool_t uppercase) { - duk_bitdecoder_ctx bd_ctx; - - /* fast path for ASCII */ - if (cp < 0x80L) { - /* XXX: there are language sensitive rules for the ASCII range. - * If/when language/locale support is implemented, they need to - * be implemented here for the fast path. There are no context - * sensitive rules for ASCII range. - */ - - if (uppercase) { - if (cp >= 'a' && cp <= 'z') { - cp = cp - 'a' + 'A'; - } - } else { - if (cp >= 'A' && cp <= 'Z') { - cp = cp - 'A' + 'a'; - } - } - - if (bw != NULL) { - DUK_BW_WRITE_RAW_U8(thr, bw, (duk_uint8_t) cp); - } - return cp; - } - - /* context and locale specific rules which cannot currently be represented - * in the caseconv bitstream: hardcoded rules in C - */ - if (uppercase) { - /* XXX: turkish / azeri */ - } else { - /* - * Final sigma context specific rule. This is a rather tricky - * rule and this handling is probably not 100% correct now. - * The rule is not locale/language specific so it is supported. - */ - - if (cp == 0x03a3L && /* U+03A3 = GREEK CAPITAL LETTER SIGMA */ - duk_unicode_is_letter(prev) && /* prev exists and is not a letter */ - !duk_unicode_is_letter(next)) { /* next does not exist or next is not a letter */ - /* Capital sigma occurred at "end of word", lowercase to - * U+03C2 = GREEK SMALL LETTER FINAL SIGMA. Otherwise - * fall through and let the normal rules lowercase it to - * U+03C3 = GREEK SMALL LETTER SIGMA. - */ - cp = 0x03c2L; - goto singlechar; - } - - /* XXX: lithuanian not implemented */ - /* XXX: lithuanian, explicit dot rules */ - /* XXX: turkish / azeri, lowercase rules */ - } - - /* 1:1 or special conversions, but not locale/context specific: script generated rules */ - DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); - if (uppercase) { - bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_uc; - bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_uc); - } else { - bd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_lc; - bd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_lc); - } - return duk__slow_case_conversion(thr, bw, cp, &bd_ctx); - - singlechar: - if (bw != NULL) { - DUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp); - } - return cp; - - /* unused now, not needed until Turkish/Azeri */ -#if 0 - nochar: - return -1; -#endif -} - -/* - * Replace valstack top with case converted version. - */ - -DUK_INTERNAL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase) { - duk_hstring *h_input; - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; - const duk_uint8_t *p, *p_start, *p_end; - duk_codepoint_t prev, curr, next; - - h_input = duk_require_hstring(thr, -1); /* Accept symbols. */ - DUK_ASSERT(h_input != NULL); - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); - - /* [ ... input buffer ] */ - - p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start; - - prev = -1; DUK_UNREF(prev); - curr = -1; - next = -1; - for (;;) { - prev = curr; - curr = next; - next = -1; - if (p < p_end) { - next = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); - } else { - /* end of input and last char has been processed */ - if (curr < 0) { - break; - } - } - - /* on first round, skip */ - if (curr >= 0) { - /* XXX: could add a fast path to process chunks of input codepoints, - * but relative benefit would be quite small. - */ - - /* Ensure space for maximum multi-character result; estimate is overkill. */ - DUK_BW_ENSURE(thr, bw, 8 * DUK_UNICODE_MAX_XUTF8_LENGTH); - - duk__case_transform_helper(thr, - bw, - (duk_codepoint_t) curr, - prev, - next, - uppercase); - } - } - - DUK_BW_COMPACT(thr, bw); - (void) duk_buffer_to_string(thr, -1); /* Safe, output is encoded. */ - /* invalidates h_buf pointer */ - duk_remove_m2(thr); -} - -#if defined(DUK_USE_REGEXP_SUPPORT) - -/* - * Canonicalize() abstract operation needed for canonicalization of individual - * codepoints during regexp compilation and execution, see E5 Section 15.10.2.8. - * Note that codepoints are canonicalized one character at a time, so no context - * specific rules can apply. Locale specific rules can apply, though. - */ - -DUK_INTERNAL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp) { -#if defined(DUK_USE_REGEXP_CANON_WORKAROUND) - /* Fast canonicalization lookup at the cost of 128kB footprint. */ - DUK_ASSERT(cp >= 0); - DUK_UNREF(thr); - if (DUK_LIKELY(cp < 0x10000L)) { - return (duk_codepoint_t) duk_unicode_re_canon_lookup[cp]; - } - return cp; -#else /* DUK_USE_REGEXP_CANON_WORKAROUND */ - duk_codepoint_t y; - - y = duk__case_transform_helper(thr, - NULL, /* NULL is allowed, no output */ - cp, /* curr char */ - -1, /* prev char */ - -1, /* next char */ - 1); /* uppercase */ - - if ((y < 0) || (cp >= 0x80 && y < 0x80)) { - /* multiple codepoint conversion or non-ASCII mapped to ASCII - * --> leave as is. - */ - return cp; - } - - return y; -#endif /* DUK_USE_REGEXP_CANON_WORKAROUND */ -} - -/* - * E5 Section 15.10.2.6 "IsWordChar" abstract operation. Assume - * x < 0 for characters read outside the string. - */ - -DUK_INTERNAL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t x) { - /* - * Note: the description in E5 Section 15.10.2.6 has a typo, it - * contains 'A' twice and lacks 'a'; the intent is [0-9a-zA-Z_]. - */ - if ((x >= '0' && x <= '9') || - (x >= 'a' && x <= 'z') || - (x >= 'A' && x <= 'Z') || - (x == '_')) { - return 1; - } - return 0; -} - -/* - * Regexp range tables - */ - -/* exposed because lexer needs these too */ -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_digit[2] = { - (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL, -}; -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_white[22] = { - (duk_uint16_t) 0x0009UL, (duk_uint16_t) 0x000DUL, - (duk_uint16_t) 0x0020UL, (duk_uint16_t) 0x0020UL, - (duk_uint16_t) 0x00A0UL, (duk_uint16_t) 0x00A0UL, - (duk_uint16_t) 0x1680UL, (duk_uint16_t) 0x1680UL, - (duk_uint16_t) 0x180EUL, (duk_uint16_t) 0x180EUL, - (duk_uint16_t) 0x2000UL, (duk_uint16_t) 0x200AUL, - (duk_uint16_t) 0x2028UL, (duk_uint16_t) 0x2029UL, - (duk_uint16_t) 0x202FUL, (duk_uint16_t) 0x202FUL, - (duk_uint16_t) 0x205FUL, (duk_uint16_t) 0x205FUL, - (duk_uint16_t) 0x3000UL, (duk_uint16_t) 0x3000UL, - (duk_uint16_t) 0xFEFFUL, (duk_uint16_t) 0xFEFFUL, -}; -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_wordchar[8] = { - (duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL, - (duk_uint16_t) 0x0041UL, (duk_uint16_t) 0x005AUL, - (duk_uint16_t) 0x005FUL, (duk_uint16_t) 0x005FUL, - (duk_uint16_t) 0x0061UL, (duk_uint16_t) 0x007AUL, -}; -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_digit[4] = { - (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL, - (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0xFFFFUL, -}; -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_white[24] = { - (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x0008UL, - (duk_uint16_t) 0x000EUL, (duk_uint16_t) 0x001FUL, - (duk_uint16_t) 0x0021UL, (duk_uint16_t) 0x009FUL, - (duk_uint16_t) 0x00A1UL, (duk_uint16_t) 0x167FUL, - (duk_uint16_t) 0x1681UL, (duk_uint16_t) 0x180DUL, - (duk_uint16_t) 0x180FUL, (duk_uint16_t) 0x1FFFUL, - (duk_uint16_t) 0x200BUL, (duk_uint16_t) 0x2027UL, - (duk_uint16_t) 0x202AUL, (duk_uint16_t) 0x202EUL, - (duk_uint16_t) 0x2030UL, (duk_uint16_t) 0x205EUL, - (duk_uint16_t) 0x2060UL, (duk_uint16_t) 0x2FFFUL, - (duk_uint16_t) 0x3001UL, (duk_uint16_t) 0xFEFEUL, - (duk_uint16_t) 0xFF00UL, (duk_uint16_t) 0xFFFFUL, -}; -DUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10] = { - (duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL, - (duk_uint16_t) 0x003AUL, (duk_uint16_t) 0x0040UL, - (duk_uint16_t) 0x005BUL, (duk_uint16_t) 0x005EUL, - (duk_uint16_t) 0x0060UL, (duk_uint16_t) 0x0060UL, - (duk_uint16_t) 0x007BUL, (duk_uint16_t) 0xFFFFUL, -}; - -#endif /* DUK_USE_REGEXP_SUPPORT */ -#line 1 "duk_util_misc.c" -/* - * Misc util stuff - */ - -/* #include duk_internal.h -> already included */ - -/* - * Lowercase digits for radix values 2 to 36. Also doubles as lowercase - * hex nybble table. - */ - -DUK_INTERNAL const duk_uint8_t duk_lc_digits[36] = { - DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, - DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, - DUK_ASC_8, DUK_ASC_9, DUK_ASC_LC_A, DUK_ASC_LC_B, - DUK_ASC_LC_C, DUK_ASC_LC_D, DUK_ASC_LC_E, DUK_ASC_LC_F, - DUK_ASC_LC_G, DUK_ASC_LC_H, DUK_ASC_LC_I, DUK_ASC_LC_J, - DUK_ASC_LC_K, DUK_ASC_LC_L, DUK_ASC_LC_M, DUK_ASC_LC_N, - DUK_ASC_LC_O, DUK_ASC_LC_P, DUK_ASC_LC_Q, DUK_ASC_LC_R, - DUK_ASC_LC_S, DUK_ASC_LC_T, DUK_ASC_LC_U, DUK_ASC_LC_V, - DUK_ASC_LC_W, DUK_ASC_LC_X, DUK_ASC_LC_Y, DUK_ASC_LC_Z -}; - -DUK_INTERNAL const duk_uint8_t duk_uc_nybbles[16] = { - DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, - DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, - DUK_ASC_8, DUK_ASC_9, DUK_ASC_UC_A, DUK_ASC_UC_B, - DUK_ASC_UC_C, DUK_ASC_UC_D, DUK_ASC_UC_E, DUK_ASC_UC_F -}; - -/* - * Table for hex decoding ASCII hex digits - */ - -DUK_INTERNAL const duk_int8_t duk_hex_dectab[256] = { - /* -1 if invalid */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */ - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */ - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */ -}; - -#if defined(DUK_USE_HEX_FASTPATH) -/* Preshifted << 4. Must use 16-bit entry to allow negative value signaling. */ -DUK_INTERNAL const duk_int16_t duk_hex_dectab_shift4[256] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2f */ - 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, -1, -1, -1, -1, -1, -1, /* 0x30-0x3f */ - -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5f */ - -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x60-0x6f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x70-0x7f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80-0x8f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90-0x9f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0-0xaf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0-0xbf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0-0xcf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0-0xdf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0-0xef */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0-0xff */ -}; -#endif - -/* - * Table for hex encoding bytes - */ - -#if defined(DUK_USE_HEX_FASTPATH) -/* Lookup to encode one byte directly into 2 characters: - * - * def genhextab(bswap): - * for i in xrange(256): - * t = chr(i).encode('hex') - * if bswap: - * t = t[1] + t[0] - * print('0x' + t.encode('hex') + 'U') - * print('big endian'); genhextab(False) - * print('little endian'); genhextab(True) -*/ -DUK_INTERNAL const duk_uint16_t duk_hex_enctab[256] = { -#if defined(DUK_USE_INTEGER_BE) - 0x3030U, 0x3031U, 0x3032U, 0x3033U, 0x3034U, 0x3035U, 0x3036U, 0x3037U, - 0x3038U, 0x3039U, 0x3061U, 0x3062U, 0x3063U, 0x3064U, 0x3065U, 0x3066U, - 0x3130U, 0x3131U, 0x3132U, 0x3133U, 0x3134U, 0x3135U, 0x3136U, 0x3137U, - 0x3138U, 0x3139U, 0x3161U, 0x3162U, 0x3163U, 0x3164U, 0x3165U, 0x3166U, - 0x3230U, 0x3231U, 0x3232U, 0x3233U, 0x3234U, 0x3235U, 0x3236U, 0x3237U, - 0x3238U, 0x3239U, 0x3261U, 0x3262U, 0x3263U, 0x3264U, 0x3265U, 0x3266U, - 0x3330U, 0x3331U, 0x3332U, 0x3333U, 0x3334U, 0x3335U, 0x3336U, 0x3337U, - 0x3338U, 0x3339U, 0x3361U, 0x3362U, 0x3363U, 0x3364U, 0x3365U, 0x3366U, - 0x3430U, 0x3431U, 0x3432U, 0x3433U, 0x3434U, 0x3435U, 0x3436U, 0x3437U, - 0x3438U, 0x3439U, 0x3461U, 0x3462U, 0x3463U, 0x3464U, 0x3465U, 0x3466U, - 0x3530U, 0x3531U, 0x3532U, 0x3533U, 0x3534U, 0x3535U, 0x3536U, 0x3537U, - 0x3538U, 0x3539U, 0x3561U, 0x3562U, 0x3563U, 0x3564U, 0x3565U, 0x3566U, - 0x3630U, 0x3631U, 0x3632U, 0x3633U, 0x3634U, 0x3635U, 0x3636U, 0x3637U, - 0x3638U, 0x3639U, 0x3661U, 0x3662U, 0x3663U, 0x3664U, 0x3665U, 0x3666U, - 0x3730U, 0x3731U, 0x3732U, 0x3733U, 0x3734U, 0x3735U, 0x3736U, 0x3737U, - 0x3738U, 0x3739U, 0x3761U, 0x3762U, 0x3763U, 0x3764U, 0x3765U, 0x3766U, - 0x3830U, 0x3831U, 0x3832U, 0x3833U, 0x3834U, 0x3835U, 0x3836U, 0x3837U, - 0x3838U, 0x3839U, 0x3861U, 0x3862U, 0x3863U, 0x3864U, 0x3865U, 0x3866U, - 0x3930U, 0x3931U, 0x3932U, 0x3933U, 0x3934U, 0x3935U, 0x3936U, 0x3937U, - 0x3938U, 0x3939U, 0x3961U, 0x3962U, 0x3963U, 0x3964U, 0x3965U, 0x3966U, - 0x6130U, 0x6131U, 0x6132U, 0x6133U, 0x6134U, 0x6135U, 0x6136U, 0x6137U, - 0x6138U, 0x6139U, 0x6161U, 0x6162U, 0x6163U, 0x6164U, 0x6165U, 0x6166U, - 0x6230U, 0x6231U, 0x6232U, 0x6233U, 0x6234U, 0x6235U, 0x6236U, 0x6237U, - 0x6238U, 0x6239U, 0x6261U, 0x6262U, 0x6263U, 0x6264U, 0x6265U, 0x6266U, - 0x6330U, 0x6331U, 0x6332U, 0x6333U, 0x6334U, 0x6335U, 0x6336U, 0x6337U, - 0x6338U, 0x6339U, 0x6361U, 0x6362U, 0x6363U, 0x6364U, 0x6365U, 0x6366U, - 0x6430U, 0x6431U, 0x6432U, 0x6433U, 0x6434U, 0x6435U, 0x6436U, 0x6437U, - 0x6438U, 0x6439U, 0x6461U, 0x6462U, 0x6463U, 0x6464U, 0x6465U, 0x6466U, - 0x6530U, 0x6531U, 0x6532U, 0x6533U, 0x6534U, 0x6535U, 0x6536U, 0x6537U, - 0x6538U, 0x6539U, 0x6561U, 0x6562U, 0x6563U, 0x6564U, 0x6565U, 0x6566U, - 0x6630U, 0x6631U, 0x6632U, 0x6633U, 0x6634U, 0x6635U, 0x6636U, 0x6637U, - 0x6638U, 0x6639U, 0x6661U, 0x6662U, 0x6663U, 0x6664U, 0x6665U, 0x6666U -#else /* DUK_USE_INTEGER_BE */ - 0x3030U, 0x3130U, 0x3230U, 0x3330U, 0x3430U, 0x3530U, 0x3630U, 0x3730U, - 0x3830U, 0x3930U, 0x6130U, 0x6230U, 0x6330U, 0x6430U, 0x6530U, 0x6630U, - 0x3031U, 0x3131U, 0x3231U, 0x3331U, 0x3431U, 0x3531U, 0x3631U, 0x3731U, - 0x3831U, 0x3931U, 0x6131U, 0x6231U, 0x6331U, 0x6431U, 0x6531U, 0x6631U, - 0x3032U, 0x3132U, 0x3232U, 0x3332U, 0x3432U, 0x3532U, 0x3632U, 0x3732U, - 0x3832U, 0x3932U, 0x6132U, 0x6232U, 0x6332U, 0x6432U, 0x6532U, 0x6632U, - 0x3033U, 0x3133U, 0x3233U, 0x3333U, 0x3433U, 0x3533U, 0x3633U, 0x3733U, - 0x3833U, 0x3933U, 0x6133U, 0x6233U, 0x6333U, 0x6433U, 0x6533U, 0x6633U, - 0x3034U, 0x3134U, 0x3234U, 0x3334U, 0x3434U, 0x3534U, 0x3634U, 0x3734U, - 0x3834U, 0x3934U, 0x6134U, 0x6234U, 0x6334U, 0x6434U, 0x6534U, 0x6634U, - 0x3035U, 0x3135U, 0x3235U, 0x3335U, 0x3435U, 0x3535U, 0x3635U, 0x3735U, - 0x3835U, 0x3935U, 0x6135U, 0x6235U, 0x6335U, 0x6435U, 0x6535U, 0x6635U, - 0x3036U, 0x3136U, 0x3236U, 0x3336U, 0x3436U, 0x3536U, 0x3636U, 0x3736U, - 0x3836U, 0x3936U, 0x6136U, 0x6236U, 0x6336U, 0x6436U, 0x6536U, 0x6636U, - 0x3037U, 0x3137U, 0x3237U, 0x3337U, 0x3437U, 0x3537U, 0x3637U, 0x3737U, - 0x3837U, 0x3937U, 0x6137U, 0x6237U, 0x6337U, 0x6437U, 0x6537U, 0x6637U, - 0x3038U, 0x3138U, 0x3238U, 0x3338U, 0x3438U, 0x3538U, 0x3638U, 0x3738U, - 0x3838U, 0x3938U, 0x6138U, 0x6238U, 0x6338U, 0x6438U, 0x6538U, 0x6638U, - 0x3039U, 0x3139U, 0x3239U, 0x3339U, 0x3439U, 0x3539U, 0x3639U, 0x3739U, - 0x3839U, 0x3939U, 0x6139U, 0x6239U, 0x6339U, 0x6439U, 0x6539U, 0x6639U, - 0x3061U, 0x3161U, 0x3261U, 0x3361U, 0x3461U, 0x3561U, 0x3661U, 0x3761U, - 0x3861U, 0x3961U, 0x6161U, 0x6261U, 0x6361U, 0x6461U, 0x6561U, 0x6661U, - 0x3062U, 0x3162U, 0x3262U, 0x3362U, 0x3462U, 0x3562U, 0x3662U, 0x3762U, - 0x3862U, 0x3962U, 0x6162U, 0x6262U, 0x6362U, 0x6462U, 0x6562U, 0x6662U, - 0x3063U, 0x3163U, 0x3263U, 0x3363U, 0x3463U, 0x3563U, 0x3663U, 0x3763U, - 0x3863U, 0x3963U, 0x6163U, 0x6263U, 0x6363U, 0x6463U, 0x6563U, 0x6663U, - 0x3064U, 0x3164U, 0x3264U, 0x3364U, 0x3464U, 0x3564U, 0x3664U, 0x3764U, - 0x3864U, 0x3964U, 0x6164U, 0x6264U, 0x6364U, 0x6464U, 0x6564U, 0x6664U, - 0x3065U, 0x3165U, 0x3265U, 0x3365U, 0x3465U, 0x3565U, 0x3665U, 0x3765U, - 0x3865U, 0x3965U, 0x6165U, 0x6265U, 0x6365U, 0x6465U, 0x6565U, 0x6665U, - 0x3066U, 0x3166U, 0x3266U, 0x3366U, 0x3466U, 0x3566U, 0x3666U, 0x3766U, - 0x3866U, 0x3966U, 0x6166U, 0x6266U, 0x6366U, 0x6466U, 0x6566U, 0x6666U -#endif /* DUK_USE_INTEGER_BE */ -}; -#endif /* DUK_USE_HEX_FASTPATH */ - -/* - * Table for base-64 encoding - */ - -#if defined(DUK_USE_BASE64_FASTPATH) -DUK_INTERNAL const duk_uint8_t duk_base64_enctab[64] = { - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* A...P */ - 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, /* Q...f */ - 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, /* g...v */ - 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f /* w.../ */ -}; -#endif /* DUK_USE_BASE64_FASTPATH */ - -/* - * Table for base-64 decoding - */ - -#if defined(DUK_USE_BASE64_FASTPATH) -DUK_INTERNAL const duk_int8_t duk_base64_dectab[256] = { - /* -1 = error, -2 = allowed whitespace, -3 = padding ('='), 0...63 decoded bytes */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -2, -1, -1, /* 0x00...0x0f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10...0x1f */ - -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, /* 0x20...0x2f */ - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -3, -1, -1, /* 0x30...0x3f */ - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 0x40...0x4f */ - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, /* 0x50...0x5f */ - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* 0x60...0x6f */ - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, /* 0x70...0x7f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x80...0x8f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x90...0x9f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xa0...0xaf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb0...0xbf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc0...0xcf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd0...0xdf */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe0...0xef */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xf0...0xff */ -}; -#endif /* DUK_USE_BASE64_FASTPATH */ - -/* - * Arbitrary byteswap for potentially unaligned values - * - * Used to byteswap pointers e.g. in debugger code. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) /* For now only needed by the debugger. */ -DUK_INTERNAL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len) { - duk_uint8_t tmp; - duk_uint8_t *q = p + len - 1; - - while (p - q < 0) { - tmp = *p; - *p = *q; - *q = tmp; - p++; - q--; - } -} -#endif - -/* - * Miscellaneous coercion / clamping helpers. - */ - -/* Check whether a duk_double_t is a whole number in the 32-bit range (reject - * negative zero), and if so, return a duk_int32_t. - * For compiler use: don't allow negative zero as it will cause trouble with - * LDINT+LDINTX, positive zero is OK. - */ -DUK_INTERNAL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival) { - duk_int32_t t; - - t = (duk_int32_t) x; - if (!((duk_double_t) t == x)) { - return 0; - } - if (t == 0) { - duk_double_union du; - du.d = x; - if (DUK_DBLUNION_HAS_SIGNBIT(&du)) { - return 0; - } - } - *ival = t; - return 1; -} - -/* Check whether a duk_double_t is a whole number in the 32-bit range, and if - * so, return a duk_int32_t. - */ -DUK_INTERNAL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival) { - duk_int32_t t; - - t = (duk_int32_t) x; - if (!((duk_double_t) t == x)) { - return 0; - } - *ival = t; - return 1; -} - -/* - * IEEE double checks - */ - -DUK_INTERNAL duk_bool_t duk_double_is_anyinf(duk_double_t x) { - duk_double_union du; - du.d = x; - return DUK_DBLUNION_IS_ANYINF(&du); -} - -DUK_INTERNAL duk_bool_t duk_double_is_posinf(duk_double_t x) { - duk_double_union du; - du.d = x; - return DUK_DBLUNION_IS_POSINF(&du); -} - -DUK_INTERNAL duk_bool_t duk_double_is_neginf(duk_double_t x) { - duk_double_union du; - du.d = x; - return DUK_DBLUNION_IS_NEGINF(&du); -} - -DUK_INTERNAL duk_bool_t duk_double_is_nan(duk_double_t x) { - duk_double_union du; - du.d = x; - /* Assumes we're dealing with a Duktape internal NaN which is - * NaN normalized if duk_tval requires it. - */ - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - return DUK_DBLUNION_IS_NAN(&du); -} - -DUK_INTERNAL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x) { - duk_double_union du; - du.d = x; - /* Assumes we're dealing with a Duktape internal NaN which is - * NaN normalized if duk_tval requires it. - */ - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - return DUK_DBLUNION_IS_NAN(&du) || DUK_DBLUNION_IS_ANYZERO(&du); -} - -DUK_INTERNAL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x) { - duk_double_union du; - du.d = x; - /* If exponent is 0x7FF the argument is either a NaN or an - * infinity. We don't need to check any other fields. - */ -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) - return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000); -#else - return (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000); -#endif -#else - return (du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL; -#endif -} - -DUK_INTERNAL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x) { - duk_double_union du; -#if defined(DUK_USE_64BIT_OPS) - duk_uint64_t t; -#else - duk_uint32_t t; -#endif - du.d = x; -#if defined(DUK_USE_64BIT_OPS) -#if defined(DUK_USE_DOUBLE_ME) - t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000); - if (t == DUK_U64_CONSTANT(0x0000000000000000)) { - t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x0000000080000000); - return t == 0; - } - if (t == DUK_U64_CONSTANT(0x000000007ff00000)) { - return 1; - } -#else - t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000); - if (t == DUK_U64_CONSTANT(0x0000000000000000)) { - t = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000); - return t == 0; - } - if (t == DUK_U64_CONSTANT(0x7ff0000000000000)) { - return 1; - } -#endif -#else - t = du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL; - if (t == 0x00000000UL) { - return DUK_DBLUNION_IS_ANYZERO(&du); - } - if (t == 0x7ff00000UL) { - return 1; - } -#endif - return 0; -} - -DUK_INTERNAL duk_small_uint_t duk_double_signbit(duk_double_t x) { - duk_double_union du; - du.d = x; - return (duk_small_uint_t) DUK_DBLUNION_GET_SIGNBIT(&du); -} - -DUK_INTERNAL duk_double_t duk_double_trunc_towards_zero(duk_double_t x) { - /* XXX: optimize */ - duk_small_uint_t s = duk_double_signbit(x); - x = DUK_FLOOR(DUK_FABS(x)); /* truncate towards zero */ - if (s) { - x = -x; - } - return x; -} - -DUK_INTERNAL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y) { - duk_double_union du1; - duk_double_union du2; - du1.d = x; - du2.d = y; - - return (((du1.ui[DUK_DBL_IDX_UI0] ^ du2.ui[DUK_DBL_IDX_UI0]) & 0x80000000UL) == 0); -} - -DUK_INTERNAL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y) { - /* Doesn't replicate fmin() behavior exactly: for fmin() if one - * argument is a NaN, the other argument should be returned. - * Duktape doesn't rely on this behavior so the replacement can - * be simplified. - */ - return (x < y ? x : y); -} - -DUK_INTERNAL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y) { - /* Doesn't replicate fmax() behavior exactly: for fmax() if one - * argument is a NaN, the other argument should be returned. - * Duktape doesn't rely on this behavior so the replacement can - * be simplified. - */ - return (x > y ? x : y); -} -#line 1 "duk_hobject_class.c" -/* - * Hobject Ecmascript [[Class]]. - */ - -/* #include duk_internal.h -> already included */ - -#if (DUK_STRIDX_UC_ARGUMENTS > 255) -#error constant too large -#endif -#if (DUK_STRIDX_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_BOOLEAN > 255) -#error constant too large -#endif -#if (DUK_STRIDX_DATE > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_ERROR > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_FUNCTION > 255) -#error constant too large -#endif -#if (DUK_STRIDX_JSON > 255) -#error constant too large -#endif -#if (DUK_STRIDX_MATH > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_NUMBER > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_OBJECT > 255) -#error constant too large -#endif -#if (DUK_STRIDX_REG_EXP > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_STRING > 255) -#error constant too large -#endif -#if (DUK_STRIDX_GLOBAL > 255) -#error constant too large -#endif -#if (DUK_STRIDX_OBJ_ENV > 255) -#error constant too large -#endif -#if (DUK_STRIDX_DEC_ENV > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_POINTER > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UC_THREAD > 255) -#error constant too large -#endif -#if (DUK_STRIDX_ARRAY_BUFFER > 255) -#error constant too large -#endif -#if (DUK_STRIDX_DATA_VIEW > 255) -#error constant too large -#endif -#if (DUK_STRIDX_INT8_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UINT8_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UINT8_CLAMPED_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_INT16_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UINT16_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_INT32_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_UINT32_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_FLOAT32_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_FLOAT64_ARRAY > 255) -#error constant too large -#endif -#if (DUK_STRIDX_EMPTY_STRING > 255) -#error constant too large -#endif - -/* Note: assumes that these string indexes are 8-bit, genstrings.py must ensure that */ -DUK_INTERNAL duk_uint8_t duk_class_number_to_stridx[32] = { - DUK_STRIDX_EMPTY_STRING, /* NONE, intentionally empty */ - DUK_STRIDX_UC_OBJECT, - DUK_STRIDX_ARRAY, - DUK_STRIDX_UC_FUNCTION, - DUK_STRIDX_UC_ARGUMENTS, - DUK_STRIDX_UC_BOOLEAN, - DUK_STRIDX_DATE, - DUK_STRIDX_UC_ERROR, - DUK_STRIDX_JSON, - DUK_STRIDX_MATH, - DUK_STRIDX_UC_NUMBER, - DUK_STRIDX_REG_EXP, - DUK_STRIDX_UC_STRING, - DUK_STRIDX_GLOBAL, - DUK_STRIDX_UC_SYMBOL, - DUK_STRIDX_OBJ_ENV, - DUK_STRIDX_DEC_ENV, - DUK_STRIDX_UC_POINTER, - DUK_STRIDX_UC_THREAD, - DUK_STRIDX_ARRAY_BUFFER, - DUK_STRIDX_DATA_VIEW, - DUK_STRIDX_INT8_ARRAY, - DUK_STRIDX_UINT8_ARRAY, - DUK_STRIDX_UINT8_CLAMPED_ARRAY, - DUK_STRIDX_INT16_ARRAY, - DUK_STRIDX_UINT16_ARRAY, - DUK_STRIDX_INT32_ARRAY, - DUK_STRIDX_UINT32_ARRAY, - DUK_STRIDX_FLOAT32_ARRAY, - DUK_STRIDX_FLOAT64_ARRAY, - DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */ - DUK_STRIDX_EMPTY_STRING, /* UNUSED, intentionally empty */ -}; -#line 1 "duk_alloc_default.c" -/* - * Default allocation functions. - * - * Assumes behavior such as malloc allowing zero size, yielding - * a NULL or a unique pointer which is a no-op for free. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) -DUK_INTERNAL void *duk_default_alloc_function(void *udata, duk_size_t size) { - void *res; - DUK_UNREF(udata); - res = DUK_ANSI_MALLOC(size); - DUK_DDD(DUK_DDDPRINT("default alloc function: %lu -> %p", - (unsigned long) size, (void *) res)); - return res; -} - -DUK_INTERNAL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize) { - void *res; - DUK_UNREF(udata); - res = DUK_ANSI_REALLOC(ptr, newsize); - DUK_DDD(DUK_DDDPRINT("default realloc function: %p %lu -> %p", - (void *) ptr, (unsigned long) newsize, (void *) res)); - return res; -} - -DUK_INTERNAL void duk_default_free_function(void *udata, void *ptr) { - DUK_DDD(DUK_DDDPRINT("default free function: %p", (void *) ptr)); - DUK_UNREF(udata); - DUK_ANSI_FREE(ptr); -} -#endif /* DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS */ -#line 1 "duk_api_buffer.c" -/* - * Buffer - */ - -/* #include duk_internal.h -> already included */ - -DUK_EXTERNAL void *duk_resize_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t new_size) { - duk_hbuffer_dynamic *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx); - DUK_ASSERT(h != NULL); - - if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { - DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); - } - - /* maximum size check is handled by callee */ - duk_hbuffer_resize(thr, h, new_size); - - return DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); -} - -DUK_EXTERNAL void *duk_steal_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { - duk_hbuffer_dynamic *h; - void *ptr; - duk_size_t sz; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx); - DUK_ASSERT(h != NULL); - - if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { - DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); - } - - /* Forget the previous allocation, setting size to 0 and alloc to - * NULL. Caller is responsible for freeing the previous allocation. - * Getting the allocation and clearing it is done in the same API - * call to avoid any chance of a realloc. - */ - ptr = DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); - sz = DUK_HBUFFER_DYNAMIC_GET_SIZE(h); - if (out_size) { - *out_size = sz; - } - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(thr->heap, h); - DUK_HBUFFER_DYNAMIC_SET_SIZE(h, 0); - - return ptr; -} - -DUK_EXTERNAL void duk_config_buffer(duk_hthread *thr, duk_idx_t idx, void *ptr, duk_size_t len) { - duk_hbuffer_external *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hbuffer_external *) duk_require_hbuffer(thr, idx); - DUK_ASSERT(h != NULL); - - if (!DUK_HBUFFER_HAS_EXTERNAL(h)) { - DUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE); - } - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h)); - - DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(thr->heap, h, ptr); - DUK_HBUFFER_EXTERNAL_SET_SIZE(h, len); -} -#line 1 "duk_api_bytecode.c" -/* - * Bytecode dump/load - * - * The bytecode load primitive is more important performance-wise than the - * dump primitive. - * - * Unlike most Duktape API calls, bytecode dump/load is not guaranteed to be - * memory safe for invalid arguments - caller beware! There's little point - * in trying to achieve memory safety unless bytecode instructions are also - * validated which is not easy to do with indirect register references etc. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_BYTECODE_DUMP_SUPPORT) - -#define DUK__SER_MARKER 0xbf -#define DUK__SER_STRING 0x00 -#define DUK__SER_NUMBER 0x01 -#define DUK__BYTECODE_INITIAL_ALLOC 256 -#define DUK__NO_FORMALS 0xffffffffUL - -/* - * Dump/load helpers, xxx_raw() helpers do no buffer checks - */ - -DUK_LOCAL duk_uint8_t *duk__load_string_raw(duk_hthread *thr, duk_uint8_t *p) { - duk_uint32_t len; - - len = DUK_RAW_READ_U32_BE(p); - duk_push_lstring(thr, (const char *) p, len); - p += len; - return p; -} - -DUK_LOCAL duk_uint8_t *duk__load_buffer_raw(duk_hthread *thr, duk_uint8_t *p) { - duk_uint32_t len; - duk_uint8_t *buf; - - len = DUK_RAW_READ_U32_BE(p); - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len); - DUK_ASSERT(buf != NULL); - DUK_MEMCPY((void *) buf, (const void *) p, (size_t) len); - p += len; - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_hstring_raw(duk_uint8_t *p, duk_hstring *h) { - duk_size_t len; - duk_uint32_t tmp32; - - DUK_ASSERT(h != NULL); - - len = DUK_HSTRING_GET_BYTELEN(h); - DUK_ASSERT(len <= 0xffffffffUL); /* string limits */ - tmp32 = (duk_uint32_t) len; - DUK_RAW_WRITE_U32_BE(p, tmp32); - DUK_MEMCPY((void *) p, - (const void *) DUK_HSTRING_GET_DATA(h), - len); - p += len; - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_hbuffer_raw(duk_hthread *thr, duk_uint8_t *p, duk_hbuffer *h) { - duk_size_t len; - duk_uint32_t tmp32; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - DUK_UNREF(thr); - - len = DUK_HBUFFER_GET_SIZE(h); - DUK_ASSERT(len <= 0xffffffffUL); /* buffer limits */ - tmp32 = (duk_uint32_t) len; - DUK_RAW_WRITE_U32_BE(p, tmp32); - DUK_MEMCPY((void *) p, - (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h), - len); - p += len; - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_string_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { - duk_hstring *h_str; - duk_tval *tv; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); - if (tv != NULL && DUK_TVAL_IS_STRING(tv)) { - h_str = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h_str != NULL); - } else { - h_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr); - DUK_ASSERT(h_str != NULL); - } - DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(h_str), p); - p = duk__dump_hstring_raw(p, h_str); - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_buffer_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { - duk_tval *tv; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); - if (tv != NULL && DUK_TVAL_IS_BUFFER(tv)) { - duk_hbuffer *h_buf; - h_buf = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h_buf != NULL); - DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HBUFFER_GET_SIZE(h_buf), p); - p = duk__dump_hbuffer_raw(thr, p, h_buf); - } else { - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); - DUK_RAW_WRITE_U32_BE(p, 0); - } - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_uint32_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx, duk_uint32_t def_value) { - duk_tval *tv; - duk_uint32_t val; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); - if (tv != NULL && DUK_TVAL_IS_NUMBER(tv)) { - val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv); - } else { - val = def_value; - } - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); - DUK_RAW_WRITE_U32_BE(p, val); - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_varmap(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { - duk_tval *tv; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); - if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - duk_uint_fast32_t i; - - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - /* We know _Varmap only has own properties so walk property - * table directly. We also know _Varmap is dense and all - * values are numbers; assert for these. GC and finalizers - * shouldn't affect _Varmap so side effects should be fine. - */ - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { - duk_hstring *key; - duk_tval *tv_val; - duk_uint32_t val; - - key = DUK_HOBJECT_E_GET_KEY(thr->heap, h, i); - DUK_ASSERT(key != NULL); /* _Varmap is dense */ - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h, i)); - tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h, i); - DUK_ASSERT(tv_val != NULL); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_val)); /* known to be number; in fact an integer */ -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_val)); - DUK_ASSERT(DUK_TVAL_GET_FASTINT(tv_val) == (duk_int64_t) DUK_TVAL_GET_FASTINT_U32(tv_val)); /* known to be 32-bit */ - val = DUK_TVAL_GET_FASTINT_U32(tv_val); -#else - val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv_val); -#endif - - DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(key) + 4U, p); - p = duk__dump_hstring_raw(p, key); - DUK_RAW_WRITE_U32_BE(p, val); - } - } - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); - DUK_RAW_WRITE_U32_BE(p, 0); /* end of _Varmap */ - return p; -} - -DUK_LOCAL duk_uint8_t *duk__dump_formals(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { - duk_tval *tv; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_FORMALS(thr)); - if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { - duk_harray *h; - duk_uint32_t i; - - /* Here we rely on _Formals being a dense array containing - * strings. This should be the case unless _Formals has been - * tweaked by the application (which we don't support right - * now). - */ - h = (duk_harray *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) h)); - DUK_ASSERT(h->length <= DUK_HOBJECT_GET_ASIZE((duk_hobject *) h)); - - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); - DUK_ASSERT(h->length != DUK__NO_FORMALS); /* limits */ - DUK_RAW_WRITE_U32_BE(p, h->length); - - for (i = 0; i < h->length; i++) { - duk_tval *tv_val; - duk_hstring *varname; - - tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, (duk_hobject *) h, i); - DUK_ASSERT(tv_val != NULL); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv_val)); - - varname = DUK_TVAL_GET_STRING(tv_val); - DUK_ASSERT(varname != NULL); - DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(varname) >= 1); - - DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(varname), p); - p = duk__dump_hstring_raw(p, varname); - } - } else { - DUK_DD(DUK_DDPRINT("dumping function without _Formals, emit marker to indicate missing _Formals")); - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p); - DUK_RAW_WRITE_U32_BE(p, DUK__NO_FORMALS); /* marker: no formals */ - } - return p; -} - -static duk_uint8_t *duk__dump_func(duk_hthread *thr, duk_hcompfunc *func, duk_bufwriter_ctx *bw_ctx, duk_uint8_t *p) { - duk_tval *tv, *tv_end; - duk_instr_t *ins, *ins_end; - duk_hobject **fn, **fn_end; - duk_hstring *h_str; - duk_uint32_t count_instr; - duk_uint32_t tmp32; - duk_uint16_t tmp16; - duk_double_t d; - - DUK_DD(DUK_DDPRINT("dumping function %p to %p: " - "consts=[%p,%p[ (%ld bytes, %ld items), " - "funcs=[%p,%p[ (%ld bytes, %ld items), " - "code=[%p,%p[ (%ld bytes, %ld items)", - (void *) func, - (void *) p, - (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func), - (void *) DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_CONSTS_SIZE(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func), - (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func), - (void *) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_FUNCS_SIZE(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func), - (void *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func), - (void *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_CODE_SIZE(thr->heap, func), - (long) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func))); - - DUK_ASSERT(DUK_USE_ESBC_MAX_BYTES <= 0x7fffffffUL); /* ensures no overflow */ - count_instr = (duk_uint32_t) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func); - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 3U * 4U + 2U * 2U + 3U * 4U + count_instr * 4U, p); - - /* Fixed header info. */ - tmp32 = count_instr; - DUK_RAW_WRITE_U32_BE(p, tmp32); - tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func); - DUK_RAW_WRITE_U32_BE(p, tmp32); - tmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func); - DUK_RAW_WRITE_U32_BE(p, tmp32); - tmp16 = func->nregs; - DUK_RAW_WRITE_U16_BE(p, tmp16); - tmp16 = func->nargs; - DUK_RAW_WRITE_U16_BE(p, tmp16); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - tmp32 = func->start_line; - DUK_RAW_WRITE_U32_BE(p, tmp32); - tmp32 = func->end_line; - DUK_RAW_WRITE_U32_BE(p, tmp32); -#else - DUK_RAW_WRITE_U32_BE(p, 0); - DUK_RAW_WRITE_U32_BE(p, 0); -#endif - tmp32 = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) func); /* masks flags, only duk_hobject flags */ - tmp32 &= ~(DUK_HOBJECT_FLAG_HAVE_FINALIZER); /* finalizer flag is lost */ - DUK_RAW_WRITE_U32_BE(p, tmp32); - - /* Bytecode instructions: endian conversion needed unless - * platform is big endian. - */ - ins = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func); - ins_end = DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func); - DUK_ASSERT((duk_size_t) (ins_end - ins) == (duk_size_t) count_instr); -#if defined(DUK_USE_INTEGER_BE) - DUK_MEMCPY((void *) p, (const void *) ins, (size_t) (ins_end - ins)); - p += (size_t) (ins_end - ins); -#else - while (ins != ins_end) { - tmp32 = (duk_uint32_t) (*ins); - DUK_RAW_WRITE_U32_BE(p, tmp32); - ins++; - } -#endif - - /* Constants: variable size encoding. */ - tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func); - tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func); - while (tv != tv_end) { - /* constants are strings or numbers now */ - DUK_ASSERT(DUK_TVAL_IS_STRING(tv) || - DUK_TVAL_IS_NUMBER(tv)); - - if (DUK_TVAL_IS_STRING(tv)) { - h_str = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h_str != NULL); - DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 4U + DUK_HSTRING_GET_BYTELEN(h_str), p), - *p++ = DUK__SER_STRING; - p = duk__dump_hstring_raw(p, h_str); - } else { - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 8U, p); - *p++ = DUK__SER_NUMBER; - d = DUK_TVAL_GET_NUMBER(tv); - DUK_RAW_WRITE_DOUBLE_BE(p, d); - } - tv++; - } - - /* Inner functions recursively. */ - fn = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func); - fn_end = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func); - while (fn != fn_end) { - /* XXX: This causes recursion up to inner function depth - * which is normally not an issue, e.g. mark-and-sweep uses - * a recursion limiter to avoid C stack issues. Avoiding - * this would mean some sort of a work list or just refusing - * to serialize deep functions. - */ - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(*fn)); - p = duk__dump_func(thr, (duk_hcompfunc *) *fn, bw_ctx, p); - fn++; - } - - /* Lexenv and varenv are not dumped. */ - - /* Object extra properties. - * - * There are some difference between function templates and functions. - * For example, function templates don't have .length and nargs is - * normally used to instantiate the functions. - */ - - p = duk__dump_uint32_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_LENGTH, (duk_uint32_t) func->nargs); -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_NAME); -#endif -#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) - p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_FILE_NAME); -#endif -#if defined(DUK_USE_PC2LINE) - p = duk__dump_buffer_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_INT_PC2LINE); -#endif - p = duk__dump_varmap(thr, p, bw_ctx, (duk_hobject *) func); - p = duk__dump_formals(thr, p, bw_ctx, (duk_hobject *) func); - - DUK_DD(DUK_DDPRINT("serialized function %p -> final pointer %p", (void *) func, (void *) p)); - - return p; -} - -/* Load a function from bytecode. The function object returned here must - * match what is created by duk_js_push_closure() with respect to its flags, - * properties, etc. - * - * NOTE: there are intentionally no input buffer length / bound checks. - * Adding them would be easy but wouldn't ensure memory safety as untrusted - * or broken bytecode is unsafe during execution unless the opcodes themselves - * are validated (which is quite complex, especially for indirect opcodes). - */ - -#define DUK__ASSERT_LEFT(n) do { \ - DUK_ASSERT((duk_size_t) (p_end - p) >= (duk_size_t) (n)); \ - } while (0) - -static duk_uint8_t *duk__load_func(duk_hthread *thr, duk_uint8_t *p, duk_uint8_t *p_end) { - duk_hcompfunc *h_fun; - duk_hbuffer *h_data; - duk_size_t data_size; - duk_uint32_t count_instr, count_const, count_funcs; - duk_uint32_t n; - duk_uint32_t tmp32; - duk_small_uint_t const_type; - duk_uint8_t *fun_data; - duk_uint8_t *q; - duk_idx_t idx_base; - duk_tval *tv1; - duk_uarridx_t arr_idx; - duk_uarridx_t arr_limit; - duk_hobject *func_env; - duk_bool_t need_pop; - - /* XXX: There's some overlap with duk_js_closure() here, but - * seems difficult to share code. Ensure that the final function - * looks the same as created by duk_js_closure(). - */ - - DUK_ASSERT(thr != NULL); - - DUK_DD(DUK_DDPRINT("loading function, p=%p, p_end=%p", (void *) p, (void *) p_end)); - - DUK__ASSERT_LEFT(3 * 4); - count_instr = DUK_RAW_READ_U32_BE(p); - count_const = DUK_RAW_READ_U32_BE(p); - count_funcs = DUK_RAW_READ_U32_BE(p); - - data_size = sizeof(duk_tval) * count_const + - sizeof(duk_hobject *) * count_funcs + - sizeof(duk_instr_t) * count_instr; - - DUK_DD(DUK_DDPRINT("instr=%ld, const=%ld, funcs=%ld, data_size=%ld", - (long) count_instr, (long) count_const, - (long) count_const, (long) data_size)); - - /* Value stack is used to ensure reachability of constants and - * inner functions being loaded. Require enough space to handle - * large functions correctly. - */ - duk_require_stack(thr, (duk_idx_t) (2 + count_const + count_funcs)); - idx_base = duk_get_top(thr); - - /* Push function object, init flags etc. This must match - * duk_js_push_closure() quite carefully. - */ - h_fun = duk_push_hcompfunc(thr); - DUK_ASSERT(h_fun != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) h_fun)); - DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun) == NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, h_fun) == NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, h_fun) == NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - - h_fun->nregs = DUK_RAW_READ_U16_BE(p); - h_fun->nargs = DUK_RAW_READ_U16_BE(p); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - h_fun->start_line = DUK_RAW_READ_U32_BE(p); - h_fun->end_line = DUK_RAW_READ_U32_BE(p); -#else - p += 8; /* skip line info */ -#endif - - /* duk_hcompfunc flags; quite version specific */ - tmp32 = DUK_RAW_READ_U32_BE(p); - DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) h_fun, tmp32); /* masks flags to only change duk_hobject flags */ - - /* standard prototype (no need to set here, already set) */ - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); -#if 0 - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &h_fun->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); -#endif - - /* assert just a few critical flags */ - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h_fun) == DUK_HTYPE_OBJECT); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&h_fun->obj)); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&h_fun->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&h_fun->obj)); - DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&h_fun->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&h_fun->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&h_fun->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&h_fun->obj)); - - /* Create function 'data' buffer but don't attach it yet. */ - fun_data = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, data_size); - DUK_ASSERT(fun_data != NULL); - - /* Load bytecode instructions. */ - DUK_ASSERT(sizeof(duk_instr_t) == 4); - DUK__ASSERT_LEFT(count_instr * sizeof(duk_instr_t)); -#if defined(DUK_USE_INTEGER_BE) - q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; - DUK_MEMCPY((void *) q, - (const void *) p, - sizeof(duk_instr_t) * count_instr); - p += sizeof(duk_instr_t) * count_instr; -#else - q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; - for (n = count_instr; n > 0; n--) { - *((duk_instr_t *) (void *) q) = DUK_RAW_READ_U32_BE(p); - q += sizeof(duk_instr_t); - } -#endif - - /* Load constants onto value stack but don't yet copy to buffer. */ - for (n = count_const; n > 0; n--) { - DUK__ASSERT_LEFT(1); - const_type = DUK_RAW_READ_U8(p); - switch (const_type) { - case DUK__SER_STRING: { - p = duk__load_string_raw(thr, p); - break; - } - case DUK__SER_NUMBER: { - /* Important to do a fastint check so that constants are - * properly read back as fastints. - */ - duk_tval tv_tmp; - duk_double_t val; - DUK__ASSERT_LEFT(8); - val = DUK_RAW_READ_DOUBLE_BE(p); - DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(&tv_tmp, val); - duk_push_tval(thr, &tv_tmp); - break; - } - default: { - goto format_error; - } - } - } - - /* Load inner functions to value stack, but don't yet copy to buffer. */ - for (n = count_funcs; n > 0; n--) { - p = duk__load_func(thr, p, p_end); - if (p == NULL) { - goto format_error; - } - } - - /* With constants and inner functions on value stack, we can now - * atomically finish the function 'data' buffer, bump refcounts, - * etc. - * - * Here we take advantage of the value stack being just a duk_tval - * array: we can just memcpy() the constants as long as we incref - * them afterwards. - */ - - h_data = (duk_hbuffer *) duk_known_hbuffer(thr, idx_base + 1); - DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(h_data)); - DUK_HCOMPFUNC_SET_DATA(thr->heap, h_fun, h_data); - DUK_HBUFFER_INCREF(thr, h_data); - - tv1 = duk_get_tval(thr, idx_base + 2); /* may be NULL if no constants or inner funcs */ - DUK_ASSERT((count_const == 0 && count_funcs == 0) || tv1 != NULL); - - q = fun_data; - if (count_const > 0) { - /* Explicit zero size check to avoid NULL 'tv1'. */ - DUK_MEMCPY((void *) q, (const void *) tv1, sizeof(duk_tval) * count_const); - for (n = count_const; n > 0; n--) { - DUK_TVAL_INCREF_FAST(thr, (duk_tval *) (void *) q); /* no side effects */ - q += sizeof(duk_tval); - } - tv1 += count_const; - } - - DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_fun, (duk_hobject **) (void *) q); - for (n = count_funcs; n > 0; n--) { - duk_hobject *h_obj; - - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); - h_obj = DUK_TVAL_GET_OBJECT(tv1); - DUK_ASSERT(h_obj != NULL); - tv1++; - DUK_HOBJECT_INCREF(thr, h_obj); - - *((duk_hobject **) (void *) q) = h_obj; - q += sizeof(duk_hobject *); - } - - DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_fun, (duk_instr_t *) (void *) q); - - /* The function object is now reachable and refcounts are fine, - * so we can pop off all the temporaries. - */ - DUK_DDD(DUK_DDDPRINT("function is reachable, reset top; func: %!iT", duk_get_tval(thr, idx_base))); - duk_set_top(thr, idx_base + 1); - - /* Setup function properties. */ - tmp32 = DUK_RAW_READ_U32_BE(p); - duk_push_u32(thr, tmp32); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); - -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - p = duk__load_string_raw(thr, p); /* -> [ func funcname ] */ - func_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - DUK_ASSERT(func_env != NULL); - need_pop = 0; - if (DUK_HOBJECT_HAS_NAMEBINDING((duk_hobject *) h_fun)) { - /* Original function instance/template had NAMEBINDING. - * Must create a lexical environment on loading to allow - * recursive functions like 'function foo() { foo(); }'. - */ - duk_hdecenv *new_env; - - new_env = duk_hdecenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); - DUK_ASSERT(new_env != NULL); - DUK_ASSERT(new_env->thread == NULL); /* Closed. */ - DUK_ASSERT(new_env->varmap == NULL); - DUK_ASSERT(new_env->regbase_byteoff == 0); - DUK_ASSERT_HDECENV_VALID(new_env); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, func_env); - DUK_HOBJECT_INCREF(thr, func_env); - - func_env = (duk_hobject *) new_env; - - duk_push_hobject(thr, (duk_hobject *) new_env); - - duk_dup_m2(thr); /* -> [ func funcname env funcname ] */ - duk_dup(thr, idx_base); /* -> [ func funcname env funcname func ] */ - duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ func funcname env ] */ - - need_pop = 1; /* Need to pop env, but -after- updating h_fun and increfs. */ - } - DUK_ASSERT(func_env != NULL); - DUK_HCOMPFUNC_SET_LEXENV(thr->heap, h_fun, func_env); - DUK_HCOMPFUNC_SET_VARENV(thr->heap, h_fun, func_env); - DUK_HOBJECT_INCREF(thr, func_env); - DUK_HOBJECT_INCREF(thr, func_env); - if (need_pop) { - duk_pop(thr); - } - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); -#endif /* DUK_USE_FUNC_NAME_PROPERTY */ - -#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) - p = duk__load_string_raw(thr, p); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C); -#endif /* DUK_USE_FUNC_FILENAME_PROPERTY */ - - if (DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_fun)) { - /* Restore empty external .prototype only for constructable - * functions. - */ - duk_push_object(thr); - duk_dup_m2(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* func.prototype.constructor = func */ - duk_compact_m1(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); - } - -#if defined(DUK_USE_PC2LINE) - p = duk__load_buffer_raw(thr, p); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_WC); -#endif /* DUK_USE_PC2LINE */ - - duk_push_object(thr); /* _Varmap */ - for (;;) { - /* XXX: awkward */ - p = duk__load_string_raw(thr, p); - if (duk_get_length(thr, -1) == 0) { - duk_pop(thr); - break; - } - tmp32 = DUK_RAW_READ_U32_BE(p); - duk_push_u32(thr, tmp32); - duk_put_prop(thr, -3); - } - duk_compact_m1(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE); - - /* _Formals may have been missing in the original function, which is - * handled using a marker length. - */ - arr_limit = DUK_RAW_READ_U32_BE(p); - if (arr_limit != DUK__NO_FORMALS) { - duk_push_array(thr); /* _Formals */ - for (arr_idx = 0; arr_idx < arr_limit; arr_idx++) { - p = duk__load_string_raw(thr, p); - duk_put_prop_index(thr, -2, arr_idx); - } - duk_compact_m1(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE); - } else { - DUK_DD(DUK_DDPRINT("no _Formals in dumped function")); - } - - /* Return with final function pushed on stack top. */ - DUK_DD(DUK_DDPRINT("final loaded function: %!iT", duk_get_tval(thr, -1))); - DUK_ASSERT_TOP(thr, idx_base + 1); - return p; - - format_error: - return NULL; -} - -DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) { - duk_hcompfunc *func; - duk_bufwriter_ctx bw_ctx_alloc; - duk_bufwriter_ctx *bw_ctx = &bw_ctx_alloc; - duk_uint8_t *p; - - DUK_ASSERT_API_ENTRY(thr); - - /* Bound functions don't have all properties so we'd either need to - * lookup the non-bound target function or reject bound functions. - * For now, bound functions are rejected with TypeError. - */ - func = duk_require_hcompfunc(thr, -1); - DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&func->obj)); - - /* Estimating the result size beforehand would be costly, so - * start with a reasonable size and extend as needed. - */ - DUK_BW_INIT_PUSHBUF(thr, bw_ctx, DUK__BYTECODE_INITIAL_ALLOC); - p = DUK_BW_GET_PTR(thr, bw_ctx); - *p++ = DUK__SER_MARKER; - p = duk__dump_func(thr, func, bw_ctx, p); - DUK_BW_SET_PTR(thr, bw_ctx, p); - DUK_BW_COMPACT(thr, bw_ctx); - - DUK_DD(DUK_DDPRINT("serialized result: %!T", duk_get_tval(thr, -1))); - - duk_remove_m2(thr); /* [ ... func buf ] -> [ ... buf ] */ -} - -DUK_EXTERNAL void duk_load_function(duk_hthread *thr) { - duk_uint8_t *p_buf, *p, *p_end; - duk_size_t sz; - - DUK_ASSERT_API_ENTRY(thr); - - p_buf = (duk_uint8_t *) duk_require_buffer(thr, -1, &sz); - DUK_ASSERT(p_buf != NULL); - - /* The caller is responsible for being sure that bytecode being loaded - * is valid and trusted. Invalid bytecode can cause memory unsafe - * behavior directly during loading or later during bytecode execution - * (instruction validation would be quite complex to implement). - * - * This signature check is the only sanity check for detecting - * accidental invalid inputs. The initial byte ensures no ordinary - * string or Symbol will be accepted by accident. - */ - p = p_buf; - p_end = p_buf + sz; - if (sz < 1 || p[0] != DUK__SER_MARKER) { - goto format_error; - } - p++; - - p = duk__load_func(thr, p, p_end); - if (p == NULL) { - goto format_error; - } - - duk_remove_m2(thr); /* [ ... buf func ] -> [ ... func ] */ - return; - - format_error: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BYTECODE); -} - -#else /* DUK_USE_BYTECODE_DUMP_SUPPORT */ - -DUK_EXTERNAL void duk_dump_function(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ERROR_UNSUPPORTED(thr); -} - -DUK_EXTERNAL void duk_load_function(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ERROR_UNSUPPORTED(thr); -} - -#endif /* DUK_USE_BYTECODE_DUMP_SUPPORT */ - -/* automatic undefs */ -#undef DUK__ASSERT_LEFT -#undef DUK__BYTECODE_INITIAL_ALLOC -#undef DUK__NO_FORMALS -#undef DUK__SER_MARKER -#undef DUK__SER_NUMBER -#undef DUK__SER_STRING -#line 1 "duk_api_call.c" -/* - * Calls. - * - * Protected variants should avoid ever throwing an error. Must be careful - * to catch errors related to value stack manipulation and property lookup, - * not just the call itself. - * - * The only exception is when arguments are insane, e.g. nargs/nrets are out - * of bounds; in such cases an error is thrown for two reasons. First, we - * can't always respect the value stack input/output guarantees in such cases - * so the caller would end up with the value stack in an unexpected state. - * Second, an attempt to create an error might itself fail (although this - * could be avoided by pushing a preallocated object/string or a primitive - * value). - */ - -/* #include duk_internal.h -> already included */ - -/* - * Helpers - */ - -struct duk__pcall_prop_args { - duk_idx_t obj_idx; - duk_idx_t nargs; - duk_small_uint_t call_flags; -}; -typedef struct duk__pcall_prop_args duk__pcall_prop_args; - -struct duk__pcall_method_args { - duk_idx_t nargs; - duk_small_uint_t call_flags; -}; -typedef struct duk__pcall_method_args duk__pcall_method_args; - -struct duk__pcall_args { - duk_idx_t nargs; - duk_small_uint_t call_flags; -}; -typedef struct duk__pcall_args duk__pcall_args; - -/* Compute and validate idx_func for a certain 'nargs' and 'other' - * parameter count (1 or 2, depending on whether 'this' binding is - * present). - */ -DUK_LOCAL duk_idx_t duk__call_get_idx_func(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) { - duk_idx_t idx_func; - - /* XXX: byte arithmetic? */ - - DUK_ASSERT(other >= 0); - - idx_func = duk_get_top(thr) - nargs - other; - if (DUK_UNLIKELY((idx_func | nargs) < 0)) { /* idx_func < 0 || nargs < 0; OR sign bits */ - DUK_ERROR_TYPE_INVALID_ARGS(thr); - /* unreachable */ - } - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - return idx_func; -} - -/* Compute idx_func, assume index will be valid. This is a valid assumption - * for protected calls: nargs < 0 is checked explicitly and duk_safe_call() - * validates the argument count. - */ -DUK_LOCAL duk_idx_t duk__call_get_idx_func_unvalidated(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) { - duk_idx_t idx_func; - - /* XXX: byte arithmetic? */ - - DUK_ASSERT(nargs >= 0); - DUK_ASSERT(other >= 0); - - idx_func = duk_get_top(thr) - nargs - other; - DUK_ASSERT(idx_func >= 0); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - return idx_func; -} - -/* Prepare value stack for a method call through an object property. - * May currently throw an error e.g. when getting the property. - */ -DUK_LOCAL void duk__call_prop_prep_stack(duk_hthread *thr, duk_idx_t normalized_obj_idx, duk_idx_t nargs) { - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(nargs >= 0); - - DUK_DDD(DUK_DDDPRINT("duk__call_prop_prep_stack, normalized_obj_idx=%ld, nargs=%ld, stacktop=%ld", - (long) normalized_obj_idx, (long) nargs, (long) duk_get_top(thr))); - - /* [... key arg1 ... argN] */ - - /* duplicate key */ - duk_dup(thr, -nargs - 1); /* Note: -nargs alone would fail for nargs == 0, this is OK */ - (void) duk_get_prop(thr, normalized_obj_idx); - - DUK_DDD(DUK_DDDPRINT("func: %!T", (duk_tval *) duk_get_tval(thr, -1))); - -#if defined(DUK_USE_VERBOSE_ERRORS) - if (DUK_UNLIKELY(!duk_is_callable(thr, -1))) { - duk_tval *tv_targ; - duk_tval *tv_base; - duk_tval *tv_key; - - tv_targ = DUK_GET_TVAL_NEGIDX(thr, -1); - tv_base = DUK_GET_TVAL_POSIDX(thr, normalized_obj_idx); - tv_key = DUK_GET_TVAL_NEGIDX(thr, -nargs - 2); - DUK_ASSERT(tv_targ >= thr->valstack_bottom && tv_targ < thr->valstack_top); - DUK_ASSERT(tv_base >= thr->valstack_bottom && tv_base < thr->valstack_top); - DUK_ASSERT(tv_key >= thr->valstack_bottom && tv_key < thr->valstack_top); - - duk_call_setup_propcall_error(thr, tv_targ, tv_base, tv_key); - } -#endif - - /* [... key arg1 ... argN func] */ - - duk_replace(thr, -nargs - 2); - - /* [... func arg1 ... argN] */ - - duk_dup(thr, normalized_obj_idx); - duk_insert(thr, -nargs - 1); - - /* [... func this arg1 ... argN] */ -} - -DUK_EXTERNAL void duk_call(duk_hthread *thr, duk_idx_t nargs) { - duk_small_uint_t call_flags; - duk_idx_t idx_func; - - DUK_ASSERT_API_ENTRY(thr); - - idx_func = duk__call_get_idx_func(thr, nargs, 1); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - - duk_insert_undefined(thr, idx_func + 1); - - call_flags = 0; /* not protected, respect reclimit, not constructor */ - duk_handle_call_unprotected(thr, idx_func, call_flags); -} - -DUK_EXTERNAL void duk_call_method(duk_hthread *thr, duk_idx_t nargs) { - duk_small_uint_t call_flags; - duk_idx_t idx_func; - - DUK_ASSERT_API_ENTRY(thr); - - idx_func = duk__call_get_idx_func(thr, nargs, 2); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - - call_flags = 0; /* not protected, respect reclimit, not constructor */ - duk_handle_call_unprotected(thr, idx_func, call_flags); -} - -DUK_EXTERNAL void duk_call_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) { - /* - * XXX: if duk_handle_call() took values through indices, this could be - * made much more sensible. However, duk_handle_call() needs to fudge - * the 'this' and 'func' values to handle bound functions, which is now - * done "in-place", so this is not a trivial change. - */ - - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); /* make absolute */ - if (DUK_UNLIKELY(nargs < 0)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - - duk__call_prop_prep_stack(thr, obj_idx, nargs); - - duk_call_method(thr, nargs); -} - -DUK_LOCAL duk_ret_t duk__pcall_raw(duk_hthread *thr, void *udata) { - duk__pcall_args *args; - duk_idx_t idx_func; - duk_int_t ret; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(udata != NULL); - - args = (duk__pcall_args *) udata; - idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 1); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - - duk_insert_undefined(thr, idx_func + 1); - - ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags); - DUK_ASSERT(ret == 0); - DUK_UNREF(ret); - - return 1; -} - -DUK_EXTERNAL duk_int_t duk_pcall(duk_hthread *thr, duk_idx_t nargs) { - duk__pcall_args args; - - DUK_ASSERT_API_ENTRY(thr); - - args.nargs = nargs; - if (DUK_UNLIKELY(nargs < 0)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return DUK_EXEC_ERROR; /* unreachable */ - } - args.call_flags = 0; - - return duk_safe_call(thr, duk__pcall_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); -} - -DUK_LOCAL duk_ret_t duk__pcall_method_raw(duk_hthread *thr, void *udata) { - duk__pcall_method_args *args; - duk_idx_t idx_func; - duk_int_t ret; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(udata != NULL); - - args = (duk__pcall_method_args *) udata; - - idx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 2); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - - ret = duk_handle_call_unprotected(thr, idx_func, args->call_flags); - DUK_ASSERT(ret == 0); - DUK_UNREF(ret); - - return 1; -} - -DUK_INTERNAL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags) { - duk__pcall_method_args args; - - DUK_ASSERT_API_ENTRY(thr); - - args.nargs = nargs; - if (DUK_UNLIKELY(nargs < 0)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return DUK_EXEC_ERROR; /* unreachable */ - } - args.call_flags = call_flags; - - return duk_safe_call(thr, duk__pcall_method_raw, (void *) &args /*udata*/, nargs + 2 /*nargs*/, 1 /*nrets*/); -} - -DUK_EXTERNAL duk_int_t duk_pcall_method(duk_hthread *thr, duk_idx_t nargs) { - DUK_ASSERT_API_ENTRY(thr); - - return duk_pcall_method_flags(thr, nargs, 0); -} - -DUK_LOCAL duk_ret_t duk__pcall_prop_raw(duk_hthread *thr, void *udata) { - duk__pcall_prop_args *args; - duk_idx_t obj_idx; - duk_int_t ret; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(udata != NULL); - - args = (duk__pcall_prop_args *) udata; - - obj_idx = duk_require_normalize_index(thr, args->obj_idx); /* make absolute */ - duk__call_prop_prep_stack(thr, obj_idx, args->nargs); - - ret = duk_handle_call_unprotected_nargs(thr, args->nargs, args->call_flags); - DUK_ASSERT(ret == 0); - DUK_UNREF(ret); - return 1; -} - -DUK_EXTERNAL duk_int_t duk_pcall_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) { - duk__pcall_prop_args args; - - DUK_ASSERT_API_ENTRY(thr); - - args.obj_idx = obj_idx; - args.nargs = nargs; - if (DUK_UNLIKELY(nargs < 0)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return DUK_EXEC_ERROR; /* unreachable */ - } - args.call_flags = 0; - - return duk_safe_call(thr, duk__pcall_prop_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); -} - -DUK_EXTERNAL duk_int_t duk_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets) { - duk_int_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* nargs condition; fail if: top - bottom < nargs - * <=> top < bottom + nargs - * nrets condition; fail if: end - (top - nargs) < nrets - * <=> end - top + nargs < nrets - * <=> end + nargs < top + nrets - */ - /* XXX: check for any reserve? */ - - if (DUK_UNLIKELY((nargs | nrets) < 0 || /* nargs < 0 || nrets < 0; OR sign bits */ - thr->valstack_top < thr->valstack_bottom + nargs || /* nargs too large compared to top */ - thr->valstack_end + nargs < thr->valstack_top + nrets)) { /* nrets too large compared to reserve */ - DUK_D(DUK_DPRINT("not enough stack reserve for safe call or invalid arguments: " - "nargs=%ld < 0 (?), nrets=%ld < 0 (?), top=%ld < bottom=%ld + nargs=%ld (?), " - "end=%ld + nargs=%ld < top=%ld + nrets=%ld (?)", - (long) nargs, - (long) nrets, - (long) (thr->valstack_top - thr->valstack), - (long) (thr->valstack_bottom - thr->valstack), - (long) nargs, - (long) (thr->valstack_end - thr->valstack), - (long) nargs, - (long) (thr->valstack_top - thr->valstack), - (long) nrets)); - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return DUK_EXEC_ERROR; /* unreachable */ - } - - rc = duk_handle_safe_call(thr, /* thread */ - func, /* func */ - udata, /* udata */ - nargs, /* num_stack_args */ - nrets); /* num_stack_res */ - - return rc; -} - -DUK_EXTERNAL void duk_new(duk_hthread *thr, duk_idx_t nargs) { - duk_idx_t idx_func; - - DUK_ASSERT_API_ENTRY(thr); - - idx_func = duk__call_get_idx_func(thr, nargs, 1); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - - duk_push_object(thr); /* default instance; internal proto updated by call handling */ - duk_insert(thr, idx_func + 1); - - duk_handle_call_unprotected(thr, idx_func, DUK_CALL_FLAG_CONSTRUCT); -} - -DUK_LOCAL duk_ret_t duk__pnew_helper(duk_hthread *thr, void *udata) { - duk_idx_t nargs; - - DUK_ASSERT(udata != NULL); - nargs = *((duk_idx_t *) udata); - - duk_new(thr, nargs); - return 1; -} - -DUK_EXTERNAL duk_int_t duk_pnew(duk_hthread *thr, duk_idx_t nargs) { - duk_int_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* For now, just use duk_safe_call() to wrap duk_new(). We can't - * simply use a protected duk_handle_call() because pushing the - * default instance might throw. - */ - - if (DUK_UNLIKELY(nargs < 0)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return DUK_EXEC_ERROR; /* unreachable */ - } - - rc = duk_safe_call(thr, duk__pnew_helper, (void *) &nargs /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/); - return rc; -} - -DUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_hthread *thr) { - duk_activation *act; - - DUK_ASSERT_API_ENTRY(thr); - - act = thr->callstack_curr; - if (act != NULL) { - return ((act->flags & DUK_ACT_FLAG_CONSTRUCT) != 0 ? 1 : 0); - } - return 0; -} - -/* XXX: Make this obsolete by adding a function flag for rejecting a - * non-constructor call automatically? - */ -DUK_INTERNAL void duk_require_constructor_call(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - if (!duk_is_constructor_call(thr)) { - DUK_ERROR_TYPE(thr, DUK_STR_CONSTRUCT_ONLY); - } -} - -DUK_EXTERNAL duk_bool_t duk_is_strict_call(duk_hthread *thr) { - duk_activation *act; - - /* For user code this could just return 1 (strict) always - * because all Duktape/C functions are considered strict, - * and strict is also the default when nothing is running. - * However, Duktape may call this function internally when - * the current activation is an Ecmascript function, so - * this cannot be replaced by a 'return 1' without fixing - * the internal call sites. - */ - - DUK_ASSERT_API_ENTRY(thr); - - act = thr->callstack_curr; - if (act != NULL) { - return ((act->flags & DUK_ACT_FLAG_STRICT) != 0 ? 1 : 0); - } else { - /* Strict by default. */ - return 1; - } -} - -/* - * Duktape/C function magic - */ - -DUK_EXTERNAL duk_int_t duk_get_current_magic(duk_hthread *thr) { - duk_activation *act; - duk_hobject *func; - - DUK_ASSERT_API_ENTRY(thr); - - act = thr->callstack_curr; - if (act) { - func = DUK_ACT_GET_FUNC(act); - if (!func) { - duk_tval *tv = &act->tv_func; - duk_small_uint_t lf_flags; - lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); - return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); - } - DUK_ASSERT(func != NULL); - - if (DUK_HOBJECT_IS_NATFUNC(func)) { - duk_hnatfunc *nf = (duk_hnatfunc *) func; - return (duk_int_t) nf->magic; - } - } - return 0; -} - -DUK_EXTERNAL duk_int_t duk_get_magic(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - if (DUK_TVAL_IS_OBJECT(tv)) { - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (!DUK_HOBJECT_HAS_NATFUNC(h)) { - goto type_error; - } - return (duk_int_t) ((duk_hnatfunc *) h)->magic; - } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - duk_small_uint_t lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); - return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); - } - - /* fall through */ - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE); - return 0; -} - -DUK_EXTERNAL void duk_set_magic(duk_hthread *thr, duk_idx_t idx, duk_int_t magic) { - duk_hnatfunc *nf; - - DUK_ASSERT_API_ENTRY(thr); - - nf = duk_require_hnatfunc(thr, idx); - DUK_ASSERT(nf != NULL); - nf->magic = (duk_int16_t) magic; -} - -/* - * Misc helpers - */ - -/* Resolve a bound function on value stack top to a non-bound target - * (leave other values as is). - */ -DUK_INTERNAL void duk_resolve_nonbound_function(duk_hthread *thr) { - duk_tval *tv; - - DUK_ASSERT_HTHREAD_VALID(thr); - - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) { - duk_push_tval(thr, &((duk_hboundfunc *) h)->target); - duk_replace(thr, -2); -#if 0 - DUK_TVAL_SET_TVAL(tv, &((duk_hboundfunc *) h)->target); - DUK_TVAL_INCREF(thr, tv); - DUK_HOBJECT_DECREF_NORZ(thr, h); -#endif - /* Rely on Function.prototype.bind() on never creating a bound - * function whose target is not proper. This is now safe - * because the target is not even an internal property but a - * struct member. - */ - DUK_ASSERT(duk_is_lightfunc(thr, -1) || duk_is_callable(thr, -1)); - } - } - - /* Lightfuncs cannot be bound but are always callable and - * constructable. - */ -} -#line 1 "duk_api_codec.c" -/* - * Encoding and decoding basic formats: hex, base64. - * - * These are in-place operations which may allow an optimized implementation. - * - * Base-64: https://tools.ietf.org/html/rfc4648#section-4 - */ - -/* #include duk_internal.h -> already included */ - -/* Shared handling for encode/decode argument. Fast path handling for - * buffer and string values because they're the most common. In particular, - * avoid creating a temporary string or buffer when possible. - */ -DUK_LOCAL const duk_uint8_t *duk__prep_codec_arg(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - void *ptr; - duk_bool_t isbuffer; - - DUK_ASSERT(duk_is_valid_index(thr, idx)); /* checked by caller */ - - /* XXX: with def_ptr set to a stack related pointer, isbuffer could - * be removed from the helper? - */ - ptr = duk_get_buffer_data_raw(thr, idx, out_len, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, &isbuffer); - if (isbuffer) { - DUK_ASSERT(*out_len == 0 || ptr != NULL); - return (const duk_uint8_t *) ptr; - } - return (const duk_uint8_t *) duk_to_lstring(thr, idx, out_len); -} - -#if defined(DUK_USE_BASE64_FASTPATH) -DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) { - duk_uint_t t; - duk_size_t n_full, n_full3, n_final; - const duk_uint8_t *src_end_fast; - - n_full = srclen / 3; /* full 3-byte -> 4-char conversions */ - n_full3 = n_full * 3; - n_final = srclen - n_full3; - DUK_ASSERT_DISABLE(n_final >= 0); - DUK_ASSERT(n_final <= 2); - - src_end_fast = src + n_full3; - while (DUK_UNLIKELY(src != src_end_fast)) { - t = (duk_uint_t) (*src++); - t = (t << 8) + (duk_uint_t) (*src++); - t = (t << 8) + (duk_uint_t) (*src++); - - *dst++ = duk_base64_enctab[t >> 18]; - *dst++ = duk_base64_enctab[(t >> 12) & 0x3f]; - *dst++ = duk_base64_enctab[(t >> 6) & 0x3f]; - *dst++ = duk_base64_enctab[t & 0x3f]; - -#if 0 /* Tested: not faster on x64 */ - /* aaaaaabb bbbbcccc ccdddddd */ - dst[0] = duk_base64_enctab[(src[0] >> 2) & 0x3f]; - dst[1] = duk_base64_enctab[((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f)]; - dst[2] = duk_base64_enctab[((src[1] << 2) & 0x3f) | ((src[2] >> 6) & 0x03)]; - dst[3] = duk_base64_enctab[src[2] & 0x3f]; - src += 3; dst += 4; -#endif - } - - switch (n_final) { - /* case 0: nop */ - case 1: { - /* XX== */ - t = (duk_uint_t) (*src++); - *dst++ = duk_base64_enctab[t >> 2]; /* XXXXXX-- */ - *dst++ = duk_base64_enctab[(t << 4) & 0x3f]; /* ------XX */ - *dst++ = DUK_ASC_EQUALS; - *dst++ = DUK_ASC_EQUALS; - break; - } - case 2: { - /* XXX= */ - t = (duk_uint_t) (*src++); - t = (t << 8) + (duk_uint_t) (*src++); - *dst++ = duk_base64_enctab[t >> 10]; /* XXXXXX-- -------- */ - *dst++ = duk_base64_enctab[(t >> 4) & 0x3f]; /* ------XX XXXX---- */ - *dst++ = duk_base64_enctab[(t << 2) & 0x3f]; /* -------- ----XXXX */ - *dst++ = DUK_ASC_EQUALS; - break; - } - } -} -#else /* DUK_USE_BASE64_FASTPATH */ -DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) { - duk_small_uint_t i, snip; - duk_uint_t t; - duk_uint_fast8_t x, y; - const duk_uint8_t *src_end; - - src_end = src + srclen; - - while (src < src_end) { - /* read 3 bytes into 't', padded by zero */ - snip = 4; - t = 0; - for (i = 0; i < 3; i++) { - t = t << 8; - if (src >= src_end) { - snip--; - } else { - t += (duk_uint_t) (*src++); - } - } - - /* - * Missing bytes snip base64 example - * 0 4 XXXX - * 1 3 XXX= - * 2 2 XX== - */ - - DUK_ASSERT(snip >= 2 && snip <= 4); - - for (i = 0; i < 4; i++) { - x = (duk_uint_fast8_t) ((t >> 18) & 0x3f); - t = t << 6; - - /* A straightforward 64-byte lookup would be faster - * and cleaner, but this is shorter. - */ - if (i >= snip) { - y = '='; - } else if (x <= 25) { - y = x + 'A'; - } else if (x <= 51) { - y = x - 26 + 'a'; - } else if (x <= 61) { - y = x - 52 + '0'; - } else if (x == 62) { - y = '+'; - } else { - y = '/'; - } - - *dst++ = (duk_uint8_t) y; - } - } -} -#endif /* DUK_USE_BASE64_FASTPATH */ - -#if defined(DUK_USE_BASE64_FASTPATH) -DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) { - duk_int_t x; - duk_int_t t; - duk_small_uint_t n_equal; - duk_small_uint_t n_chars; - const duk_uint8_t *src_end; - const duk_uint8_t *src_end_safe; - - src_end = src + srclen; - src_end_safe = src_end - 4; /* if 'src < src_end_safe', safe to read 4 bytes */ - - /* Innermost fast path processes 4 valid base-64 characters at a time - * but bails out on whitespace, padding chars ('=') and invalid chars. - * Once the slow path segment has been processed, we return to the - * inner fast path again. This handles e.g. base64 with newlines - * reasonably well because the majority of a line is in the fast path. - */ - for (;;) { - /* Fast path, handle units with just actual encoding characters. */ - - while (src <= src_end_safe) { - /* The lookup byte is intentionally sign extended to (at least) - * 32 bits and then ORed. This ensures that is at least 1 byte - * is negative, the highest bit of 't' will be set at the end - * and we don't need to check every byte. - */ - DUK_DDD(DUK_DDDPRINT("fast loop: src=%p, src_end_safe=%p, src_end=%p", - (const void *) src, (const void *) src_end_safe, (const void *) src_end)); - - t = (duk_int_t) duk_base64_dectab[*src++]; - t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; - t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; - t = (t << 6) | (duk_int_t) duk_base64_dectab[*src++]; - - if (DUK_UNLIKELY(t < 0)) { - DUK_DDD(DUK_DDDPRINT("fast loop unit was not clean, process one slow path unit")); - src -= 4; - break; - } - - DUK_ASSERT(t <= 0xffffffL); - DUK_ASSERT((t >> 24) == 0); - *dst++ = (duk_uint8_t) (t >> 16); - *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); - *dst++ = (duk_uint8_t) (t & 0xff); - } - - /* Handle one slow path unit (or finish if we're done). */ - - n_equal = 0; - n_chars = 0; - t = 0; - for (;;) { - DUK_DDD(DUK_DDDPRINT("slow loop: src=%p, src_end=%p, n_chars=%ld, n_equal=%ld, t=%ld", - (const void *) src, (const void *) src_end, (long) n_chars, (long) n_equal, (long) t)); - - if (DUK_UNLIKELY(src >= src_end)) { - goto done; /* two level break */ - } - - x = duk_base64_dectab[*src++]; - if (DUK_UNLIKELY(x < 0)) { - if (x == -2) { - continue; /* allowed ascii whitespace */ - } else if (x == -3) { - n_equal++; - t <<= 6; - } else { - DUK_ASSERT(x == -1); - goto decode_error; - } - } else { - DUK_ASSERT(x >= 0 && x <= 63); - if (n_equal > 0) { - /* Don't allow actual chars after equal sign. */ - goto decode_error; - } - t = (t << 6) + x; - } - - if (DUK_UNLIKELY(n_chars == 3)) { - /* Emit 3 bytes and backtrack if there was padding. There's - * always space for the whole 3 bytes so no check needed. - */ - DUK_ASSERT(t <= 0xffffffL); - DUK_ASSERT((t >> 24) == 0); - *dst++ = (duk_uint8_t) (t >> 16); - *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); - *dst++ = (duk_uint8_t) (t & 0xff); - - if (DUK_UNLIKELY(n_equal > 0)) { - DUK_ASSERT(n_equal <= 4); - - /* There may be whitespace between the equal signs. */ - if (n_equal == 1) { - /* XXX= */ - dst -= 1; - } else if (n_equal == 2) { - /* XX== */ - dst -= 2; - } else { - goto decode_error; /* invalid padding */ - } - - /* Continue parsing after padding, allows concatenated, - * padded base64. - */ - } - break; /* back to fast loop */ - } else { - n_chars++; - } - } - } - done: - DUK_DDD(DUK_DDDPRINT("done; src=%p, src_end=%p, n_chars=%ld", - (const void *) src, (const void *) src_end, (long) n_chars)); - - DUK_ASSERT(src == src_end); - - if (n_chars != 0) { - /* Here we'd have the option of decoding unpadded base64 - * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not - * accepted. - */ - goto decode_error; - } - - *out_dst_final = dst; - return 1; - - decode_error: - return 0; -} -#else /* DUK_USE_BASE64_FASTPATH */ -DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) { - duk_uint_t t; - duk_uint_fast8_t x, y; - duk_small_uint_t group_idx; - duk_small_uint_t n_equal; - const duk_uint8_t *src_end; - - src_end = src + srclen; - t = 0; - group_idx = 0; - n_equal = 0; - - while (src < src_end) { - x = *src++; - - if (x >= 'A' && x <= 'Z') { - y = x - 'A' + 0; - } else if (x >= 'a' && x <= 'z') { - y = x - 'a' + 26; - } else if (x >= '0' && x <= '9') { - y = x - '0' + 52; - } else if (x == '+') { - y = 62; - } else if (x == '/') { - y = 63; - } else if (x == '=') { - /* We don't check the zero padding bytes here right now - * (that they're actually zero). This seems to be common - * behavior for base-64 decoders. - */ - - n_equal++; - t <<= 6; /* shift in zeroes */ - goto skip_add; - } else if (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20) { - /* allow basic ASCII whitespace */ - continue; - } else { - goto decode_error; - } - - if (n_equal > 0) { - /* Don't allow mixed padding and actual chars. */ - goto decode_error; - } - t = (t << 6) + y; - skip_add: - - if (group_idx == 3) { - /* output 3 bytes from 't' */ - *dst++ = (duk_uint8_t) ((t >> 16) & 0xff); - *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); - *dst++ = (duk_uint8_t) (t & 0xff); - - if (DUK_UNLIKELY(n_equal > 0)) { - /* Backtrack. */ - DUK_ASSERT(n_equal <= 4); - if (n_equal == 1) { - dst -= 1; - } else if (n_equal == 2) { - dst -= 2; - } else { - goto decode_error; /* invalid padding */ - } - - /* Here we can choose either to end parsing and ignore - * whatever follows, or to continue parsing in case - * multiple (possibly padded) base64 strings have been - * concatenated. Currently, keep on parsing. - */ - n_equal = 0; - } - - t = 0; - group_idx = 0; - } else { - group_idx++; - } - } - - if (group_idx != 0) { - /* Here we'd have the option of decoding unpadded base64 - * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not - * accepted. - */ - goto decode_error; - } - - *out_dst_final = dst; - return 1; - - decode_error: - return 0; -} -#endif /* DUK_USE_BASE64_FASTPATH */ - -DUK_EXTERNAL const char *duk_base64_encode(duk_hthread *thr, duk_idx_t idx) { - const duk_uint8_t *src; - duk_size_t srclen; - duk_size_t dstlen; - duk_uint8_t *dst; - const char *ret; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: optimize for string inputs: no need to coerce to a buffer - * which makes a copy of the input. - */ - - idx = duk_require_normalize_index(thr, idx); - src = duk__prep_codec_arg(thr, idx, &srclen); - /* Note: for srclen=0, src may be NULL */ - - /* Computation must not wrap; this limit works for 32-bit size_t: - * >>> srclen = 3221225469 - * >>> '%x' % ((srclen + 2) / 3 * 4) - * 'fffffffc' - */ - if (srclen > 3221225469UL) { - goto type_error; - } - dstlen = (srclen + 2) / 3 * 4; - dst = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, dstlen); - - duk__base64_encode_helper((const duk_uint8_t *) src, srclen, dst); - - ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */ - duk_replace(thr, idx); - return ret; - - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_BASE64_ENCODE_FAILED); - return NULL; /* never here */ -} - -DUK_EXTERNAL void duk_base64_decode(duk_hthread *thr, duk_idx_t idx) { - const duk_uint8_t *src; - duk_size_t srclen; - duk_size_t dstlen; - duk_uint8_t *dst; - duk_uint8_t *dst_final; - duk_bool_t retval; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: optimize for buffer inputs: no need to coerce to a string - * which causes an unnecessary interning. - */ - - idx = duk_require_normalize_index(thr, idx); - src = duk__prep_codec_arg(thr, idx, &srclen); - - /* Computation must not wrap, only srclen + 3 is at risk of - * wrapping because after that the number gets smaller. - * This limit works for 32-bit size_t: - * 0x100000000 - 3 - 1 = 4294967292 - */ - if (srclen > 4294967292UL) { - goto type_error; - } - dstlen = (srclen + 3) / 4 * 3; /* upper limit, assuming no whitespace etc */ - dst = (duk_uint8_t *) duk_push_dynamic_buffer(thr, dstlen); - /* Note: for dstlen=0, dst may be NULL */ - - retval = duk__base64_decode_helper((const duk_uint8_t *) src, srclen, dst, &dst_final); - if (!retval) { - goto type_error; - } - - /* XXX: convert to fixed buffer? */ - (void) duk_resize_buffer(thr, -1, (duk_size_t) (dst_final - dst)); - duk_replace(thr, idx); - return; - - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_BASE64_DECODE_FAILED); -} - -DUK_EXTERNAL const char *duk_hex_encode(duk_hthread *thr, duk_idx_t idx) { - const duk_uint8_t *inp; - duk_size_t len; - duk_size_t i; - duk_uint8_t *buf; - const char *ret; -#if defined(DUK_USE_HEX_FASTPATH) - duk_size_t len_safe; - duk_uint16_t *p16; -#endif - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - inp = duk__prep_codec_arg(thr, idx, &len); - DUK_ASSERT(inp != NULL || len == 0); - - /* Fixed buffer, no zeroing because we'll fill all the data. */ - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len * 2); - DUK_ASSERT(buf != NULL); - -#if defined(DUK_USE_HEX_FASTPATH) - DUK_ASSERT((((duk_size_t) buf) & 0x01U) == 0); /* pointer is aligned, guaranteed for fixed buffer */ - p16 = (duk_uint16_t *) (void *) buf; - len_safe = len & ~0x03U; - for (i = 0; i < len_safe; i += 4) { - p16[0] = duk_hex_enctab[inp[i]]; - p16[1] = duk_hex_enctab[inp[i + 1]]; - p16[2] = duk_hex_enctab[inp[i + 2]]; - p16[3] = duk_hex_enctab[inp[i + 3]]; - p16 += 4; - } - for (; i < len; i++) { - *p16++ = duk_hex_enctab[inp[i]]; - } -#else /* DUK_USE_HEX_FASTPATH */ - for (i = 0; i < len; i++) { - duk_small_uint_t t; - t = (duk_small_uint_t) inp[i]; - buf[i*2 + 0] = duk_lc_digits[t >> 4]; - buf[i*2 + 1] = duk_lc_digits[t & 0x0f]; - } -#endif /* DUK_USE_HEX_FASTPATH */ - - /* XXX: Using a string return value forces a string intern which is - * not always necessary. As a rough performance measure, hex encode - * time for tests/perf/test-hex-encode.js dropped from ~35s to ~15s - * without string coercion. Change to returning a buffer and let the - * caller coerce to string if necessary? - */ - - ret = duk_buffer_to_string(thr, -1); /* Safe, result is ASCII. */ - duk_replace(thr, idx); - return ret; -} - -DUK_EXTERNAL void duk_hex_decode(duk_hthread *thr, duk_idx_t idx) { - const duk_uint8_t *inp; - duk_size_t len; - duk_size_t i; - duk_int_t t; - duk_uint8_t *buf; -#if defined(DUK_USE_HEX_FASTPATH) - duk_int_t chk; - duk_uint8_t *p; - duk_size_t len_safe; -#endif - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - inp = duk__prep_codec_arg(thr, idx, &len); - DUK_ASSERT(inp != NULL || len == 0); - - if (len & 0x01) { - goto type_error; - } - - /* Fixed buffer, no zeroing because we'll fill all the data. */ - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len / 2); - DUK_ASSERT(buf != NULL); - -#if defined(DUK_USE_HEX_FASTPATH) - p = buf; - len_safe = len & ~0x07U; - for (i = 0; i < len_safe; i += 8) { - t = ((duk_int_t) duk_hex_dectab_shift4[inp[i]]) | - ((duk_int_t) duk_hex_dectab[inp[i + 1]]); - chk = t; - p[0] = (duk_uint8_t) t; - t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 2]]) | - ((duk_int_t) duk_hex_dectab[inp[i + 3]]); - chk |= t; - p[1] = (duk_uint8_t) t; - t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 4]]) | - ((duk_int_t) duk_hex_dectab[inp[i + 5]]); - chk |= t; - p[2] = (duk_uint8_t) t; - t = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 6]]) | - ((duk_int_t) duk_hex_dectab[inp[i + 7]]); - chk |= t; - p[3] = (duk_uint8_t) t; - p += 4; - - /* Check if any lookup above had a negative result. */ - if (DUK_UNLIKELY(chk < 0)) { - goto type_error; - } - } - for (; i < len; i += 2) { - t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) | - ((duk_int_t) duk_hex_dectab[inp[i + 1]]); - if (DUK_UNLIKELY(t < 0)) { - goto type_error; - } - *p++ = (duk_uint8_t) t; - } -#else /* DUK_USE_HEX_FASTPATH */ - for (i = 0; i < len; i += 2) { - /* For invalid characters the value -1 gets extended to - * at least 16 bits. If either nybble is invalid, the - * resulting 't' will be < 0. - */ - t = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) | - ((duk_int_t) duk_hex_dectab[inp[i + 1]]); - if (DUK_UNLIKELY(t < 0)) { - goto type_error; - } - buf[i >> 1] = (duk_uint8_t) t; - } -#endif /* DUK_USE_HEX_FASTPATH */ - - duk_replace(thr, idx); - return; - - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_HEX_DECODE_FAILED); -} - -#if defined(DUK_USE_JSON_SUPPORT) -DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) { -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t top_at_entry; -#endif - const char *ret; - - DUK_ASSERT_API_ENTRY(thr); -#if defined(DUK_USE_ASSERTIONS) - top_at_entry = duk_get_top(thr); -#endif - - idx = duk_require_normalize_index(thr, idx); - duk_bi_json_stringify_helper(thr, - idx /*idx_value*/, - DUK_INVALID_INDEX /*idx_replacer*/, - DUK_INVALID_INDEX /*idx_space*/, - 0 /*flags*/); - DUK_ASSERT(duk_is_string(thr, -1)); - duk_replace(thr, idx); - ret = duk_get_string(thr, idx); - - DUK_ASSERT(duk_get_top(thr) == top_at_entry); - - return ret; -} - -DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) { -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t top_at_entry; -#endif - - DUK_ASSERT_API_ENTRY(thr); -#if defined(DUK_USE_ASSERTIONS) - top_at_entry = duk_get_top(thr); -#endif - - idx = duk_require_normalize_index(thr, idx); - duk_bi_json_parse_helper(thr, - idx /*idx_value*/, - DUK_INVALID_INDEX /*idx_reviver*/, - 0 /*flags*/); - duk_replace(thr, idx); - - DUK_ASSERT(duk_get_top(thr) == top_at_entry); -} -#else /* DUK_USE_JSON_SUPPORT */ -DUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(idx); - DUK_ERROR_UNSUPPORTED(thr); -} - -DUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(idx); - DUK_ERROR_UNSUPPORTED(thr); -} -#endif /* DUK_USE_JSON_SUPPORT */ -#line 1 "duk_api_compile.c" -/* - * Compilation and evaluation - */ - -/* #include duk_internal.h -> already included */ - -typedef struct duk__compile_raw_args duk__compile_raw_args; -struct duk__compile_raw_args { - duk_size_t src_length; /* should be first on 64-bit platforms */ - const duk_uint8_t *src_buffer; - duk_uint_t flags; -}; - -/* Eval is just a wrapper now. */ -DUK_EXTERNAL duk_int_t duk_eval_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { - duk_int_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* Note: strictness is *not* inherited from the current Duktape/C. - * This would be confusing because the current strictness state - * depends on whether we're running inside a Duktape/C activation - * (= strict mode) or outside of any activation (= non-strict mode). - * See tests/api/test-eval-strictness.c for more discussion. - */ - - /* [ ... source? filename? ] (depends on flags) */ - - rc = duk_compile_raw(thr, src_buffer, src_length, flags | DUK_COMPILE_EVAL); /* may be safe, or non-safe depending on flags */ - - /* [ ... closure/error ] */ - - if (rc != DUK_EXEC_SUCCESS) { - rc = DUK_EXEC_ERROR; - goto got_rc; - } - - duk_push_global_object(thr); /* explicit 'this' binding, see GH-164 */ - - if (flags & DUK_COMPILE_SAFE) { - rc = duk_pcall_method(thr, 0); - } else { - duk_call_method(thr, 0); - rc = DUK_EXEC_SUCCESS; - } - - /* [ ... result/error ] */ - - got_rc: - if (flags & DUK_COMPILE_NORESULT) { - duk_pop(thr); - } - - return rc; -} - -/* Helper which can be called both directly and with duk_safe_call(). */ -DUK_LOCAL duk_ret_t duk__do_compile(duk_hthread *thr, void *udata) { - duk__compile_raw_args *comp_args; - duk_uint_t flags; - duk_hcompfunc *h_templ; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(udata != NULL); - - /* Note: strictness is not inherited from the current Duktape/C - * context. Otherwise it would not be possible to compile - * non-strict code inside a Duktape/C activation (which is - * always strict now). See tests/api/test-eval-strictness.c - * for discussion. - */ - - /* [ ... source? filename? ] (depends on flags) */ - - comp_args = (duk__compile_raw_args *) udata; - flags = comp_args->flags; - - if (flags & DUK_COMPILE_NOFILENAME) { - /* Automatic filename: 'eval' or 'input'. */ - duk_push_hstring_stridx(thr, (flags & DUK_COMPILE_EVAL) ? DUK_STRIDX_EVAL : DUK_STRIDX_INPUT); - } - - /* [ ... source? filename ] */ - - if (!comp_args->src_buffer) { - duk_hstring *h_sourcecode; - - h_sourcecode = duk_get_hstring(thr, -2); - if ((flags & DUK_COMPILE_NOSOURCE) || /* args incorrect */ - (h_sourcecode == NULL)) { /* e.g. duk_push_string_file_raw() pushed undefined */ - DUK_ERROR_TYPE(thr, DUK_STR_NO_SOURCECODE); - } - DUK_ASSERT(h_sourcecode != NULL); - comp_args->src_buffer = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode); - comp_args->src_length = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode); - } - DUK_ASSERT(comp_args->src_buffer != NULL); - - if (flags & DUK_COMPILE_FUNCTION) { - flags |= DUK_COMPILE_EVAL | DUK_COMPILE_FUNCEXPR; - } - - /* [ ... source? filename ] */ - - duk_js_compile(thr, comp_args->src_buffer, comp_args->src_length, flags); - - /* [ ... source? func_template ] */ - - if (flags & DUK_COMPILE_NOSOURCE) { - ; - } else { - duk_remove_m2(thr); - } - - /* [ ... func_template ] */ - - h_templ = (duk_hcompfunc *) duk_known_hobject(thr, -1); - duk_js_push_closure(thr, - h_templ, - thr->builtins[DUK_BIDX_GLOBAL_ENV], - thr->builtins[DUK_BIDX_GLOBAL_ENV], - 1 /*add_auto_proto*/); - duk_remove_m2(thr); /* -> [ ... closure ] */ - - /* [ ... closure ] */ - - return 1; -} - -DUK_EXTERNAL duk_int_t duk_compile_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { - duk__compile_raw_args comp_args_alloc; - duk__compile_raw_args *comp_args = &comp_args_alloc; - - DUK_ASSERT_API_ENTRY(thr); - - if ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) { - /* String length is computed here to avoid multiple evaluation - * of a macro argument in the calling side. - */ - src_length = DUK_STRLEN(src_buffer); - } - - comp_args->src_buffer = (const duk_uint8_t *) src_buffer; - comp_args->src_length = src_length; - comp_args->flags = flags; - - /* [ ... source? filename? ] (depends on flags) */ - - if (flags & DUK_COMPILE_SAFE) { - duk_int_t rc; - duk_int_t nargs; - duk_int_t nrets = 1; - - /* Arguments can be: [ source? filename? &comp_args] so that - * nargs is 1 to 3. Call site encodes the correct nargs count - * directly into flags. - */ - nargs = flags & 0x07; - DUK_ASSERT(nargs == ((flags & DUK_COMPILE_NOSOURCE) ? 0 : 1) + - ((flags & DUK_COMPILE_NOFILENAME) ? 0 : 1)); - rc = duk_safe_call(thr, duk__do_compile, (void *) comp_args, nargs, nrets); - - /* [ ... closure ] */ - return rc; - } - - (void) duk__do_compile(thr, (void *) comp_args); - - /* [ ... closure ] */ - return DUK_EXEC_SUCCESS; -} -#line 1 "duk_api_debug.c" -/* - * Debugging related API calls - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_JSON_SUPPORT) -DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) { - duk_idx_t idx; - duk_idx_t top; - - DUK_ASSERT_API_ENTRY(thr); - - /* We don't duk_require_stack() here now, but rely on the caller having - * enough space. - */ - - top = duk_get_top(thr); - duk_push_array(thr); - for (idx = 0; idx < top; idx++) { - duk_dup(thr, idx); - duk_put_prop_index(thr, -2, (duk_uarridx_t) idx); - } - - /* XXX: conversion errors should not propagate outwards. - * Perhaps values need to be coerced individually? - */ - duk_bi_json_stringify_helper(thr, - duk_get_top_index(thr), /*idx_value*/ - DUK_INVALID_INDEX, /*idx_replacer*/ - DUK_INVALID_INDEX, /*idx_space*/ - DUK_JSON_FLAG_EXT_CUSTOM | - DUK_JSON_FLAG_ASCII_ONLY | - DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); - - duk_push_sprintf(thr, "ctx: top=%ld, stack=%s", (long) top, (const char *) duk_safe_to_string(thr, -1)); - duk_replace(thr, -3); /* [ ... arr jsonx(arr) res ] -> [ ... res jsonx(arr) ] */ - duk_pop(thr); - DUK_ASSERT(duk_is_string(thr, -1)); -} -#else /* DUK_USE_JSON_SUPPORT */ -DUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ERROR_UNSUPPORTED(thr); -} -#endif /* DUK_USE_JSON_SUPPORT */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - -DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr, - duk_debug_read_function read_cb, - duk_debug_write_function write_cb, - duk_debug_peek_function peek_cb, - duk_debug_read_flush_function read_flush_cb, - duk_debug_write_flush_function write_flush_cb, - duk_debug_request_function request_cb, - duk_debug_detached_function detached_cb, - void *udata) { - duk_heap *heap; - const char *str; - duk_size_t len; - - /* XXX: should there be an error or an automatic detach if - * already attached? - */ - - DUK_D(DUK_DPRINT("application called duk_debugger_attach()")); - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(read_cb != NULL); - DUK_ASSERT(write_cb != NULL); - /* Other callbacks are optional. */ - - heap = thr->heap; - heap->dbg_read_cb = read_cb; - heap->dbg_write_cb = write_cb; - heap->dbg_peek_cb = peek_cb; - heap->dbg_read_flush_cb = read_flush_cb; - heap->dbg_write_flush_cb = write_flush_cb; - heap->dbg_request_cb = request_cb; - heap->dbg_detached_cb = detached_cb; - heap->dbg_udata = udata; - heap->dbg_have_next_byte = 0; - - /* Start in paused state. */ - heap->dbg_processing = 0; - heap->dbg_state_dirty = 0; - heap->dbg_force_restart = 0; - heap->dbg_pause_flags = 0; - heap->dbg_pause_act = NULL; - heap->dbg_pause_startline = 0; - heap->dbg_exec_counter = 0; - heap->dbg_last_counter = 0; - heap->dbg_last_time = 0.0; - duk_debug_set_paused(heap); /* XXX: overlap with fields above */ - - /* Send version identification and flush right afterwards. Note that - * we must write raw, unframed bytes here. - */ - duk_push_sprintf(thr, "%ld %ld %s %s\n", - (long) DUK_DEBUG_PROTOCOL_VERSION, - (long) DUK_VERSION, - (const char *) DUK_GIT_DESCRIBE, - (const char *) DUK_USE_TARGET_INFO); - str = duk_get_lstring(thr, -1, &len); - DUK_ASSERT(str != NULL); - duk_debug_write_bytes(thr, (const duk_uint8_t *) str, len); - duk_debug_write_flush(thr); - duk_pop(thr); -} - -DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) { - DUK_D(DUK_DPRINT("application called duk_debugger_detach()")); - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - - /* Can be called multiple times with no harm. */ - duk_debug_do_detach(thr->heap); -} - -DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) { - duk_bool_t processed_messages; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - - if (!duk_debug_is_attached(thr->heap)) { - return; - } - if (thr->callstack_curr != NULL || thr->heap->dbg_processing) { - /* Calling duk_debugger_cooperate() while Duktape is being - * called into is not supported. This is not a 100% check - * but prevents any damage in most cases. - */ - return; - } - - processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/); - DUK_UNREF(processed_messages); -} - -DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) { - duk_idx_t top; - duk_idx_t idx; - duk_bool_t ret = 0; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - - DUK_D(DUK_DPRINT("application called duk_debugger_notify() with nvalues=%ld", (long) nvalues)); - - top = duk_get_top(thr); - if (top < nvalues) { - DUK_ERROR_RANGE(thr, "not enough stack values for notify"); - return ret; /* unreachable */ - } - if (duk_debug_is_attached(thr->heap)) { - duk_debug_write_notify(thr, DUK_DBG_CMD_APPNOTIFY); - for (idx = top - nvalues; idx < top; idx++) { - duk_tval *tv = DUK_GET_TVAL_POSIDX(thr, idx); - duk_debug_write_tval(thr, tv); - } - duk_debug_write_eom(thr); - - /* Return non-zero (true) if we have a good reason to believe - * the notify was delivered; if we're still attached at least - * a transport error was not indicated by the transport write - * callback. This is not a 100% guarantee of course. - */ - if (duk_debug_is_attached(thr->heap)) { - ret = 1; - } - } - duk_pop_n(thr, nvalues); - return ret; -} - -DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - - DUK_D(DUK_DPRINT("application called duk_debugger_pause()")); - - /* Treat like a debugger statement: ignore when not attached. */ - if (duk_debug_is_attached(thr->heap)) { - if (duk_debug_is_paused(thr->heap)) { - DUK_D(DUK_DPRINT("duk_debugger_pause() called when already paused; ignoring")); - } else { - duk_debug_set_paused(thr->heap); - - /* Pause on the next opcode executed. This is always safe to do even - * inside the debugger message loop: the interrupt counter will be reset - * to its proper value when the message loop exits. - */ - thr->interrupt_init = 1; - thr->interrupt_counter = 0; - } - } -} - -#else /* DUK_USE_DEBUGGER_SUPPORT */ - -DUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr, - duk_debug_read_function read_cb, - duk_debug_write_function write_cb, - duk_debug_peek_function peek_cb, - duk_debug_read_flush_function read_flush_cb, - duk_debug_write_flush_function write_flush_cb, - duk_debug_request_function request_cb, - duk_debug_detached_function detached_cb, - void *udata) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(read_cb); - DUK_UNREF(write_cb); - DUK_UNREF(peek_cb); - DUK_UNREF(read_flush_cb); - DUK_UNREF(write_flush_cb); - DUK_UNREF(request_cb); - DUK_UNREF(detached_cb); - DUK_UNREF(udata); - DUK_ERROR_TYPE(thr, "no debugger support"); -} - -DUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ERROR_TYPE(thr, "no debugger support"); -} - -DUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) { - /* nop */ - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(thr); -} - -DUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) { - duk_idx_t top; - - DUK_ASSERT_API_ENTRY(thr); - - top = duk_get_top(thr); - if (top < nvalues) { - DUK_ERROR_RANGE_INVALID_COUNT(thr); - return 0; /* unreachable */ - } - - /* No debugger support, just pop values. */ - duk_pop_n(thr, nvalues); - return 0; -} - -DUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) { - /* Treat like debugger statement: nop */ - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(thr); -} - -#endif /* DUK_USE_DEBUGGER_SUPPORT */ -#line 1 "duk_api_heap.c" -/* - * Heap creation and destruction - */ - -/* #include duk_internal.h -> already included */ - -typedef struct duk_internal_thread_state duk_internal_thread_state; - -struct duk_internal_thread_state { - duk_ljstate lj; - duk_bool_t creating_error; - duk_hthread *curr_thread; - duk_int_t call_recursion_depth; -}; - -DUK_EXTERNAL duk_hthread *duk_create_heap(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *heap_udata, - duk_fatal_function fatal_handler) { - duk_heap *heap = NULL; - duk_hthread *thr; - - /* Assume that either all memory funcs are NULL or non-NULL, mixed - * cases will now be unsafe. - */ - - /* XXX: just assert non-NULL values here and make caller arguments - * do the defaulting to the default implementations (smaller code)? - */ - - if (!alloc_func) { - DUK_ASSERT(realloc_func == NULL); - DUK_ASSERT(free_func == NULL); -#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS) - alloc_func = duk_default_alloc_function; - realloc_func = duk_default_realloc_function; - free_func = duk_default_free_function; -#else - DUK_D(DUK_DPRINT("no allocation functions given and no default providers")); - return NULL; -#endif - } else { - DUK_ASSERT(realloc_func != NULL); - DUK_ASSERT(free_func != NULL); - } - - if (!fatal_handler) { - fatal_handler = duk_default_fatal_handler; - } - - DUK_ASSERT(alloc_func != NULL); - DUK_ASSERT(realloc_func != NULL); - DUK_ASSERT(free_func != NULL); - DUK_ASSERT(fatal_handler != NULL); - - heap = duk_heap_alloc(alloc_func, realloc_func, free_func, heap_udata, fatal_handler); - if (!heap) { - return NULL; - } - thr = heap->heap_thread; - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - return thr; -} - -DUK_EXTERNAL void duk_destroy_heap(duk_hthread *thr) { - duk_heap *heap; - - if (!thr) { - return; - } - DUK_ASSERT_API_ENTRY(thr); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - duk_heap_free(heap); -} - -DUK_EXTERNAL void duk_suspend(duk_hthread *thr, duk_thread_state *state) { - duk_internal_thread_state *snapshot = (duk_internal_thread_state *) (void *) state; - duk_heap *heap; - duk_ljstate *lj; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(state != NULL); /* unvalidated */ - - /* Currently not supported when called from within a finalizer. - * If that is done, the finalizer will remain running indefinitely, - * preventing other finalizers from executing. The assert is a bit - * wider, checking that it would be OK to run pending finalizers. - */ - DUK_ASSERT(thr->heap->pf_prevent_count == 0); - - /* Currently not supported to duk_suspend() from an errCreate() - * call. - */ - DUK_ASSERT(thr->heap->creating_error == 0); - - heap = thr->heap; - lj = &heap->lj; - - duk_push_tval(thr, &lj->value1); - duk_push_tval(thr, &lj->value2); - - /* XXX: creating_error == 0 is asserted above, so no need to store. */ - DUK_MEMCPY((void *) &snapshot->lj, (const void *) lj, sizeof(duk_ljstate)); - snapshot->creating_error = heap->creating_error; - snapshot->curr_thread = heap->curr_thread; - snapshot->call_recursion_depth = heap->call_recursion_depth; - - lj->jmpbuf_ptr = NULL; - lj->type = DUK_LJ_TYPE_UNKNOWN; - DUK_TVAL_SET_UNDEFINED(&lj->value1); - DUK_TVAL_SET_UNDEFINED(&lj->value2); - heap->creating_error = 0; - heap->curr_thread = NULL; - heap->call_recursion_depth = 0; -} - -DUK_EXTERNAL void duk_resume(duk_hthread *thr, const duk_thread_state *state) { - const duk_internal_thread_state *snapshot = (const duk_internal_thread_state *) (const void *) state; - duk_heap *heap; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(state != NULL); /* unvalidated */ - - /* Shouldn't be necessary if duk_suspend() is called before - * duk_resume(), but assert in case API sequence is incorrect. - */ - DUK_ASSERT(thr->heap->pf_prevent_count == 0); - DUK_ASSERT(thr->heap->creating_error == 0); - - heap = thr->heap; - - DUK_MEMCPY((void *) &heap->lj, (const void *) &snapshot->lj, sizeof(duk_ljstate)); - heap->creating_error = snapshot->creating_error; - heap->curr_thread = snapshot->curr_thread; - heap->call_recursion_depth = snapshot->call_recursion_depth; - - duk_pop_2(thr); -} - -/* XXX: better place for this */ -DUK_EXTERNAL void duk_set_global_object(duk_hthread *thr) { - duk_hobject *h_glob; - duk_hobject *h_prev_glob; - duk_hobjenv *h_env; - duk_hobject *h_prev_env; - - DUK_ASSERT_API_ENTRY(thr); - - DUK_D(DUK_DPRINT("replace global object with: %!T", duk_get_tval(thr, -1))); - - h_glob = duk_require_hobject(thr, -1); - DUK_ASSERT(h_glob != NULL); - - /* - * Replace global object. - */ - - h_prev_glob = thr->builtins[DUK_BIDX_GLOBAL]; - DUK_UNREF(h_prev_glob); - thr->builtins[DUK_BIDX_GLOBAL] = h_glob; - DUK_HOBJECT_INCREF(thr, h_glob); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_glob); /* side effects, in theory (referenced by global env) */ - - /* - * Replace lexical environment for global scope - * - * Create a new object environment for the global lexical scope. - * We can't just reset the _Target property of the current one, - * because the lexical scope is shared by other threads with the - * same (initial) built-ins. - */ - - h_env = duk_hobjenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); - DUK_ASSERT(h_env != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_env) == NULL); - - DUK_ASSERT(h_env->target == NULL); - DUK_ASSERT(h_glob != NULL); - h_env->target = h_glob; - DUK_HOBJECT_INCREF(thr, h_glob); - DUK_ASSERT(h_env->has_this == 0); - - /* [ ... new_glob ] */ - - h_prev_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - thr->builtins[DUK_BIDX_GLOBAL_ENV] = (duk_hobject *) h_env; - DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_env); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_env); /* side effects */ - DUK_UNREF(h_env); /* without refcounts */ - DUK_UNREF(h_prev_env); - - /* [ ... new_glob ] */ - - duk_pop(thr); - - /* [ ... ] */ -} -#line 1 "duk_api_inspect.c" -/* - * Inspection - */ - -/* #include duk_internal.h -> already included */ - -/* For footprint efficient multiple value setting: arrays are much better than - * varargs, format string with parsing is often better than string pointer arrays. - */ -DUK_LOCAL void duk__inspect_multiple_uint(duk_hthread *thr, const char *fmt, duk_int_t *vals) { - duk_int_t val; - const char *p; - const char *p_curr; - duk_size_t len; - - for (p = fmt;;) { - len = DUK_STRLEN(p); - p_curr = p; - p += len + 1; - if (len == 0) { - /* Double NUL (= empty key) terminates. */ - break; - } - val = *vals++; - if (val >= 0) { - /* Negative values are markers to skip key. */ - duk_push_string(thr, p_curr); - duk_push_int(thr, val); - duk_put_prop(thr, -3); - } - } -} - -/* Raw helper to extract internal information / statistics about a value. - * The return value is an object with properties that are version specific. - * The properties must not expose anything that would lead to security - * issues (e.g. exposing compiled function 'data' buffer might be an issue). - * Currently only counts and sizes and such are given so there shouldn't - * be security implications. - */ - -#define DUK__IDX_TYPE 0 -#define DUK__IDX_ITAG 1 -#define DUK__IDX_REFC 2 -#define DUK__IDX_HBYTES 3 -#define DUK__IDX_CLASS 4 -#define DUK__IDX_PBYTES 5 -#define DUK__IDX_ESIZE 6 -#define DUK__IDX_ENEXT 7 -#define DUK__IDX_ASIZE 8 -#define DUK__IDX_HSIZE 9 -#define DUK__IDX_BCBYTES 10 -#define DUK__IDX_DBYTES 11 -#define DUK__IDX_TSTATE 12 -#define DUK__IDX_VARIANT 13 - -DUK_EXTERNAL void duk_inspect_value(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_heaphdr *h; - /* The temporary values should be in an array rather than individual - * variables which (in practice) ensures that the compiler won't map - * them to registers and emit a lot of unnecessary shuffling code. - */ - duk_int_t vals[14]; - - DUK_ASSERT_API_ENTRY(thr); - - /* Assume two's complement and set everything to -1. */ - DUK_MEMSET((void *) &vals, (int) 0xff, sizeof(vals)); - DUK_ASSERT(vals[DUK__IDX_TYPE] == -1); /* spot check one */ - - tv = duk_get_tval_or_unused(thr, idx); - h = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL); - - vals[DUK__IDX_TYPE] = duk_get_type_tval(tv); - vals[DUK__IDX_ITAG] = (duk_int_t) DUK_TVAL_GET_TAG(tv); - - duk_push_bare_object(thr); /* Invalidates 'tv'. */ - tv = NULL; - - if (h == NULL) { - goto finish; - } - duk_push_pointer(thr, (void *) h); - duk_put_prop_string(thr, -2, "hptr"); - -#if 0 - /* Covers a lot of information, e.g. buffer and string variants. */ - duk_push_uint(thr, (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h)); - duk_put_prop_string(thr, -2, "hflags"); -#endif - -#if defined(DUK_USE_REFERENCE_COUNTING) - vals[DUK__IDX_REFC] = (duk_int_t) DUK_HEAPHDR_GET_REFCOUNT(h); -#endif - vals[DUK__IDX_VARIANT] = 0; - - /* Heaphdr size and additional allocation size, followed by - * type specific stuff (with varying value count). - */ - switch ((duk_small_int_t) DUK_HEAPHDR_GET_TYPE(h)) { - case DUK_HTYPE_STRING: { - duk_hstring *h_str = (duk_hstring *) h; - vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hstring) + DUK_HSTRING_GET_BYTELEN(h_str) + 1); -#if defined(DUK_USE_HSTRING_EXTDATA) - if (DUK_HSTRING_HAS_EXTDATA(h_str)) { - vals[DUK__IDX_VARIANT] = 1; - } -#endif - break; - } - case DUK_HTYPE_OBJECT: { - duk_hobject *h_obj = (duk_hobject *) h; - - /* XXX: variants here are maybe pointless; class is enough? */ - if (DUK_HOBJECT_IS_ARRAY(h_obj)) { - vals[DUK__IDX_HBYTES] = sizeof(duk_harray); - } else if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { - vals[DUK__IDX_HBYTES] = sizeof(duk_hcompfunc); - } else if (DUK_HOBJECT_IS_NATFUNC(h_obj)) { - vals[DUK__IDX_HBYTES] = sizeof(duk_hnatfunc); - } else if (DUK_HOBJECT_IS_THREAD(h_obj)) { - vals[DUK__IDX_HBYTES] = sizeof(duk_hthread); - vals[DUK__IDX_TSTATE] = ((duk_hthread *) h_obj)->state; -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { - vals[DUK__IDX_HBYTES] = sizeof(duk_hbufobj); - /* XXX: some size information */ -#endif - } else { - vals[DUK__IDX_HBYTES] = (duk_small_uint_t) sizeof(duk_hobject); - } - - vals[DUK__IDX_CLASS] = (duk_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h_obj); - vals[DUK__IDX_PBYTES] = (duk_int_t) DUK_HOBJECT_P_ALLOC_SIZE(h_obj), - vals[DUK__IDX_ESIZE] = (duk_int_t) DUK_HOBJECT_GET_ESIZE(h_obj); - vals[DUK__IDX_ENEXT] = (duk_int_t) DUK_HOBJECT_GET_ENEXT(h_obj); - vals[DUK__IDX_ASIZE] = (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj); - vals[DUK__IDX_HSIZE] = (duk_int_t) DUK_HOBJECT_GET_HSIZE(h_obj); - - /* Note: e_next indicates the number of gc-reachable entries - * in the entry part, and also indicates the index where the - * next new property would be inserted. It does *not* indicate - * the number of non-NULL keys present in the object. That - * value could be counted separately but requires a pass through - * the key list. - */ - - if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { - duk_hbuffer *h_data = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, (duk_hcompfunc *) h_obj); - vals[DUK__IDX_BCBYTES] = (duk_int_t) (h_data ? DUK_HBUFFER_GET_SIZE(h_data) : 0); - } - break; - } - case DUK_HTYPE_BUFFER: { - duk_hbuffer *h_buf = (duk_hbuffer *) h; - - if (DUK_HBUFFER_HAS_DYNAMIC(h_buf)) { - if (DUK_HBUFFER_HAS_EXTERNAL(h_buf)) { - vals[DUK__IDX_VARIANT] = 2; /* buffer variant 2: external */ - vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_external)); - } else { - /* When alloc_size == 0 the second allocation may not - * actually exist. - */ - vals[DUK__IDX_VARIANT] = 1; /* buffer variant 1: dynamic */ - vals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_dynamic)); - } - vals[DUK__IDX_DBYTES] = (duk_int_t) (DUK_HBUFFER_GET_SIZE(h_buf)); - } else { - DUK_ASSERT(vals[DUK__IDX_VARIANT] == 0); /* buffer variant 0: fixed */ - vals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hbuffer_fixed) + DUK_HBUFFER_GET_SIZE(h_buf)); - } - break; - } - } - - finish: - duk__inspect_multiple_uint(thr, - "type" "\x00" "itag" "\x00" "refc" "\x00" "hbytes" "\x00" "class" "\x00" - "pbytes" "\x00" "esize" "\x00" "enext" "\x00" "asize" "\x00" "hsize" "\x00" - "bcbytes" "\x00" "dbytes" "\x00" "tstate" "\x00" "variant" "\x00" "\x00", - (duk_int_t *) &vals); -} - -DUK_EXTERNAL void duk_inspect_callstack_entry(duk_hthread *thr, duk_int_t level) { - duk_activation *act; - duk_uint_fast32_t pc; - duk_uint_fast32_t line; - - DUK_ASSERT_API_ENTRY(thr); - - /* -1 = top callstack entry - * -2 = caller of level -1 - * etc - */ - act = duk_hthread_get_activation_for_level(thr, level); - if (act == NULL) { - duk_push_undefined(thr); - return; - } - duk_push_bare_object(thr); - - /* Relevant PC is just before current one because PC is - * post-incremented. This should match what error augment - * code does. - */ - pc = duk_hthread_get_act_prev_pc(thr, act); - - duk_push_tval(thr, &act->tv_func); - - duk_push_uint(thr, (duk_uint_t) pc); - duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_PC); - -#if defined(DUK_USE_PC2LINE) - line = duk_hobject_pc2line_query(thr, -1, pc); -#else - line = 0; -#endif - duk_push_uint(thr, (duk_uint_t) line); - duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_LINE_NUMBER); - - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_LC_FUNCTION); - /* Providing access to e.g. act->lex_env would be dangerous: these - * internal structures must never be accessible to the application. - * Duktape relies on them having consistent data, and this consistency - * is only asserted for, not checked for. - */ -} - -/* automatic undefs */ -#undef DUK__IDX_ASIZE -#undef DUK__IDX_BCBYTES -#undef DUK__IDX_CLASS -#undef DUK__IDX_DBYTES -#undef DUK__IDX_ENEXT -#undef DUK__IDX_ESIZE -#undef DUK__IDX_HBYTES -#undef DUK__IDX_HSIZE -#undef DUK__IDX_ITAG -#undef DUK__IDX_PBYTES -#undef DUK__IDX_REFC -#undef DUK__IDX_TSTATE -#undef DUK__IDX_TYPE -#undef DUK__IDX_VARIANT -#line 1 "duk_api_memory.c" -/* - * Memory calls. - */ - -/* #include duk_internal.h -> already included */ - -DUK_EXTERNAL void *duk_alloc_raw(duk_hthread *thr, duk_size_t size) { - DUK_ASSERT_API_ENTRY(thr); - - return DUK_ALLOC_RAW(thr->heap, size); -} - -DUK_EXTERNAL void duk_free_raw(duk_hthread *thr, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_FREE_RAW(thr->heap, ptr); -} - -DUK_EXTERNAL void *duk_realloc_raw(duk_hthread *thr, void *ptr, duk_size_t size) { - DUK_ASSERT_API_ENTRY(thr); - - return DUK_REALLOC_RAW(thr->heap, ptr, size); -} - -DUK_EXTERNAL void *duk_alloc(duk_hthread *thr, duk_size_t size) { - DUK_ASSERT_API_ENTRY(thr); - - return DUK_ALLOC(thr->heap, size); -} - -DUK_EXTERNAL void duk_free(duk_hthread *thr, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_FREE_CHECKED(thr, ptr); -} - -DUK_EXTERNAL void *duk_realloc(duk_hthread *thr, void *ptr, duk_size_t size) { - DUK_ASSERT_API_ENTRY(thr); - - /* - * Note: since this is an exposed API call, there should be - * no way a mark-and-sweep could have a side effect on the - * memory allocation behind 'ptr'; the pointer should never - * be something that Duktape wants to change. - * - * Thus, no need to use DUK_REALLOC_INDIRECT (and we don't - * have the storage location here anyway). - */ - - return DUK_REALLOC(thr->heap, ptr, size); -} - -DUK_EXTERNAL void duk_get_memory_functions(duk_hthread *thr, duk_memory_functions *out_funcs) { - duk_heap *heap; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(out_funcs != NULL); - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - - heap = thr->heap; - out_funcs->alloc_func = heap->alloc_func; - out_funcs->realloc_func = heap->realloc_func; - out_funcs->free_func = heap->free_func; - out_funcs->udata = heap->heap_udata; -} - -DUK_EXTERNAL void duk_gc(duk_hthread *thr, duk_uint_t flags) { - duk_heap *heap; - duk_small_uint_t ms_flags; - - DUK_ASSERT_API_ENTRY(thr); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - DUK_D(DUK_DPRINT("mark-and-sweep requested by application")); - DUK_ASSERT(DUK_GC_COMPACT == DUK_MS_FLAG_EMERGENCY); /* Compact flag is 1:1 with emergency flag which forces compaction. */ - ms_flags = (duk_small_uint_t) flags; - duk_heap_mark_and_sweep(heap, ms_flags); -} -#line 1 "duk_api_object.c" -/* - * Object handling: property access and other support functions. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Property handling - * - * The API exposes only the most common property handling functions. - * The caller can invoke Ecmascript built-ins for full control (e.g. - * defineProperty, getOwnPropertyDescriptor). - */ - -DUK_EXTERNAL duk_bool_t duk_get_prop(duk_hthread *thr, duk_idx_t obj_idx) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* Note: copying tv_obj and tv_key to locals to shield against a valstack - * resize is not necessary for a property get right now. - */ - - tv_obj = duk_require_tval(thr, obj_idx); - tv_key = duk_require_tval(thr, -1); - - rc = duk_hobject_getprop(thr, tv_obj, tv_key); - DUK_ASSERT(rc == 0 || rc == 1); - /* a value is left on stack regardless of rc */ - - duk_remove_m2(thr); /* remove key */ - DUK_ASSERT(duk_is_undefined(thr, -1) || rc == 1); - return rc; /* 1 if property found, 0 otherwise */ -} - -DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_string(thr, key); - return duk_get_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_get_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_lstring(thr, key, key_len); - return duk_get_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_get_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_uarridx(thr, arr_idx); - return duk_get_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_get_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ - return duk_get_prop(thr, obj_idx); -} - -DUK_INTERNAL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); - return duk_get_prop(thr, obj_idx); -} - -DUK_INTERNAL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { - return duk_get_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), - (duk_small_uint_t) (packed_args & 0xffffUL)); -} - -DUK_INTERNAL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop) { - duk_bool_t rc; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - rc = duk_get_prop_stridx(thr, obj_idx, stridx); - if (out_has_prop) { - *out_has_prop = rc; - } - rc = duk_to_boolean(thr, -1); - DUK_ASSERT(rc == 0 || rc == 1); - duk_pop(thr); - return rc; -} - -DUK_LOCAL duk_bool_t duk__put_prop_shared(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t idx_key) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_tval *tv_val; - duk_bool_t throw_flag; - duk_bool_t rc; - - /* Note: copying tv_obj and tv_key to locals to shield against a valstack - * resize is not necessary for a property put right now (putprop protects - * against it internally). - */ - - /* Key and value indices are either (-2, -1) or (-1, -2). Given idx_key, - * idx_val is always (idx_key ^ 0x01). - */ - DUK_ASSERT((idx_key == -2 && (idx_key ^ 1) == -1) || - (idx_key == -1 && (idx_key ^ 1) == -2)); - /* XXX: Direct access; faster validation. */ - tv_obj = duk_require_tval(thr, obj_idx); - tv_key = duk_require_tval(thr, idx_key); - tv_val = duk_require_tval(thr, idx_key ^ 1); - throw_flag = duk_is_strict_call(thr); - - rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, throw_flag); - DUK_ASSERT(rc == 0 || rc == 1); - - duk_pop_2(thr); /* remove key and value */ - return rc; /* 1 if property found, 0 otherwise */ -} - -DUK_EXTERNAL duk_bool_t duk_put_prop(duk_hthread *thr, duk_idx_t obj_idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__put_prop_shared(thr, obj_idx, -2); -} - -DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - /* Careful here and with other duk_put_prop_xxx() helpers: the - * target object and the property value may be in the same value - * stack slot (unusual, but still conceptually clear). - */ - obj_idx = duk_normalize_index(thr, obj_idx); - (void) duk_push_string(thr, key); - return duk__put_prop_shared(thr, obj_idx, -1); -} - -DUK_EXTERNAL duk_bool_t duk_put_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_normalize_index(thr, obj_idx); - (void) duk_push_lstring(thr, key, key_len); - return duk__put_prop_shared(thr, obj_idx, -1); -} - -DUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_uarridx(thr, arr_idx); - return duk__put_prop_shared(thr, obj_idx, -1); -} - -DUK_EXTERNAL duk_bool_t duk_put_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ - return duk__put_prop_shared(thr, obj_idx, -1); -} - - -DUK_INTERNAL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); - return duk__put_prop_shared(thr, obj_idx, -1); -} - -DUK_INTERNAL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { - return duk_put_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), - (duk_small_uint_t) (packed_args & 0xffffUL)); -} - -DUK_EXTERNAL duk_bool_t duk_del_prop(duk_hthread *thr, duk_idx_t obj_idx) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t throw_flag; - duk_bool_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* Note: copying tv_obj and tv_key to locals to shield against a valstack - * resize is not necessary for a property delete right now. - */ - - tv_obj = duk_require_tval(thr, obj_idx); - tv_key = duk_require_tval(thr, -1); - throw_flag = duk_is_strict_call(thr); - - rc = duk_hobject_delprop(thr, tv_obj, tv_key, throw_flag); - DUK_ASSERT(rc == 0 || rc == 1); - - duk_pop(thr); /* remove key */ - return rc; -} - -DUK_EXTERNAL duk_bool_t duk_del_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_string(thr, key); - return duk_del_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_del_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_lstring(thr, key, key_len); - return duk_del_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_del_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_uarridx(thr, arr_idx); - return duk_del_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_del_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ - return duk_del_prop(thr, obj_idx); -} - -DUK_INTERNAL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); - return duk_del_prop(thr, obj_idx); -} - -#if 0 -DUK_INTERNAL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { - return duk_del_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), - (duk_small_uint_t) (packed_args & 0xffffUL)); -} -#endif - -DUK_EXTERNAL duk_bool_t duk_has_prop(duk_hthread *thr, duk_idx_t obj_idx) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t rc; - - DUK_ASSERT_API_ENTRY(thr); - - /* Note: copying tv_obj and tv_key to locals to shield against a valstack - * resize is not necessary for a property existence check right now. - */ - - tv_obj = duk_require_tval(thr, obj_idx); - tv_key = duk_require_tval(thr, -1); - - rc = duk_hobject_hasprop(thr, tv_obj, tv_key); - DUK_ASSERT(rc == 0 || rc == 1); - - duk_pop(thr); /* remove key */ - return rc; /* 1 if property found, 0 otherwise */ -} - -DUK_EXTERNAL duk_bool_t duk_has_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_string(thr, key); - return duk_has_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_has_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(key != NULL); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_lstring(thr, key, key_len); - return duk_has_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_has_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_uarridx(thr, arr_idx); - return duk_has_prop(thr, obj_idx); -} - -DUK_EXTERNAL duk_bool_t duk_has_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_heapptr(thr, ptr); /* NULL -> 'undefined' */ - return duk_has_prop(thr, obj_idx); -} - -DUK_INTERNAL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); - return duk_has_prop(thr, obj_idx); -} - -#if 0 -DUK_INTERNAL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { - return duk_has_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16), - (duk_small_uint_t) (packed_args & 0xffffUL)); -} -#endif - -/* Define own property without inheritance lookups and such. This differs from - * [[DefineOwnProperty]] because special behaviors (like Array 'length') are - * not invoked by this method. The caller must be careful to invoke any such - * behaviors if necessary. - */ -DUK_INTERNAL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags) { - duk_hobject *obj; - duk_hstring *key; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_require_hobject(thr, obj_idx); - DUK_ASSERT(obj != NULL); - key = duk_to_property_key_hstring(thr, -2); - DUK_ASSERT(key != NULL); - DUK_ASSERT(duk_require_tval(thr, -1) != NULL); - - duk_hobject_define_property_internal(thr, obj, key, desc_flags); - - duk_pop(thr); /* pop key */ -} - -DUK_INTERNAL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags) { - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_require_hobject(thr, obj_idx); - DUK_ASSERT(obj != NULL); - - duk_hobject_define_property_internal_arridx(thr, obj, arr_idx, desc_flags); - /* value popped by call */ -} - -DUK_INTERNAL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags) { - duk_hobject *obj; - duk_hstring *key; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - - obj = duk_require_hobject(thr, obj_idx); - DUK_ASSERT(obj != NULL); - key = DUK_HTHREAD_GET_STRING(thr, stridx); - DUK_ASSERT(key != NULL); - DUK_ASSERT(duk_require_tval(thr, -1) != NULL); - - duk_hobject_define_property_internal(thr, obj, key, desc_flags); - /* value popped by call */ -} - -DUK_INTERNAL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) { - duk_xdef_prop_stridx(thr, (duk_idx_t) (duk_int8_t) (packed_args >> 24), - (duk_small_uint_t) (packed_args >> 8) & 0xffffUL, - (duk_small_uint_t) (packed_args & 0xffL)); -} - -#if 0 /*unused*/ -DUK_INTERNAL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags) { - duk_hobject *obj; - duk_hstring *key; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - DUK_ASSERT_BIDX_VALID(builtin_idx); - - obj = duk_require_hobject(thr, obj_idx); - DUK_ASSERT(obj != NULL); - key = DUK_HTHREAD_GET_STRING(thr, stridx); - DUK_ASSERT(key != NULL); - - duk_push_hobject(thr, thr->builtins[builtin_idx]); - duk_hobject_define_property_internal(thr, obj, key, desc_flags); - /* value popped by call */ -} -#endif - -/* This is a rare property helper; it sets the global thrower (E5 Section 13.2.3) - * setter/getter into an object property. This is needed by the 'arguments' - * object creation code, function instance creation code, and Function.prototype.bind(). - */ - -DUK_INTERNAL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - duk_push_hstring_stridx(thr, stridx); - duk_push_hobject_bidx(thr, DUK_BIDX_TYPE_ERROR_THROWER); - duk_dup_top(thr); - duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_SETTER | DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_FORCE); /* attributes always 0 */ -} - -/* Object.getOwnPropertyDescriptor() equivalent C binding. */ -DUK_EXTERNAL void duk_get_prop_desc(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(flags); /* no flags defined yet */ - - duk_hobject_object_get_own_property_descriptor(thr, obj_idx); /* [ ... key ] -> [ ... desc ] */ -} - -/* Object.defineProperty() equivalent C binding. */ -DUK_EXTERNAL void duk_def_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) { - duk_idx_t idx_base; - duk_hobject *obj; - duk_hstring *key; - duk_idx_t idx_value; - duk_hobject *get; - duk_hobject *set; - duk_uint_t is_data_desc; - duk_uint_t is_acc_desc; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_require_hobject(thr, obj_idx); - - is_data_desc = flags & (DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE); - is_acc_desc = flags & (DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER); - if (is_data_desc && is_acc_desc) { - /* "Have" flags must not be conflicting so that they would - * apply to both a plain property and an accessor at the same - * time. - */ - goto fail_invalid_desc; - } - - idx_base = duk_get_top_index(thr); - if (flags & DUK_DEFPROP_HAVE_SETTER) { - duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_LIGHTFUNC); - set = duk_get_hobject_promote_lfunc(thr, idx_base); - if (set != NULL && !DUK_HOBJECT_IS_CALLABLE(set)) { - goto fail_not_callable; - } - idx_base--; - } else { - set = NULL; - } - if (flags & DUK_DEFPROP_HAVE_GETTER) { - duk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_LIGHTFUNC); - get = duk_get_hobject_promote_lfunc(thr, idx_base); - if (get != NULL && !DUK_HOBJECT_IS_CALLABLE(get)) { - goto fail_not_callable; - } - idx_base--; - } else { - get = NULL; - } - if (flags & DUK_DEFPROP_HAVE_VALUE) { - idx_value = idx_base; - idx_base--; - } else { - idx_value = (duk_idx_t) -1; - } - key = duk_to_property_key_hstring(thr, idx_base); - DUK_ASSERT(key != NULL); - - duk_require_valid_index(thr, idx_base); - - duk_hobject_define_property_helper(thr, - flags /*defprop_flags*/, - obj, - key, - idx_value, - get, - set, - 1 /*throw_flag*/); - - /* Clean up stack */ - - duk_set_top(thr, idx_base); - - /* [ ... obj ... ] */ - - return; - - fail_invalid_desc: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR); - return; - - fail_not_callable: - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE); - return; -} - -/* - * Object related - * - * Note: seal() and freeze() are accessible through Ecmascript bindings, - * and are not exposed through the API. - */ - -DUK_EXTERNAL void duk_compact(duk_hthread *thr, duk_idx_t obj_idx) { - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_get_hobject(thr, obj_idx); - if (obj) { - /* Note: this may fail, caller should protect the call if necessary */ - duk_hobject_compact_props(thr, obj); - } -} - -DUK_INTERNAL void duk_compact_m1(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk_compact(thr, -1); -} - -/* XXX: the duk_hobject_enum.c stack APIs should be reworked */ - -DUK_EXTERNAL void duk_enum(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t enum_flags) { - DUK_ASSERT_API_ENTRY(thr); - - duk_dup(thr, obj_idx); - duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - duk_hobject_enumerator_create(thr, enum_flags); /* [target] -> [enum] */ -} - -DUK_EXTERNAL duk_bool_t duk_next(duk_hthread *thr, duk_idx_t enum_index, duk_bool_t get_value) { - DUK_ASSERT_API_ENTRY(thr); - - duk_require_hobject(thr, enum_index); - duk_dup(thr, enum_index); - return duk_hobject_enumerator_next(thr, get_value); -} - -DUK_INTERNAL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze) { - duk_tval *tv; - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, obj_idx); - DUK_ASSERT(tv != NULL); - - /* Seal/freeze are quite rare in practice so it'd be nice to get the - * correct behavior simply via automatic promotion (at the cost of some - * memory churn). However, the promoted objects don't behave the same, - * e.g. promoted lightfuncs are extensible. - */ - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_BUFFER: - /* Plain buffer: already sealed, but not frozen (and can't be frozen - * because index properties can't be made non-writable. - */ - if (is_freeze) { - goto fail_cannot_freeze; - } - break; - case DUK_TAG_LIGHTFUNC: - /* Lightfunc: already sealed and frozen, success. */ - break; - case DUK_TAG_OBJECT: - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (is_freeze && DUK_HOBJECT_IS_BUFOBJ(h)) { - /* Buffer objects cannot be frozen because there's no internal - * support for making virtual array indices non-writable. - */ - DUK_DD(DUK_DDPRINT("cannot freeze a buffer object")); - goto fail_cannot_freeze; - } - duk_hobject_object_seal_freeze_helper(thr, h, is_freeze); - - /* Sealed and frozen objects cannot gain any more properties, - * so this is a good time to compact them. - */ - duk_hobject_compact_props(thr, h); - break; - default: - /* ES2015 Sections 19.1.2.5, 19.1.2.17 */ - break; - } - return; - - fail_cannot_freeze: - DUK_ERROR_TYPE_INVALID_ARGS(thr); /* XXX: proper error message */ -} - -DUK_EXTERNAL void duk_seal(duk_hthread *thr, duk_idx_t obj_idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_seal_freeze_raw(thr, obj_idx, 0 /*is_freeze*/); -} - -DUK_EXTERNAL void duk_freeze(duk_hthread *thr, duk_idx_t obj_idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_seal_freeze_raw(thr, obj_idx, 1 /*is_freeze*/); -} - -/* - * Helpers for writing multiple properties - */ - -DUK_EXTERNAL void duk_put_function_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_function_list_entry *funcs) { - const duk_function_list_entry *ent = funcs; - - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - if (ent != NULL) { - while (ent->key != NULL) { - duk_push_c_function(thr, ent->value, ent->nargs); - duk_put_prop_string(thr, obj_idx, ent->key); - ent++; - } - } -} - -DUK_EXTERNAL void duk_put_number_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_number_list_entry *numbers) { - const duk_number_list_entry *ent = numbers; - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - obj_idx = duk_require_normalize_index(thr, obj_idx); - if (ent != NULL) { - while (ent->key != NULL) { - tv = thr->valstack_top++; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); /* value stack init policy */ - DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv, ent->value); /* no need for decref/incref */ - duk_put_prop_string(thr, obj_idx, ent->key); - ent++; - } - } -} - -/* - * Shortcut for accessing global object properties - */ - -DUK_EXTERNAL duk_bool_t duk_get_global_string(duk_hthread *thr, const char *key) { - duk_bool_t ret; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - - /* XXX: direct implementation */ - - duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); - ret = duk_get_prop_string(thr, -1, key); - duk_remove_m2(thr); - return ret; -} - -DUK_EXTERNAL duk_bool_t duk_get_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) { - duk_bool_t ret; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - - /* XXX: direct implementation */ - - duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); - ret = duk_get_prop_lstring(thr, -1, key, key_len); - duk_remove_m2(thr); - return ret; -} - -DUK_EXTERNAL duk_bool_t duk_put_global_string(duk_hthread *thr, const char *key) { - duk_bool_t ret; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - - /* XXX: direct implementation */ - - duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); - duk_insert(thr, -2); - ret = duk_put_prop_string(thr, -2, key); /* [ ... global val ] -> [ ... global ] */ - duk_pop(thr); - return ret; -} - -DUK_EXTERNAL duk_bool_t duk_put_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) { - duk_bool_t ret; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - - /* XXX: direct implementation */ - - duk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]); - duk_insert(thr, -2); - ret = duk_put_prop_lstring(thr, -2, key, key_len); /* [ ... global val ] -> [ ... global ] */ - duk_pop(thr); - return ret; -} - -/* - * Object prototype - */ - -DUK_EXTERNAL void duk_get_prototype(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *obj; - duk_hobject *proto; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_require_hobject(thr, idx); - DUK_ASSERT(obj != NULL); - - /* XXX: shared helper for duk_push_hobject_or_undefined()? */ - proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj); - if (proto) { - duk_push_hobject(thr, proto); - } else { - duk_push_undefined(thr); - } -} - -DUK_EXTERNAL void duk_set_prototype(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *obj; - duk_hobject *proto; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_require_hobject(thr, idx); - DUK_ASSERT(obj != NULL); - duk_require_type_mask(thr, -1, DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_OBJECT); - proto = duk_get_hobject(thr, -1); - /* proto can also be NULL here (allowed explicitly) */ - -#if defined(DUK_USE_ROM_OBJECTS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); /* XXX: "read only object"? */ - return; - } -#endif - - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, obj, proto); - - duk_pop(thr); -} - -/* - * Object finalizer - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -/* XXX: these could be implemented as macros calling an internal function - * directly. - * XXX: same issue as with Duktape.fin: there's no way to delete the property - * now (just set it to undefined). - */ -DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_get_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER); -} - -DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - duk_bool_t callable; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_require_hobject(thr, idx); /* Get before 'put' so that 'idx' is correct. */ - callable = duk_is_callable(thr, -1); - duk_put_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER); - - /* In addition to setting the finalizer property, keep a "have - * finalizer" flag in duk_hobject in sync so that refzero can do - * a very quick finalizer check by walking the prototype chain - * and checking the flag alone. (Note that this means that just - * setting _Finalizer on an object won't affect finalizer checks.) - * - * NOTE: if the argument is a Proxy object, this flag will be set - * on the Proxy, not the target. As a result, the target won't get - * a finalizer flag and the Proxy also won't be finalized as there's - * an explicit Proxy check in finalization now. - */ - if (callable) { - DUK_HOBJECT_SET_HAVE_FINALIZER(h); - } else { - DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h); - } -} -#else /* DUK_USE_FINALIZER_SUPPORT */ -DUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(idx); - DUK_ERROR_UNSUPPORTED(thr); -} - -DUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(idx); - DUK_ERROR_UNSUPPORTED(thr); -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ -#line 1 "duk_api_stack.c" -/* - * API calls related to general value stack manipulation: resizing the value - * stack, pushing and popping values, type checking and reading values, - * coercing values, etc. - * - * Also contains internal functions (such as duk_get_tval()), defined - * in duk_api_internal.h, with semantics similar to the public API. - */ - -/* XXX: repetition of stack pre-checks -> helper or macro or inline */ -/* XXX: shared api error strings, and perhaps even throw code for rare cases? */ - -/* #include duk_internal.h -> already included */ - -/* - * Forward declarations - */ - -DUK_LOCAL_DECL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx); - -/* - * Global state for working around missing variadic macros - */ - -#if !defined(DUK_USE_VARIADIC_MACROS) -DUK_EXTERNAL const char *duk_api_global_filename = NULL; -DUK_EXTERNAL duk_int_t duk_api_global_line = 0; -#endif - -/* - * Misc helpers - */ - -DUK_LOCAL const char * const duk__symbol_type_strings[4] = { - "hidden", "global", "local", "wellknown" -}; - -#if !defined(DUK_USE_PACKED_TVAL) -DUK_LOCAL const duk_uint_t duk__type_from_tag[] = { - DUK_TYPE_NUMBER, - DUK_TYPE_NUMBER, /* fastint */ - DUK_TYPE_UNDEFINED, - DUK_TYPE_NULL, - DUK_TYPE_BOOLEAN, - DUK_TYPE_POINTER, - DUK_TYPE_LIGHTFUNC, - DUK_TYPE_NONE, - DUK_TYPE_STRING, - DUK_TYPE_OBJECT, - DUK_TYPE_BUFFER, -}; -DUK_LOCAL const duk_uint_t duk__type_mask_from_tag[] = { - DUK_TYPE_MASK_NUMBER, - DUK_TYPE_MASK_NUMBER, /* fastint */ - DUK_TYPE_MASK_UNDEFINED, - DUK_TYPE_MASK_NULL, - DUK_TYPE_MASK_BOOLEAN, - DUK_TYPE_MASK_POINTER, - DUK_TYPE_MASK_LIGHTFUNC, - DUK_TYPE_MASK_NONE, - DUK_TYPE_MASK_STRING, - DUK_TYPE_MASK_OBJECT, - DUK_TYPE_MASK_BUFFER, -}; -#endif /* !DUK_USE_PACKED_TVAL */ - -/* Assert that there's room for one value. */ -#define DUK__ASSERT_SPACE() do { \ - DUK_ASSERT(!(thr->valstack_top >= thr->valstack_end)); \ - } while (0) - -/* Check that there's room to push one value. */ -#if defined(DUK_USE_VALSTACK_UNSAFE) -/* Faster but value stack overruns are memory unsafe. */ -#define DUK__CHECK_SPACE() DUK__ASSERT_SPACE() -#else -#define DUK__CHECK_SPACE() do { \ - if (DUK_UNLIKELY(thr->valstack_top >= thr->valstack_end)) { \ - DUK_ERROR_RANGE_PUSH_BEYOND(thr); \ - } \ - } while (0) -#endif - -DUK_LOCAL duk_small_uint_t duk__get_symbol_type(duk_hstring *h) { - const duk_uint8_t *data; - duk_size_t len; - - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HSTRING_HAS_SYMBOL(h)); - DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(h) >= 1); /* always true, symbol prefix */ - - data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - len = DUK_HSTRING_GET_BYTELEN(h); - DUK_ASSERT(len >= 1); - - /* XXX: differentiate between 0x82 and 0xff (hidden vs. internal?)? */ - - if (data[0] == 0xffU) { - return DUK_SYMBOL_TYPE_HIDDEN; - } else if (data[0] == 0x82U) { - return DUK_SYMBOL_TYPE_HIDDEN; - } else if (data[0] == 0x80U) { - return DUK_SYMBOL_TYPE_GLOBAL; - } else if (data[len - 1] != 0xffU) { - return DUK_SYMBOL_TYPE_LOCAL; - } else { - return DUK_SYMBOL_TYPE_WELLKNOWN; - } -} - -DUK_LOCAL const char *duk__get_symbol_type_string(duk_hstring *h) { - duk_small_uint_t idx; - idx = duk__get_symbol_type(h); - DUK_ASSERT(idx < sizeof(duk__symbol_type_strings)); - return duk__symbol_type_strings[idx]; -} - -DUK_LOCAL_DECL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag); - -DUK_LOCAL duk_int_t duk__api_coerce_d2i(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value, duk_bool_t require) { - duk_tval *tv; - duk_small_int_t c; - duk_double_t d; - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - /* - * Special cases like NaN and +/- Infinity are handled explicitly - * because a plain C coercion from double to int handles these cases - * in undesirable ways. For instance, NaN may coerce to INT_MIN - * (not zero), and INT_MAX + 1 may coerce to INT_MIN (not INT_MAX). - * - * This double-to-int coercion differs from ToInteger() because it - * has a finite range (ToInteger() allows e.g. +/- Infinity). It - * also differs from ToInt32() because the INT_MIN/INT_MAX clamping - * depends on the size of the int type on the platform. In particular, - * on platforms with a 64-bit int type, the full range is allowed. - */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); -#if (DUK_INT_MAX <= 0x7fffffffL) - /* Clamping only necessary for 32-bit ints. */ - if (t < DUK_INT_MIN) { - t = DUK_INT_MIN; - } else if (t > DUK_INT_MAX) { - t = DUK_INT_MAX; - } -#endif - return (duk_int_t) t; - } -#endif - - if (DUK_TVAL_IS_NUMBER(tv)) { - d = DUK_TVAL_GET_NUMBER(tv); - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - if (c == DUK_FP_NAN) { - return 0; - } else if (d < (duk_double_t) DUK_INT_MIN) { - /* covers -Infinity */ - return DUK_INT_MIN; - } else if (d > (duk_double_t) DUK_INT_MAX) { - /* covers +Infinity */ - return DUK_INT_MAX; - } else { - /* coerce towards zero */ - return (duk_int_t) d; - } - } - - if (require) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); - /* not reachable */ - } - - return def_value; -} - -DUK_LOCAL duk_uint_t duk__api_coerce_d2ui(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value, duk_bool_t require) { - duk_tval *tv; - duk_small_int_t c; - duk_double_t d; - - /* Same as above but for unsigned int range. */ - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); - if (t < 0) { - t = 0; - } -#if (DUK_UINT_MAX <= 0xffffffffUL) - /* Clamping only necessary for 32-bit ints. */ - else if (t > DUK_UINT_MAX) { - t = DUK_UINT_MAX; - } -#endif - return (duk_uint_t) t; - } -#endif - - if (DUK_TVAL_IS_NUMBER(tv)) { - d = DUK_TVAL_GET_NUMBER(tv); - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - if (c == DUK_FP_NAN) { - return 0; - } else if (d < 0.0) { - /* covers -Infinity */ - return (duk_uint_t) 0; - } else if (d > (duk_double_t) DUK_UINT_MAX) { - /* covers +Infinity */ - return (duk_uint_t) DUK_UINT_MAX; - } else { - /* coerce towards zero */ - return (duk_uint_t) d; - } - } - - if (require) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); - /* not reachable */ - } - - return def_value; -} - -/* - * Stack index validation/normalization and getting a stack duk_tval ptr. - * - * These are called by many API entrypoints so the implementations must be - * fast and "inlined". - * - * There's some repetition because of this; keep the functions in sync. - */ - -DUK_EXTERNAL duk_idx_t duk_normalize_index(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t vs_size; - duk_uidx_t uidx; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - /* Care must be taken to avoid pointer wrapping in the index - * validation. For instance, on a 32-bit platform with 8-byte - * duk_tval the index 0x20000000UL would wrap the memory space - * once. - */ - - /* Assume value stack sizes (in elements) fits into duk_idx_t. */ - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ - - if (idx < 0) { - uidx = vs_size + (duk_uidx_t) idx; - } else { - /* since index non-negative */ - DUK_ASSERT(idx != DUK_INVALID_INDEX); - uidx = (duk_uidx_t) idx; - } - - /* DUK_INVALID_INDEX won't be accepted as a valid index. */ - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); - - if (DUK_LIKELY(uidx < vs_size)) { - return (duk_idx_t) uidx; - } - return DUK_INVALID_INDEX; -} - -DUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t vs_size; - duk_uidx_t uidx; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ - - if (idx < 0) { - uidx = vs_size + (duk_uidx_t) idx; - } else { - DUK_ASSERT(idx != DUK_INVALID_INDEX); - uidx = (duk_uidx_t) idx; - } - - /* DUK_INVALID_INDEX won't be accepted as a valid index. */ - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); - - if (DUK_LIKELY(uidx < vs_size)) { - return (duk_idx_t) uidx; - } - DUK_ERROR_RANGE_INDEX(thr, idx); - return 0; /* unreachable */ -} - -DUK_INTERNAL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t vs_size; - duk_uidx_t uidx; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ - - if (idx < 0) { - uidx = vs_size + (duk_uidx_t) idx; - } else { - DUK_ASSERT(idx != DUK_INVALID_INDEX); - uidx = (duk_uidx_t) idx; - } - - /* DUK_INVALID_INDEX won't be accepted as a valid index. */ - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); - - if (DUK_LIKELY(uidx < vs_size)) { - return thr->valstack_bottom + uidx; - } - return NULL; -} - -/* Variant of duk_get_tval() which is guaranteed to return a valid duk_tval - * pointer. When duk_get_tval() would return NULL, this variant returns a - * pointer to a duk_tval with tag DUK_TAG_UNUSED. This allows the call site - * to avoid an unnecessary NULL check which sometimes leads to better code. - * The return duk_tval is read only (at least for the UNUSED value). - */ -DUK_LOCAL const duk_tval_unused duk__const_tval_unused = DUK_TVAL_UNUSED_INITIALIZER(); - -DUK_INTERNAL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval(thr, idx); - if (tv != NULL) { - return tv; - } - return (duk_tval *) DUK_LOSE_CONST(&duk__const_tval_unused); -} - -DUK_INTERNAL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t vs_size; - duk_uidx_t uidx; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT_DISABLE(vs_size >= 0); /* unsigned */ - - /* Use unsigned arithmetic to optimize comparison. */ - if (idx < 0) { - uidx = vs_size + (duk_uidx_t) idx; - } else { - DUK_ASSERT(idx != DUK_INVALID_INDEX); - uidx = (duk_uidx_t) idx; - } - - /* DUK_INVALID_INDEX won't be accepted as a valid index. */ - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); - - if (DUK_LIKELY(uidx < vs_size)) { - return thr->valstack_bottom + uidx; - } - DUK_ERROR_RANGE_INDEX(thr, idx); - return NULL; -} - -/* Non-critical. */ -DUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - return (duk_normalize_index(thr, idx) >= 0); -} - -/* Non-critical. */ -DUK_EXTERNAL void duk_require_valid_index(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - if (DUK_UNLIKELY(duk_normalize_index(thr, idx) < 0)) { - DUK_ERROR_RANGE_INDEX(thr, idx); - return; /* unreachable */ - } -} - -/* - * Value stack top handling - */ - -DUK_EXTERNAL duk_idx_t duk_get_top(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); -} - -/* Internal helper to get current top but to require a minimum top value - * (TypeError if not met). - */ -DUK_INTERNAL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top) { - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - if (DUK_UNLIKELY(ret < min_top)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - return ret; -} - -/* Set stack top within currently allocated range, but don't reallocate. - * This is performance critical especially for call handling, so whenever - * changing, profile and look at generated code. - */ -DUK_EXTERNAL void duk_set_top(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t vs_size; - duk_uidx_t vs_limit; - duk_uidx_t uidx; - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_INVALID_INDEX < 0); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom); - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - vs_limit = (duk_uidx_t) (thr->valstack_end - thr->valstack_bottom); - - if (idx < 0) { - /* Negative indices are always within allocated stack but - * must not go below zero index. - */ - uidx = vs_size + (duk_uidx_t) idx; - } else { - /* Positive index can be higher than valstack top but must - * not go above allocated stack (equality is OK). - */ - uidx = (duk_uidx_t) idx; - } - - /* DUK_INVALID_INDEX won't be accepted as a valid index. */ - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size); - DUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_limit); - -#if defined(DUK_USE_VALSTACK_UNSAFE) - DUK_ASSERT(uidx <= vs_limit); - DUK_UNREF(vs_limit); -#else - if (DUK_UNLIKELY(uidx > vs_limit)) { - DUK_ERROR_RANGE_INDEX(thr, idx); - return; /* unreachable */ - } -#endif - DUK_ASSERT(uidx <= vs_limit); - - /* Handle change in value stack top. Respect value stack - * initialization policy: 'undefined' above top. Note that - * DECREF may cause a side effect that reallocates valstack, - * so must relookup after DECREF. - */ - - if (uidx >= vs_size) { - /* Stack size increases or stays the same. */ -#if defined(DUK_USE_ASSERTIONS) - duk_uidx_t count; - - count = uidx - vs_size; - while (count != 0) { - count--; - tv = thr->valstack_top + count; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); - } -#endif - thr->valstack_top = thr->valstack_bottom + uidx; - } else { - /* Stack size decreases. */ -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_uidx_t count; - duk_tval *tv_end; - - count = vs_size - uidx; - DUK_ASSERT(count > 0); - tv = thr->valstack_top; - tv_end = tv - count; - DUK_ASSERT(tv > tv_end); /* Because count > 0. */ - do { - tv--; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); - } while (tv != tv_end); - thr->valstack_top = tv_end; - DUK_REFZERO_CHECK_FAST(thr); -#else /* DUK_USE_REFERENCE_COUNTING */ - duk_uidx_t count; - duk_tval *tv_end; - - count = vs_size - uidx; - tv = thr->valstack_top; - tv_end = tv - count; - DUK_ASSERT(tv > tv_end); - do { - tv--; - DUK_TVAL_SET_UNDEFINED(tv); - } while (tv != tv_end); - thr->valstack_top = tv_end; -#endif /* DUK_USE_REFERENCE_COUNTING */ - } -} - -/* Internal variant with a non-negative index and no runtime size checks. */ -#if defined(DUK_USE_PREFER_SIZE) -DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_set_top(thr, idx); -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) { - duk_uidx_t uidx; - duk_uidx_t vs_size; - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_bottom); - DUK_ASSERT(idx >= 0); - DUK_ASSERT(idx <= (duk_idx_t) (thr->valstack_end - thr->valstack_bottom)); - - /* XXX: byte arithmetic */ - uidx = (duk_uidx_t) idx; - vs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom); - - if (uidx >= vs_size) { - /* Stack size increases or stays the same. */ -#if defined(DUK_USE_ASSERTIONS) - duk_uidx_t count; - - count = uidx - vs_size; - while (count != 0) { - count--; - tv = thr->valstack_top + count; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); - } -#endif - thr->valstack_top = thr->valstack_bottom + uidx; - } else { - /* Stack size decreases. */ -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_uidx_t count; - duk_tval *tv_end; - - count = vs_size - uidx; - DUK_ASSERT(count > 0); - tv = thr->valstack_top; - tv_end = tv - count; - DUK_ASSERT(tv > tv_end); /* Because count > 0. */ - do { - tv--; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); - } while (tv != tv_end); - thr->valstack_top = tv_end; - DUK_REFZERO_CHECK_FAST(thr); -#else /* DUK_USE_REFERENCE_COUNTING */ - duk_uidx_t count; - duk_tval *tv_end; - - count = vs_size - uidx; - tv = thr->valstack_top; - tv_end = tv - count; - DUK_ASSERT(tv > tv_end); - do { - tv--; - DUK_TVAL_SET_UNDEFINED(tv); - } while (tv != tv_end); - thr->valstack_top = tv_end; -#endif /* DUK_USE_REFERENCE_COUNTING */ - } -} -#endif /* DUK_USE_PREFER_SIZE */ - -/* Internal helper: set top to 'top', and set [idx_wipe_start,top[ to - * 'undefined' (doing nothing if idx_wipe_start == top). Indices are - * positive and within value stack reserve. This is used by call handling. - */ -DUK_INTERNAL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(top >= 0); - DUK_ASSERT(idx_wipe_start >= 0); - DUK_ASSERT(idx_wipe_start <= top); - DUK_ASSERT(thr->valstack_bottom + top <= thr->valstack_end); - DUK_ASSERT(thr->valstack_bottom + idx_wipe_start <= thr->valstack_end); - - duk_set_top_unsafe(thr, idx_wipe_start); - duk_set_top_unsafe(thr, top); -} - -DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_hthread *thr) { - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; - if (DUK_UNLIKELY(ret < 0)) { - /* Return invalid index; if caller uses this without checking - * in another API call, the index won't map to a valid stack - * entry. - */ - return DUK_INVALID_INDEX; - } - return ret; -} - -/* Internal variant: call assumes there is at least one element on the value - * stack frame; this is only asserted for. - */ -DUK_INTERNAL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr) { - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; - return ret; -} - -DUK_EXTERNAL duk_idx_t duk_require_top_index(duk_hthread *thr) { - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1; - if (DUK_UNLIKELY(ret < 0)) { - DUK_ERROR_RANGE_INDEX(thr, -1); - return 0; /* unreachable */ - } - return ret; -} - -/* - * Value stack resizing. - * - * This resizing happens above the current "top": the value stack can be - * grown or shrunk, but the "top" is not affected. The value stack cannot - * be resized to a size below the current reserve. - * - * The low level reallocation primitive must carefully recompute all value - * stack pointers, and must also work if ALL pointers are NULL. The resize - * is quite tricky because the valstack realloc may cause a mark-and-sweep, - * which may run finalizers. Running finalizers may resize the valstack - * recursively (the same value stack we're working on). So, after realloc - * returns, we know that the valstack bottom, top, and reserve should still - * be the same (there should not be live values above the "top"), but its - * underlying size, alloc_end, and base pointer may have changed. - * - * 'new_size' is known to be <= DUK_USE_VALSTACK_LIMIT, which ensures that - * size_t and pointer arithmetic won't wrap in duk__resize_valstack(). - */ - -/* Low level valstack resize primitive, used for both grow and shrink. All - * adjustments for slack etc have already been done. Doesn't throw but does - * have allocation side effects. - */ -DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__resize_valstack(duk_hthread *thr, duk_size_t new_size) { - duk_tval *pre_valstack; - duk_tval *pre_bottom; - duk_tval *pre_top; - duk_tval *pre_end; - duk_tval *pre_alloc_end; - duk_ptrdiff_t ptr_diff; - duk_tval *new_valstack; - duk_size_t new_alloc_size; - duk_tval *tv_prev_alloc_end; - duk_tval *p; - - DUK_ASSERT_HTHREAD_VALID(thr); - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) <= new_size); /* can't resize below 'top' */ - DUK_ASSERT(new_size <= DUK_USE_VALSTACK_LIMIT); /* valstack limit caller has check, prevents wrapping */ - DUK_ASSERT(new_size <= DUK_SIZE_MAX / sizeof(duk_tval)); /* specific assert for wrapping */ - - /* Pre-realloc pointer copies for asserts and debug logs. */ - pre_valstack = thr->valstack; - pre_bottom = thr->valstack_bottom; - pre_top = thr->valstack_top; - pre_end = thr->valstack_end; - pre_alloc_end = thr->valstack_alloc_end; - - DUK_UNREF(pre_valstack); - DUK_UNREF(pre_bottom); - DUK_UNREF(pre_top); - DUK_UNREF(pre_end); - DUK_UNREF(pre_alloc_end); - - /* If finalizer torture enabled, force base pointer change every time - * when it would be allowed. - */ -#if defined(DUK_USE_FINALIZER_TORTURE) - if (thr->heap->pf_prevent_count == 0) { - duk_hthread_valstack_torture_realloc(thr); - } -#endif - - /* Allocate a new valstack using DUK_REALLOC_DIRECT() to deal with - * a side effect changing the base pointer. - */ - new_alloc_size = sizeof(duk_tval) * new_size; - new_valstack = (duk_tval *) DUK_REALLOC_INDIRECT(thr->heap, duk_hthread_get_valstack_ptr, (void *) thr, new_alloc_size); - if (DUK_UNLIKELY(new_valstack == NULL)) { - /* Because new_size != 0, if condition doesn't need to be - * (new_valstack != NULL || new_size == 0). - */ - DUK_ASSERT(new_size != 0); - DUK_D(DUK_DPRINT("failed to resize valstack to %lu entries (%lu bytes)", - (unsigned long) new_size, (unsigned long) new_alloc_size)); - return 0; - } - - /* Debug log any changes in pointer(s) by side effects. These don't - * necessarily imply any incorrect behavior, but should be rare in - * practice. - */ -#if defined(DUK_USE_DEBUG) - if (thr->valstack != pre_valstack) { - DUK_D(DUK_DPRINT("valstack base pointer changed during valstack resize: %p -> %p", - (void *) pre_valstack, (void *) thr->valstack)); - } - if (thr->valstack_bottom != pre_bottom) { - DUK_D(DUK_DPRINT("valstack bottom pointer changed during valstack resize: %p -> %p", - (void *) pre_bottom, (void *) thr->valstack_bottom)); - } - if (thr->valstack_top != pre_top) { - DUK_D(DUK_DPRINT("valstack top pointer changed during valstack resize: %p -> %p", - (void *) pre_top, (void *) thr->valstack_top)); - } - if (thr->valstack_end != pre_end) { - DUK_D(DUK_DPRINT("valstack end pointer changed during valstack resize: %p -> %p", - (void *) pre_end, (void *) thr->valstack_end)); - } - if (thr->valstack_alloc_end != pre_alloc_end) { - DUK_D(DUK_DPRINT("valstack alloc_end pointer changed during valstack resize: %p -> %p", - (void *) pre_alloc_end, (void *) thr->valstack_alloc_end)); - } -#endif - - /* Assertions: offsets for bottom, top, and end (reserve) must not - * have changed even with side effects because they are always - * restored in unwind. For alloc_end there's no guarantee: it may - * have grown or shrunk (but remain above 'end'). - */ - DUK_ASSERT(thr->valstack_bottom - thr->valstack == pre_bottom - pre_valstack); - DUK_ASSERT(thr->valstack_top - thr->valstack == pre_top - pre_valstack); - DUK_ASSERT(thr->valstack_end - thr->valstack == pre_end - pre_valstack); - DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); - - /* Write new pointers. Most pointers can be handled as a pointer - * difference. - */ - ptr_diff = (duk_ptrdiff_t) ((duk_uint8_t *) new_valstack - (duk_uint8_t *) thr->valstack); - tv_prev_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_alloc_end + ptr_diff); - thr->valstack = new_valstack; - thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + ptr_diff); - thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + ptr_diff); - thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_end + ptr_diff); - thr->valstack_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + new_alloc_size); - - /* Assertions: pointer sanity after pointer updates. */ - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); - - DUK_D(DUK_DPRINT("resized valstack %lu -> %lu elements (%lu -> %lu bytes): " - "base=%p -> %p, bottom=%p -> %p (%ld), top=%p -> %p (%ld), " - "end=%p -> %p (%ld), alloc_end=%p -> %p (%ld);" - " tv_prev_alloc_end=%p (-> %ld inits; <0 means shrink)", - (unsigned long) (pre_alloc_end - pre_valstack), - (unsigned long) new_size, - (unsigned long) ((duk_uint8_t *) pre_alloc_end - (duk_uint8_t *) pre_valstack), - (unsigned long) new_alloc_size, - (void *) pre_valstack, (void *) thr->valstack, - (void *) pre_bottom, (void *) thr->valstack_bottom, (long) (thr->valstack_bottom - thr->valstack), - (void *) pre_top, (void *) thr->valstack_top, (long) (thr->valstack_top - thr->valstack), - (void *) pre_end, (void *) thr->valstack_end, (long) (thr->valstack_end - thr->valstack), - (void *) pre_alloc_end, (void *) thr->valstack_alloc_end, (long) (thr->valstack_alloc_end - thr->valstack), - (void *) tv_prev_alloc_end, (long) (thr->valstack_alloc_end - tv_prev_alloc_end))); - - /* If allocation grew, init any new slots to 'undefined'. */ - p = tv_prev_alloc_end; - while (p < thr->valstack_alloc_end) { - /* Never executed if new size is smaller. */ - DUK_TVAL_SET_UNDEFINED(p); - p++; - } - - /* Assert for value stack initialization policy. */ -#if defined(DUK_USE_ASSERTIONS) - p = thr->valstack_top; - while (p < thr->valstack_alloc_end) { - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(p)); - p++; - } -#endif - - return 1; -} - -DUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__valstack_grow(duk_hthread *thr, duk_size_t min_bytes, duk_bool_t throw_on_error) { - duk_size_t min_size; - duk_size_t new_size; - - DUK_ASSERT(min_bytes / sizeof(duk_tval) * sizeof(duk_tval) == min_bytes); - min_size = min_bytes / sizeof(duk_tval); /* from bytes to slots */ - -#if defined(DUK_USE_VALSTACK_GROW_SHIFT) - /* New size is minimum size plus a proportional slack, e.g. shift of - * 2 means a 25% slack. - */ - new_size = min_size + (min_size >> DUK_USE_VALSTACK_GROW_SHIFT); -#else - /* New size is tight with no slack. This is sometimes preferred in - * low memory environments. - */ - new_size = min_size; -#endif - - if (DUK_UNLIKELY(new_size > DUK_USE_VALSTACK_LIMIT || new_size < min_size /*wrap*/)) { - /* Note: may be triggered even if minimal new_size would not reach the limit, - * plan limit accordingly. - */ - if (throw_on_error) { - DUK_ERROR_RANGE(thr, DUK_STR_VALSTACK_LIMIT); - } - return 0; - } - - if (duk__resize_valstack(thr, new_size) == 0) { - if (throw_on_error) { - DUK_ERROR_ALLOC_FAILED(thr); - } - return 0; - } - - thr->valstack_end = thr->valstack + min_size; - DUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end); - - return 1; -} - -/* Hot, inlined value stack grow check. Because value stack almost never - * grows, the actual resize call is in a NOINLINE helper. - */ -DUK_INTERNAL DUK_INLINE void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes) { - duk_tval *tv; - - tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes); - if (DUK_LIKELY(thr->valstack_end >= tv)) { - return; - } - if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) { - /* Values in [valstack_top,valstack_alloc_end[ are initialized - * to 'undefined' so we can just move the end pointer. - */ - thr->valstack_end = tv; - return; - } - (void) duk__valstack_grow(thr, min_bytes, 1 /*throw_on_error*/); -} - -/* Hot, inlined value stack grow check which doesn't throw. */ -DUK_INTERNAL DUK_INLINE duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes) { - duk_tval *tv; - - tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes); - if (DUK_LIKELY(thr->valstack_end >= tv)) { - return 1; - } - if (DUK_LIKELY(thr->valstack_alloc_end >= tv)) { - thr->valstack_end = tv; - return 1; - } - return duk__valstack_grow(thr, min_bytes, 0 /*throw_on_error*/); -} - -/* Value stack shrink check, called from mark-and-sweep. */ -DUK_INTERNAL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug) { - duk_size_t alloc_bytes; - duk_size_t reserve_bytes; - duk_size_t shrink_bytes; - - alloc_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack); - reserve_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); - DUK_ASSERT(alloc_bytes >= reserve_bytes); - - /* We're free to shrink the value stack allocation down to - * reserve_bytes but not more. If 'snug' (emergency GC) - * shrink whatever we can. Otherwise only shrink if the new - * size would be considerably smaller. - */ - -#if defined(DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT) - if (snug) { - shrink_bytes = reserve_bytes; - } else { - duk_size_t proportion, slack; - - /* Require that value stack shrinks by at least X% of its - * current size. For example, shift of 2 means at least - * 25%. The proportion is computed as bytes and may not - * be a multiple of sizeof(duk_tval); that's OK here. - */ - proportion = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT; - if (alloc_bytes - reserve_bytes < proportion) { - /* Too little would be freed, do nothing. */ - return; - } - - /* Keep a slack after shrinking. The slack is again a - * proportion of the current size (the proportion should - * of course be smaller than the check proportion above). - */ -#if defined(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT) - DUK_ASSERT(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT > DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT); - slack = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT; -#else - slack = 0; -#endif - shrink_bytes = reserve_bytes + - slack / sizeof(duk_tval) * sizeof(duk_tval); /* multiple of duk_tval */ - } -#else /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */ - /* Always snug, useful in some low memory environments. */ - DUK_UNREF(snug); - shrink_bytes = reserve_bytes; -#endif /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */ - - DUK_D(DUK_DPRINT("valstack shrink check: alloc_bytes=%ld, reserve_bytes=%ld, shrink_bytes=%ld (unvalidated)", - (long) alloc_bytes, (long) reserve_bytes, (long) shrink_bytes)); - DUK_ASSERT(shrink_bytes >= reserve_bytes); - if (shrink_bytes >= alloc_bytes) { - /* Skip if shrink target is same as current one (or higher, - * though that shouldn't happen in practice). - */ - return; - } - DUK_ASSERT(shrink_bytes / sizeof(duk_tval) * sizeof(duk_tval) == shrink_bytes); - - DUK_D(DUK_DPRINT("valstack shrink check: decided to shrink, snug: %ld", (long) snug)); - - duk__resize_valstack(thr, shrink_bytes / sizeof(duk_tval)); -} - -DUK_EXTERNAL duk_bool_t duk_check_stack(duk_hthread *thr, duk_idx_t extra) { - duk_size_t min_new_bytes; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr != NULL); - - if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) { - if (extra < 0) { - /* Clamping to zero makes the API more robust to calling code - * calculation errors. - */ - extra = 0; - } else { - /* Cause grow check to fail without wrapping arithmetic. */ - extra = DUK_USE_VALSTACK_LIMIT; - } - } - - min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) + - sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA); - return duk_valstack_grow_check_nothrow(thr, min_new_bytes); -} - -DUK_EXTERNAL void duk_require_stack(duk_hthread *thr, duk_idx_t extra) { - duk_size_t min_new_bytes; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr != NULL); - - if (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) { - if (extra < 0) { - /* Clamping to zero makes the API more robust to calling code - * calculation errors. - */ - extra = 0; - } else { - /* Cause grow check to fail without wrapping arithmetic. */ - extra = DUK_USE_VALSTACK_LIMIT; - } - } - - min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) + - sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA); - duk_valstack_grow_check_throw(thr, min_new_bytes); -} - -DUK_EXTERNAL duk_bool_t duk_check_stack_top(duk_hthread *thr, duk_idx_t top) { - duk_size_t min_new_bytes; - - DUK_ASSERT_API_ENTRY(thr); - - if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) { - if (top < 0) { - /* Clamping to zero makes the API more robust to calling code - * calculation errors. - */ - top = 0; - } else { - /* Cause grow check to fail without wrapping arithmetic. */ - top = DUK_USE_VALSTACK_LIMIT; - } - } - - DUK_ASSERT(top >= 0); - min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) + - sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA); - return duk_valstack_grow_check_nothrow(thr, min_new_bytes); -} - -DUK_EXTERNAL void duk_require_stack_top(duk_hthread *thr, duk_idx_t top) { - duk_size_t min_new_bytes; - - DUK_ASSERT_API_ENTRY(thr); - - if (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) { - if (top < 0) { - /* Clamping to zero makes the API more robust to calling code - * calculation errors. - */ - top = 0; - } else { - /* Cause grow check to fail without wrapping arithmetic. */ - top = DUK_USE_VALSTACK_LIMIT; - } - } - - DUK_ASSERT(top >= 0); - min_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) + - sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA); - duk_valstack_grow_check_throw(thr, min_new_bytes); -} - -/* - * Basic stack manipulation: swap, dup, insert, replace, etc - */ - -DUK_EXTERNAL void duk_swap(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { - duk_tval *tv1; - duk_tval *tv2; - duk_tval tv_tmp; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_require_tval(thr, idx1); - DUK_ASSERT(tv1 != NULL); - tv2 = duk_require_tval(thr, idx2); - DUK_ASSERT(tv2 != NULL); - - /* If tv1==tv2 this is a NOP, no check is needed */ - DUK_TVAL_SET_TVAL(&tv_tmp, tv1); - DUK_TVAL_SET_TVAL(tv1, tv2); - DUK_TVAL_SET_TVAL(tv2, &tv_tmp); -} - -DUK_EXTERNAL void duk_swap_top(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_swap(thr, idx, -1); -} - -DUK_EXTERNAL void duk_dup(duk_hthread *thr, duk_idx_t from_idx) { - duk_tval *tv_from; - duk_tval *tv_to; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - - tv_from = duk_require_tval(thr, from_idx); - tv_to = thr->valstack_top++; - DUK_ASSERT(tv_from != NULL); - DUK_ASSERT(tv_to != NULL); - DUK_TVAL_SET_TVAL(tv_to, tv_from); - DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ -} - -DUK_EXTERNAL void duk_dup_top(duk_hthread *thr) { -#if defined(DUK_USE_PREFER_SIZE) - duk_dup(thr, -1); -#else - duk_tval *tv_from; - duk_tval *tv_to; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - - if (DUK_UNLIKELY(thr->valstack_top - thr->valstack_bottom <= 0)) { - DUK_ERROR_RANGE_INDEX(thr, -1); - return; /* unreachable */ - } - tv_from = thr->valstack_top - 1; - tv_to = thr->valstack_top++; - DUK_ASSERT(tv_from != NULL); - DUK_ASSERT(tv_to != NULL); - DUK_TVAL_SET_TVAL(tv_to, tv_from); - DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ -#endif -} - -DUK_INTERNAL void duk_dup_0(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, 0); -} -DUK_INTERNAL void duk_dup_1(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, 1); -} -DUK_INTERNAL void duk_dup_2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, 2); -} -DUK_INTERNAL void duk_dup_m2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, -2); -} -DUK_INTERNAL void duk_dup_m3(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, -3); -} -DUK_INTERNAL void duk_dup_m4(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_dup(thr, -4); -} - -DUK_EXTERNAL void duk_insert(duk_hthread *thr, duk_idx_t to_idx) { - duk_tval *p; - duk_tval *q; - duk_tval tv_tmp; - duk_size_t nbytes; - - DUK_ASSERT_API_ENTRY(thr); - - p = duk_require_tval(thr, to_idx); - DUK_ASSERT(p != NULL); - q = duk_require_tval(thr, -1); - DUK_ASSERT(q != NULL); - - DUK_ASSERT(q >= p); - - /* nbytes - * <---------> - * [ ... | p | x | x | q ] - * => [ ... | q | p | x | x ] - */ - - nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ - - DUK_DDD(DUK_DDDPRINT("duk_insert: to_idx=%ld, p=%p, q=%p, nbytes=%lu", - (long) to_idx, (void *) p, (void *) q, (unsigned long) nbytes)); - - /* No net refcount changes. */ - - if (nbytes > 0) { - DUK_TVAL_SET_TVAL(&tv_tmp, q); - DUK_ASSERT(nbytes > 0); - DUK_MEMMOVE((void *) (p + 1), (const void *) p, (size_t) nbytes); - DUK_TVAL_SET_TVAL(p, &tv_tmp); - } else { - /* nop: insert top to top */ - DUK_ASSERT(nbytes == 0); - DUK_ASSERT(p == q); - } -} - -DUK_INTERNAL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(idx >= 0); /* Doesn't support negative indices. */ - - duk_push_undefined(thr); - duk_insert(thr, idx); -} - -DUK_INTERNAL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { - duk_tval *tv, *tv_end; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(idx >= 0); /* Doesn't support negative indices or count. */ - DUK_ASSERT(count >= 0); - - tv = duk_reserve_gap(thr, idx, count); - tv_end = tv + count; - while (tv != tv_end) { - DUK_TVAL_SET_UNDEFINED(tv); - tv++; - } -} - -DUK_EXTERNAL void duk_replace(duk_hthread *thr, duk_idx_t to_idx) { - duk_tval *tv1; - duk_tval *tv2; - duk_tval tv_tmp; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_require_tval(thr, -1); - DUK_ASSERT(tv1 != NULL); - tv2 = duk_require_tval(thr, to_idx); - DUK_ASSERT(tv2 != NULL); - - /* For tv1 == tv2, both pointing to stack top, the end result - * is same as duk_pop(thr). - */ - DUK_TVAL_SET_TVAL(&tv_tmp, tv2); - DUK_TVAL_SET_TVAL(tv2, tv1); - DUK_TVAL_SET_UNDEFINED(tv1); - thr->valstack_top--; - DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ -} - -DUK_EXTERNAL void duk_copy(duk_hthread *thr, duk_idx_t from_idx, duk_idx_t to_idx) { - duk_tval *tv1; - duk_tval *tv2; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_require_tval(thr, from_idx); - DUK_ASSERT(tv1 != NULL); - tv2 = duk_require_tval(thr, to_idx); - DUK_ASSERT(tv2 != NULL); - - /* For tv1 == tv2, this is a no-op (no explicit check needed). */ - DUK_TVAL_SET_TVAL_UPDREF(thr, tv2, tv1); /* side effects */ -} - -DUK_EXTERNAL void duk_remove(duk_hthread *thr, duk_idx_t idx) { - duk_tval *p; - duk_tval *q; -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_tval tv_tmp; -#endif - duk_size_t nbytes; - - DUK_ASSERT_API_ENTRY(thr); - - p = duk_require_tval(thr, idx); - DUK_ASSERT(p != NULL); - q = duk_require_tval(thr, -1); - DUK_ASSERT(q != NULL); - - DUK_ASSERT(q >= p); - - /* nbytes zero size case - * <---------> - * [ ... | p | x | x | q ] [ ... | p==q ] - * => [ ... | x | x | q ] [ ... ] - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - /* use a temp: decref only when valstack reachable values are correct */ - DUK_TVAL_SET_TVAL(&tv_tmp, p); -#endif - - nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ - DUK_MEMMOVE((void *) p, (const void *) (p + 1), (size_t) nbytes); /* zero size not an issue: pointers are valid */ - - DUK_TVAL_SET_UNDEFINED(q); - thr->valstack_top--; - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ -#endif -} - -DUK_INTERNAL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - duk_remove(thr, idx); /* XXX: no optimization for now */ -} - -DUK_INTERNAL void duk_remove_m2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk_remove(thr, -2); -} - -DUK_INTERNAL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { -#if defined(DUK_USE_PREFER_SIZE) - /* XXX: maybe too slow even when preferring size? */ - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(count >= 0); - DUK_ASSERT(idx >= 0); - - while (count-- > 0) { - duk_remove(thr, idx); - } -#else /* DUK_USE_PREFER_SIZE */ - duk_tval *tv_src; - duk_tval *tv_dst; - duk_tval *tv_newtop; - duk_tval *tv; - duk_size_t bytes; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(count >= 0); - DUK_ASSERT(idx >= 0); - - tv_dst = thr->valstack_bottom + idx; - DUK_ASSERT(tv_dst <= thr->valstack_top); - tv_src = tv_dst + count; - DUK_ASSERT(tv_src <= thr->valstack_top); - bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src); - - for (tv = tv_dst; tv < tv_src; tv++) { - DUK_TVAL_DECREF_NORZ(thr, tv); - } - - DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, bytes); - - tv_newtop = thr->valstack_top - count; - for (tv = tv_newtop; tv < thr->valstack_top; tv++) { - DUK_TVAL_SET_UNDEFINED(tv); - } - thr->valstack_top = tv_newtop; - - /* When not preferring size, only NORZ macros are used; caller - * is expected to DUK_REFZERO_CHECK(). - */ -#endif /* DUK_USE_PREFER_SIZE */ -} - -DUK_INTERNAL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - - duk_remove_n(thr, idx, count); /* XXX: no optimization for now */ -} - -/* - * Stack slice primitives - */ - -DUK_EXTERNAL void duk_xcopymove_raw(duk_hthread *to_thr, duk_hthread *from_thr, duk_idx_t count, duk_bool_t is_copy) { - void *src; - duk_size_t nbytes; - duk_tval *p; - duk_tval *q; - - /* XXX: several pointer comparison issues here */ - - DUK_ASSERT_API_ENTRY(to_thr); - DUK_ASSERT_CTX_VALID(to_thr); - DUK_ASSERT_CTX_VALID(from_thr); - DUK_ASSERT(to_thr->heap == from_thr->heap); - - if (DUK_UNLIKELY(to_thr == from_thr)) { - DUK_ERROR_TYPE(to_thr, DUK_STR_INVALID_CONTEXT); - return; - } - if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) DUK_USE_VALSTACK_LIMIT)) { - /* Maximum value check ensures 'nbytes' won't wrap below. - * Also handles negative count. - */ - DUK_ERROR_RANGE_INVALID_COUNT(to_thr); - return; - } - DUK_ASSERT(count >= 0); - - nbytes = sizeof(duk_tval) * (duk_size_t) count; - if (DUK_UNLIKELY(nbytes == 0)) { - return; - } - DUK_ASSERT(to_thr->valstack_top <= to_thr->valstack_end); - if (DUK_UNLIKELY((duk_size_t) ((duk_uint8_t *) to_thr->valstack_end - (duk_uint8_t *) to_thr->valstack_top) < nbytes)) { - DUK_ERROR_RANGE_PUSH_BEYOND(to_thr); - } - src = (void *) ((duk_uint8_t *) from_thr->valstack_top - nbytes); - if (DUK_UNLIKELY(src < (void *) from_thr->valstack_bottom)) { - DUK_ERROR_RANGE_INVALID_COUNT(to_thr); - } - - /* copy values (no overlap even if to_thr == from_thr; that's not - * allowed now anyway) - */ - DUK_ASSERT(nbytes > 0); - DUK_MEMCPY((void *) to_thr->valstack_top, (const void *) src, (size_t) nbytes); - - p = to_thr->valstack_top; - to_thr->valstack_top = (duk_tval *) (void *) (((duk_uint8_t *) p) + nbytes); - - if (is_copy) { - /* Incref copies, keep originals. */ - q = to_thr->valstack_top; - while (p < q) { - DUK_TVAL_INCREF(to_thr, p); /* no side effects */ - p++; - } - } else { - /* No net refcount change. */ - p = from_thr->valstack_top; - q = (duk_tval *) (void *) (((duk_uint8_t *) p) - nbytes); - from_thr->valstack_top = q; - - while (p > q) { - p--; - DUK_TVAL_SET_UNDEFINED(p); - /* XXX: fast primitive to set a bunch of values to UNDEFINED */ - } - } -} - -/* Internal helper: reserve a gap of 'count' elements at 'idx_base' and return a - * pointer to the gap. Values in the gap are garbage and MUST be initialized by - * the caller before any side effects may occur. The caller must ensure there's - * enough stack reserve for 'count' values. - */ -DUK_INTERNAL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count) { - duk_tval *tv_src; - duk_tval *tv_dst; - duk_size_t gap_bytes; - duk_size_t copy_bytes; - - /* Caller is responsible for ensuring there's enough preallocated - * value stack. - */ - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(count >= 0); - DUK_ASSERT((duk_size_t) (thr->valstack_end - thr->valstack_top) >= (duk_size_t) count); - - tv_src = thr->valstack_bottom + idx_base; - gap_bytes = (duk_size_t) count * sizeof(duk_tval); - tv_dst = (duk_tval *) (void *) ((duk_uint8_t *) tv_src + gap_bytes); - copy_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src); - thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + gap_bytes); - DUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, copy_bytes); - - /* Values in the gap are left as garbage: caller must fill them in - * and INCREF them before any side effects. - */ - return tv_src; -} - -/* - * Get/opt/require - */ - -DUK_EXTERNAL void duk_require_undefined(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_UNDEFINED(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "undefined", DUK_STR_NOT_UNDEFINED); - } -} - -DUK_EXTERNAL void duk_require_null(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_NULL(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "null", DUK_STR_NOT_NULL); - } -} - -DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__get_boolean_raw(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { - duk_bool_t ret; - duk_tval *tv; - - DUK_ASSERT_CTX_VALID(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_BOOLEAN(tv)) { - ret = DUK_TVAL_GET_BOOLEAN(tv); - DUK_ASSERT(ret == 0 || ret == 1); - } else { - ret = def_value; - /* Not guaranteed to be 0 or 1. */ - } - - return ret; -} - -DUK_EXTERNAL duk_bool_t duk_get_boolean(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return duk__get_boolean_raw(thr, idx, 0); /* default: false */ -} - -DUK_EXTERNAL duk_bool_t duk_get_boolean_default(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - return duk__get_boolean_raw(thr, idx, def_value); -} - -DUK_EXTERNAL duk_bool_t duk_require_boolean(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_bool_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_LIKELY(DUK_TVAL_IS_BOOLEAN(tv))) { - ret = DUK_TVAL_GET_BOOLEAN(tv); - DUK_ASSERT(ret == 0 || ret == 1); - return ret; - } else { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "boolean", DUK_STR_NOT_BOOLEAN); - } -} - -DUK_EXTERNAL duk_bool_t duk_opt_boolean(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_boolean(thr, idx); -} - -DUK_LOCAL DUK_ALWAYS_INLINE duk_double_t duk__get_number_raw(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { - duk_double_union ret; - duk_tval *tv; - - DUK_ASSERT_CTX_VALID(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - ret.d = (duk_double_t) DUK_TVAL_GET_FASTINT(tv); /* XXX: cast trick */ - } - else -#endif - if (DUK_TVAL_IS_DOUBLE(tv)) { - /* When using packed duk_tval, number must be in NaN-normalized form - * for it to be a duk_tval, so no need to normalize. NOP for unpacked - * duk_tval. - */ - ret.d = DUK_TVAL_GET_DOUBLE(tv); - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret)); - } else { - ret.d = def_value; - /* Default value (including NaN) may not be normalized. */ - } - - return ret.d; -} - -DUK_EXTERNAL duk_double_t duk_get_number(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_number_raw(thr, idx, DUK_DOUBLE_NAN); /* default: NaN */ -} - -DUK_EXTERNAL duk_double_t duk_get_number_default(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_number_raw(thr, idx, def_value); -} - -DUK_EXTERNAL duk_double_t duk_require_number(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_double_union ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_NUMBER(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "number", DUK_STR_NOT_NUMBER); - } - - ret.d = DUK_TVAL_GET_NUMBER(tv); - - /* When using packed duk_tval, number must be in NaN-normalized form - * for it to be a duk_tval, so no need to normalize. NOP for unpacked - * duk_tval. - */ - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret)); - return ret.d; -} - -DUK_EXTERNAL duk_double_t duk_opt_number(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - /* User provided default is not NaN normalized. */ - return def_value; - } - return duk_require_number(thr, idx); -} - -DUK_EXTERNAL duk_int_t duk_get_int(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/); -} - -DUK_EXTERNAL duk_uint_t duk_get_uint(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/); -} - -DUK_EXTERNAL duk_int_t duk_get_int_default(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_int_t) duk__api_coerce_d2i(thr, idx, def_value, 0 /*require*/); -} - -DUK_EXTERNAL duk_uint_t duk_get_uint_default(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, def_value, 0 /*require*/); -} - -DUK_EXTERNAL duk_int_t duk_require_int(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 1 /*require*/); -} - -DUK_EXTERNAL duk_uint_t duk_require_uint(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 1 /*require*/); -} - -DUK_EXTERNAL duk_int_t duk_opt_int(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_int(thr, idx); -} - -DUK_EXTERNAL duk_uint_t duk_opt_uint(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_uint(thr, idx); -} - -DUK_EXTERNAL const char *duk_get_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - duk_hstring *h; - const char *ret; - duk_size_t len; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hstring(thr, idx); - if (h != NULL) { - len = DUK_HSTRING_GET_BYTELEN(h); - ret = (const char *) DUK_HSTRING_GET_DATA(h); - } else { - len = 0; - ret = NULL; - } - - if (out_len != NULL) { - *out_len = len; - } - return ret; -} - -DUK_EXTERNAL const char *duk_require_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_require_hstring(thr, idx); - DUK_ASSERT(h != NULL); - if (out_len) { - *out_len = DUK_HSTRING_GET_BYTELEN(h); - } - return (const char *) DUK_HSTRING_GET_DATA(h); -} - -DUK_INTERNAL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_require_hstring_notsymbol(thr, idx); - DUK_ASSERT(h != NULL); - if (out_len) { - *out_len = DUK_HSTRING_GET_BYTELEN(h); - } - return (const char *) DUK_HSTRING_GET_DATA(h); -} - -DUK_EXTERNAL const char *duk_get_string(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hstring(thr, idx); - if (h != NULL) { - return (const char *) DUK_HSTRING_GET_DATA(h); - } else { - return NULL; - } -} - -DUK_EXTERNAL const char *duk_opt_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - if (out_len != NULL) { - *out_len = def_len; - } - return def_ptr; - } - return duk_require_lstring(thr, idx, out_len); -} - -DUK_EXTERNAL const char *duk_opt_string(duk_hthread *thr, duk_idx_t idx, const char *def_ptr) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_ptr; - } - return duk_require_string(thr, idx); -} - -DUK_EXTERNAL const char *duk_get_lstring_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) { - duk_hstring *h; - const char *ret; - duk_size_t len; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hstring(thr, idx); - if (h != NULL) { - len = DUK_HSTRING_GET_BYTELEN(h); - ret = (const char *) DUK_HSTRING_GET_DATA(h); - } else { - len = def_len; - ret = def_ptr; - } - - if (out_len != NULL) { - *out_len = len; - } - return ret; -} - -DUK_EXTERNAL const char *duk_get_string_default(duk_hthread *thr, duk_idx_t idx, const char *def_value) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hstring(thr, idx); - if (h != NULL) { - return (const char *) DUK_HSTRING_GET_DATA(h); - } else { - return def_value; - } -} - -DUK_INTERNAL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hstring_notsymbol(thr, idx); - if (h) { - return (const char *) DUK_HSTRING_GET_DATA(h); - } else { - return NULL; - } -} - -DUK_EXTERNAL const char *duk_require_string(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return duk_require_lstring(thr, idx, NULL); -} - -DUK_INTERNAL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_require_hstring_notsymbol(thr, idx); - DUK_ASSERT(h != NULL); - return (const char *) DUK_HSTRING_GET_DATA(h); -} - -DUK_EXTERNAL void duk_require_object(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); - } -} - -DUK_LOCAL void *duk__get_pointer_raw(duk_hthread *thr, duk_idx_t idx, void *def_value) { - duk_tval *tv; - void *p; - - DUK_ASSERT_CTX_VALID(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (!DUK_TVAL_IS_POINTER(tv)) { - return def_value; - } - - p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ - return p; -} - -DUK_EXTERNAL void *duk_get_pointer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_pointer_raw(thr, idx, NULL /*def_value*/); -} - -DUK_EXTERNAL void *duk_opt_pointer(duk_hthread *thr, duk_idx_t idx, void *def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_pointer(thr, idx); -} - -DUK_EXTERNAL void *duk_get_pointer_default(duk_hthread *thr, duk_idx_t idx, void *def_value) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_pointer_raw(thr, idx, def_value); -} - -DUK_EXTERNAL void *duk_require_pointer(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - void *p; - - DUK_ASSERT_API_ENTRY(thr); - - /* Note: here we must be wary of the fact that a pointer may be - * valid and be a NULL. - */ - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_POINTER(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "pointer", DUK_STR_NOT_POINTER); - } - p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ - return p; -} - -#if 0 /*unused*/ -DUK_INTERNAL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_heaphdr *h; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (!DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { - return NULL; - } - - h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - return (void *) h; -} -#endif - -DUK_LOCAL void *duk__get_buffer_helper(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag) { - duk_hbuffer *h; - void *ret; - duk_size_t len; - duk_tval *tv; - - DUK_ASSERT_CTX_VALID(thr); - - if (out_size != NULL) { - *out_size = 0; - } - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_LIKELY(DUK_TVAL_IS_BUFFER(tv))) { - h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - - len = DUK_HBUFFER_GET_SIZE(h); - ret = DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); - } else { - if (throw_flag) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); - } - len = def_size; - ret = def_ptr; - } - - if (out_size != NULL) { - *out_size = len; - } - return ret; -} - -DUK_EXTERNAL void *duk_get_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { - DUK_ASSERT_API_ENTRY(thr); - - return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/); -} - -DUK_EXTERNAL void *duk_opt_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - if (out_size != NULL) { - *out_size = def_size; - } - return def_ptr; - } - return duk_require_buffer(thr, idx, out_size); -} - -DUK_EXTERNAL void *duk_get_buffer_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len) { - DUK_ASSERT_API_ENTRY(thr); - - return duk__get_buffer_helper(thr, idx, out_size, def_ptr, def_len, 0 /*throw_flag*/); -} - -DUK_EXTERNAL void *duk_require_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { - DUK_ASSERT_API_ENTRY(thr); - - return duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/); -} - -/* Get the active buffer data area for a plain buffer or a buffer object. - * Return NULL if the the value is not a buffer. Note that a buffer may - * have a NULL data pointer when its size is zero, the optional 'out_isbuffer' - * argument allows caller to detect this reliably. - */ -DUK_INTERNAL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag, duk_bool_t *out_isbuffer) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - if (out_isbuffer != NULL) { - *out_isbuffer = 0; - } - if (out_size != NULL) { - *out_size = def_size; - } - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_BUFFER(tv)) { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - if (out_size != NULL) { - *out_size = DUK_HBUFFER_GET_SIZE(h); - } - if (out_isbuffer != NULL) { - *out_isbuffer = 1; - } - return (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* may be NULL (but only if size is 0) */ - } -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - else if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (DUK_HOBJECT_IS_BUFOBJ(h)) { - /* XXX: this is probably a useful shared helper: for a - * duk_hbufobj, get a validated buffer pointer/length. - */ - duk_hbufobj *h_bufobj = (duk_hbufobj *) h; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - if (h_bufobj->buf != NULL && - DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { - duk_uint8_t *p; - - p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf); - if (out_size != NULL) { - *out_size = (duk_size_t) h_bufobj->length; - } - if (out_isbuffer != NULL) { - *out_isbuffer = 1; - } - return (void *) (p + h_bufobj->offset); - } - /* if slice not fully valid, treat as error */ - } - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - - if (throw_flag) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); - } - return def_ptr; -} - -DUK_EXTERNAL void *duk_get_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { - DUK_ASSERT_API_ENTRY(thr); - return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, NULL); -} - -DUK_EXTERNAL void *duk_get_buffer_data_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { - DUK_ASSERT_API_ENTRY(thr); - return duk_get_buffer_data_raw(thr, idx, out_size, def_ptr, def_size, 0 /*throw_flag*/, NULL); -} - -DUK_EXTERNAL void *duk_opt_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - if (out_size != NULL) { - *out_size = def_size; - } - return def_ptr; - } - return duk_require_buffer_data(thr, idx, out_size); -} - -DUK_EXTERNAL void *duk_require_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) { - DUK_ASSERT_API_ENTRY(thr); - return duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/, NULL); -} - -/* Raw helper for getting a value from the stack, checking its tag. - * The tag cannot be a number because numbers don't have an internal - * tag in the packed representation. - */ - -DUK_LOCAL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag) { - duk_tval *tv; - duk_heaphdr *ret; - - DUK_ASSERT_CTX_VALID(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_GET_TAG(tv) != tag) { - return (duk_heaphdr *) NULL; - } - - ret = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(ret != NULL); /* tagged null pointers should never occur */ - return ret; - -} - -DUK_INTERNAL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); -} - -DUK_INTERNAL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); - if (DUK_UNLIKELY(h && DUK_HSTRING_HAS_SYMBOL(h))) { - return NULL; - } - return h; -} - -DUK_INTERNAL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); - if (DUK_UNLIKELY(h == NULL)) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING); - } - return h; -} - -DUK_INTERNAL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING); - if (DUK_UNLIKELY(h == NULL || DUK_HSTRING_HAS_SYMBOL(h))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "string", DUK_STR_NOT_STRING); - } - return h; -} - -DUK_INTERNAL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); -} - -DUK_INTERNAL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(h == NULL)) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); - } - return h; -} - -DUK_INTERNAL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER); -} - -DUK_INTERNAL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx) { - duk_hbuffer *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER); - if (DUK_UNLIKELY(h == NULL)) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "buffer", DUK_STR_NOT_BUFFER); - } - return h; -} - -DUK_INTERNAL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_THREAD(h))) { - h = NULL; - } - return (duk_hthread *) h; -} - -DUK_INTERNAL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_THREAD(h)))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "thread", DUK_STR_NOT_THREAD); - } - return (duk_hthread *) h; -} - -DUK_INTERNAL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_COMPFUNC(h))) { - h = NULL; - } - return (duk_hcompfunc *) h; -} - -DUK_INTERNAL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_COMPFUNC(h)))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "compiledfunction", DUK_STR_NOT_COMPFUNC); - } - return (duk_hcompfunc *) h; -} - -DUK_INTERNAL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_NATFUNC(h))) { - h = NULL; - } - return (duk_hnatfunc *) h; -} - -DUK_INTERNAL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_NATFUNC(h)))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC); - } - return (duk_hnatfunc *) h; -} - -DUK_EXTERNAL duk_c_function duk_get_c_function(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_hobject *h; - duk_hnatfunc *f; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) { - return NULL; - } - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - if (DUK_UNLIKELY(!DUK_HOBJECT_IS_NATFUNC(h))) { - return NULL; - } - DUK_ASSERT(DUK_HOBJECT_HAS_NATFUNC(h)); - f = (duk_hnatfunc *) h; - - return f->func; -} - -DUK_EXTERNAL duk_c_function duk_opt_c_function(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_c_function(thr, idx); -} - -DUK_EXTERNAL duk_c_function duk_get_c_function_default(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) { - duk_c_function ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = duk_get_c_function(thr, idx); - if (ret != NULL) { - return ret; - } - - return def_value; -} - -DUK_EXTERNAL duk_c_function duk_require_c_function(duk_hthread *thr, duk_idx_t idx) { - duk_c_function ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = duk_get_c_function(thr, idx); - if (DUK_UNLIKELY(!ret)) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "nativefunction", DUK_STR_NOT_NATFUNC); - } - return ret; -} - -DUK_EXTERNAL void duk_require_function(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - if (DUK_UNLIKELY(!duk_is_function(thr, idx))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "function", DUK_STR_NOT_FUNCTION); - } -} - -DUK_INTERNAL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_require_hobject_accept_mask(thr, idx, DUK_TYPE_MASK_LIGHTFUNC); - if (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_HAS_CONSTRUCTABLE(h))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "constructable", DUK_STR_NOT_CONSTRUCTABLE); - } - /* Lightfuncs (h == NULL) are constructable. */ -} - -DUK_EXTERNAL duk_hthread *duk_get_context(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return duk_get_hthread(thr, idx); -} - -DUK_EXTERNAL duk_hthread *duk_require_context(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return duk_require_hthread(thr, idx); -} - -DUK_EXTERNAL duk_hthread *duk_opt_context(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_context(thr, idx); -} - -DUK_EXTERNAL duk_hthread *duk_get_context_default(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) { - duk_hthread *ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = duk_get_context(thr, idx); - if (ret != NULL) { - return ret; - } - - return def_value; -} - -DUK_EXTERNAL void *duk_get_heapptr(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - void *ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) { - return (void *) NULL; - } - - ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(ret != NULL); - return ret; -} - -DUK_EXTERNAL void *duk_opt_heapptr(duk_hthread *thr, duk_idx_t idx, void *def_value) { - DUK_ASSERT_API_ENTRY(thr); - - if (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) { - return def_value; - } - return duk_require_heapptr(thr, idx); -} - -DUK_EXTERNAL void *duk_get_heapptr_default(duk_hthread *thr, duk_idx_t idx, void *def_value) { - void *ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = duk_get_heapptr(thr, idx); - if (ret != NULL) { - return ret; - } - - return def_value; -} - -DUK_EXTERNAL void *duk_require_heapptr(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - void *ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "heapobject", DUK_STR_UNEXPECTED_TYPE); - } - - ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(ret != NULL); - return ret; -} - -/* Internal helper for getting/requiring a duk_hobject with possible promotion. */ -DUK_LOCAL duk_hobject *duk__get_hobject_promote_mask_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { - duk_uint_t val_mask; - duk_hobject *res; - - DUK_ASSERT_CTX_VALID(thr); - - res = duk_get_hobject(thr, idx); /* common case, not promoted */ - if (DUK_LIKELY(res != NULL)) { - DUK_ASSERT(res != NULL); - return res; - } - - val_mask = duk_get_type_mask(thr, idx); - if (val_mask & type_mask) { - if (type_mask & DUK_TYPE_MASK_PROMOTE) { - res = duk_to_hobject(thr, idx); - DUK_ASSERT(res != NULL); - return res; - } else { - return NULL; /* accept without promoting */ - } - } - - if (type_mask & DUK_TYPE_MASK_THROW) { - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, "object", DUK_STR_NOT_OBJECT); - } - return NULL; -} - -/* Get a duk_hobject * at 'idx'; if the value is not an object but matches the - * supplied 'type_mask', promote it to an object and return the duk_hobject *. - * This is useful for call sites which want an object but also accept a plain - * buffer and/or a lightfunc which gets automatically promoted to an object. - * Return value is NULL if value is neither an object nor a plain type allowed - * by the mask. - */ -DUK_INTERNAL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_PROMOTE); -} - -/* Like duk_get_hobject_promote_mask() but throw a TypeError instead of - * returning a NULL. - */ -DUK_INTERNAL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW | DUK_TYPE_MASK_PROMOTE); -} - -/* Require a duk_hobject * at 'idx'; if the value is not an object but matches the - * supplied 'type_mask', return a NULL instead. Otherwise throw a TypeError. - */ -DUK_INTERNAL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) { - DUK_ASSERT_API_ENTRY(thr); - return duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW); -} - -DUK_INTERNAL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */ - DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) != classnum)) { - h = NULL; - } - return h; -} - -DUK_INTERNAL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_DISABLE(classnum >= 0); /* unsigned */ - DUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX); - - h = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT); - if (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) == classnum))) { - duk_hstring *h_class; - h_class = DUK_HTHREAD_GET_STRING(thr, DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum)); - DUK_UNREF(h_class); - - DUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, (const char *) DUK_HSTRING_GET_DATA(h_class), DUK_STR_UNEXPECTED_TYPE); - } - return h; -} - -DUK_EXTERNAL duk_size_t duk_get_length(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: - case DUK_TAG_BOOLEAN: - case DUK_TAG_POINTER: - return 0; -#if defined(DUK_USE_PREFER_SIZE) - /* String and buffer have a virtual non-configurable .length property - * which is within size_t range so it can be looked up without specific - * type checks. Lightfuncs inherit from %NativeFunctionPrototype% - * which provides an inherited .length accessor; it could be overwritten - * to produce unexpected types or values, but just number convert and - * duk_size_t cast for now. - */ - case DUK_TAG_STRING: - case DUK_TAG_BUFFER: - case DUK_TAG_LIGHTFUNC: { - duk_size_t ret; - duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); - ret = (duk_size_t) duk_to_number_m1(thr); - duk_pop_unsafe(thr); - return ret; - } -#else /* DUK_USE_PREFER_SIZE */ - case DUK_TAG_STRING: { - duk_hstring *h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - return 0; - } - return (duk_size_t) DUK_HSTRING_GET_CHARLEN(h); - } - case DUK_TAG_BUFFER: { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - return (duk_size_t) DUK_HBUFFER_GET_SIZE(h); - } - case DUK_TAG_LIGHTFUNC: { - /* We could look up the length from the lightfunc duk_tval, - * but since Duktape 2.2 lightfunc .length comes from - * %NativeFunctionPrototype% which can be overridden, so - * look up the property explicitly. - */ - duk_size_t ret; - duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); - ret = (duk_size_t) duk_to_number_m1(thr); - duk_pop_unsafe(thr); - return ret; - } -#endif /* DUK_USE_PREFER_SIZE */ - case DUK_TAG_OBJECT: { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - return (duk_size_t) duk_hobject_get_length(thr, h); - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: - /* number or 'unused' */ - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv) || DUK_TVAL_IS_UNUSED(tv)); - return 0; - } - - DUK_UNREACHABLE(); -} - -/* - * duk_known_xxx() helpers - * - * Used internally when we're 100% sure that a certain index is valid and - * contains an object of a certain type. For example, if we duk_push_object() - * we can then safely duk_known_hobject(thr, -1). These helpers just assert - * for the index and type, and if the assumptions are not valid, memory unsafe - * behavior happens. - */ - -DUK_LOCAL duk_heaphdr *duk__known_heaphdr(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_heaphdr *h; - - DUK_ASSERT_CTX_VALID(thr); - if (idx < 0) { - tv = thr->valstack_top + idx; - } else { - tv = thr->valstack_bottom + idx; - } - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_ASSERT(tv < thr->valstack_top); - h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - return h; -} - -DUK_INTERNAL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_hstring(thr, idx) != NULL); - return (duk_hstring *) duk__known_heaphdr(thr, idx); -} - -DUK_INTERNAL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_hobject(thr, idx) != NULL); - return (duk_hobject *) duk__known_heaphdr(thr, idx); -} - -DUK_INTERNAL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_hbuffer(thr, idx) != NULL); - return (duk_hbuffer *) duk__known_heaphdr(thr, idx); -} - -DUK_INTERNAL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_hcompfunc(thr, idx) != NULL); - return (duk_hcompfunc *) duk__known_heaphdr(thr, idx); -} - -DUK_INTERNAL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_hnatfunc(thr, idx) != NULL); - return (duk_hnatfunc *) duk__known_heaphdr(thr, idx); -} - -DUK_EXTERNAL void duk_set_length(duk_hthread *thr, duk_idx_t idx, duk_size_t len) { - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_normalize_index(thr, idx); - duk_push_uint(thr, (duk_uint_t) len); - duk_put_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); -} - -/* - * Conversions and coercions - * - * The conversion/coercions are in-place operations on the value stack. - * Some operations are implemented here directly, while others call a - * helper in duk_js_ops.c after validating arguments. - */ - -/* E5 Section 8.12.8 */ - -DUK_LOCAL duk_bool_t duk__defaultvalue_coerce_attempt(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t func_stridx) { - if (duk_get_prop_stridx(thr, idx, func_stridx)) { - /* [ ... func ] */ - if (duk_is_callable(thr, -1)) { - duk_dup(thr, idx); /* -> [ ... func this ] */ - duk_call_method(thr, 0); /* -> [ ... retval ] */ - if (duk_is_primitive(thr, -1)) { - duk_replace(thr, idx); - return 1; - } - /* [ ... retval ]; popped below */ - } - } - duk_pop_unsafe(thr); /* [ ... func/retval ] -> [ ... ] */ - return 0; -} - -DUK_EXTERNAL void duk_to_undefined(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ -} - -DUK_EXTERNAL void duk_to_null(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - DUK_TVAL_SET_NULL_UPDREF(thr, tv); /* side effects */ -} - -/* E5 Section 9.1 */ -DUK_EXTERNAL void duk_to_primitive(duk_hthread *thr, duk_idx_t idx, duk_int_t hint) { - /* inline initializer for coercers[] is not allowed by old compilers like BCC */ - duk_small_uint_t coercers[2]; - duk_small_uint_t class_number; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(hint == DUK_HINT_NONE || hint == DUK_HINT_NUMBER || hint == DUK_HINT_STRING); - - idx = duk_require_normalize_index(thr, idx); - - if (!duk_check_type_mask(thr, idx, DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_LIGHTFUNC | - DUK_TYPE_MASK_BUFFER)) { - /* Any other values stay as is. */ - DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ - return; - } - - class_number = duk_get_class_number(thr, idx); - - /* XXX: Symbol objects normally coerce via the ES2015-revised ToPrimitive() - * algorithm which consults value[@@toPrimitive] and avoids calling - * .valueOf() and .toString(). Before that is implemented, special - * case Symbol objects to behave as if they had the default @@toPrimitive - * algorithm of E6 Section 19.4.3.4, i.e. return the plain symbol value - * with no further side effects. - */ - - if (class_number == DUK_HOBJECT_CLASS_SYMBOL) { - duk_hobject *h_obj; - duk_hstring *h_str; - - /* XXX: pretty awkward, index based API for internal value access? */ - h_obj = duk_known_hobject(thr, idx); - h_str = duk_hobject_get_internal_value_string(thr->heap, h_obj); - if (h_str) { - duk_push_hstring(thr, h_str); - duk_replace(thr, idx); - return; - } - } - - - /* Objects are coerced based on E5 specification. - * Lightfuncs are coerced because they behave like - * objects even if they're internally a primitive - * type. Same applies to plain buffers, which behave - * like ArrayBuffer objects since Duktape 2.x. - */ - - coercers[0] = DUK_STRIDX_VALUE_OF; - coercers[1] = DUK_STRIDX_TO_STRING; - - if (hint == DUK_HINT_NONE) { - if (class_number == DUK_HOBJECT_CLASS_DATE) { - hint = DUK_HINT_STRING; - } else { - hint = DUK_HINT_NUMBER; - } - } - - if (hint == DUK_HINT_STRING) { - coercers[0] = DUK_STRIDX_TO_STRING; - coercers[1] = DUK_STRIDX_VALUE_OF; - } - - if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[0])) { - DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ - return; - } - - if (duk__defaultvalue_coerce_attempt(thr, idx, coercers[1])) { - DUK_ASSERT(!duk_is_buffer(thr, idx)); /* duk_to_string() relies on this behavior */ - return; - } - - DUK_ERROR_TYPE(thr, DUK_STR_TOPRIMITIVE_FAILED); -} - -/* E5 Section 9.2 */ -DUK_EXTERNAL duk_bool_t duk_to_boolean(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_bool_t val; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_ASSERT(tv != NULL); - - val = duk_js_toboolean(tv); - DUK_ASSERT(val == 0 || val == 1); - - /* Note: no need to re-lookup tv, conversion is side effect free. */ - DUK_ASSERT(tv != NULL); - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, val); /* side effects */ - return val; -} - -DUK_EXTERNAL duk_double_t duk_to_number(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_double_t d; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: No need to normalize; the whole operation could be inlined here to - * avoid 'tv' re-lookup. - */ - idx = duk_require_normalize_index(thr, idx); - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_ASSERT(tv != NULL); - d = duk_js_tonumber(thr, tv); /* XXX: fastint coercion? now result will always be a non-fastint */ - - /* ToNumber() may have side effects so must relookup 'tv'. */ - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */ - return d; -} - -DUK_INTERNAL duk_double_t duk_to_number_m1(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - return duk_to_number(thr, -1); -} -DUK_INTERNAL duk_double_t duk_to_number_m2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - return duk_to_number(thr, -2); -} - -DUK_INTERNAL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv) { -#if defined(DUK_USE_PREFER_SIZE) - duk_double_t res; - - DUK_ASSERT_API_ENTRY(thr); - - duk_push_tval(thr, tv); - res = duk_to_number_m1(thr); - duk_pop_unsafe(thr); - return res; -#else - duk_double_t res; - duk_tval *tv_dst; - - DUK_ASSERT_API_ENTRY(thr); - DUK__ASSERT_SPACE(); - - tv_dst = thr->valstack_top++; - DUK_TVAL_SET_TVAL(tv_dst, tv); - DUK_TVAL_INCREF(thr, tv_dst); /* decref not necessary */ - res = duk_to_number_m1(thr); /* invalidates tv_dst */ - - tv_dst = --thr->valstack_top; - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_dst)); - DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_dst)); /* plain number */ - DUK_TVAL_SET_UNDEFINED(tv_dst); /* valstack init policy */ - - return res; -#endif -} - -/* XXX: combine all the integer conversions: they share everything - * but the helper function for coercion. - */ - -typedef duk_double_t (*duk__toint_coercer)(duk_hthread *thr, duk_tval *tv); - -DUK_LOCAL duk_double_t duk__to_int_uint_helper(duk_hthread *thr, duk_idx_t idx, duk__toint_coercer coerce_func) { - duk_tval *tv; - duk_double_t d; - - DUK_ASSERT_CTX_VALID(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - -#if defined(DUK_USE_FASTINT) - /* If argument is a fastint, guarantee that it remains one. - * There's no downgrade check for other cases. - */ - if (DUK_TVAL_IS_FASTINT(tv)) { - /* XXX: Unnecessary conversion back and forth. */ - return (duk_double_t) DUK_TVAL_GET_FASTINT(tv); - } -#endif - d = coerce_func(thr, tv); - - /* XXX: fastint? */ - - /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ - tv = duk_require_tval(thr, idx); - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d); /* side effects */ - return d; -} - -DUK_EXTERNAL duk_int_t duk_to_int(duk_hthread *thr, duk_idx_t idx) { - /* Value coercion (in stack): ToInteger(), E5 Section 9.4, - * API return value coercion: custom. - */ - DUK_ASSERT_API_ENTRY(thr); - (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger); - return (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/); -} - -DUK_EXTERNAL duk_uint_t duk_to_uint(duk_hthread *thr, duk_idx_t idx) { - /* Value coercion (in stack): ToInteger(), E5 Section 9.4, - * API return value coercion: custom. - */ - DUK_ASSERT_API_ENTRY(thr); - (void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger); - return (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/); -} - -DUK_EXTERNAL duk_int32_t duk_to_int32(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_int32_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - ret = duk_js_toint32(thr, tv); - - /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ - tv = duk_require_tval(thr, idx); - DUK_TVAL_SET_I32_UPDREF(thr, tv, ret); /* side effects */ - return ret; -} - -DUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_uint32_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - ret = duk_js_touint32(thr, tv); - - /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ - tv = duk_require_tval(thr, idx); - DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */ - return ret; -} - -DUK_EXTERNAL duk_uint16_t duk_to_uint16(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_uint16_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - ret = duk_js_touint16(thr, tv); - - /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ - tv = duk_require_tval(thr, idx); - DUK_TVAL_SET_U32_UPDREF(thr, tv, ret); /* side effects */ - return ret; -} - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -/* Special coercion for Uint8ClampedArray. */ -DUK_INTERNAL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx) { - duk_double_t d; - duk_double_t t; - duk_uint8_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: Simplify this algorithm, should be possible to come up with - * a shorter and faster algorithm by inspecting IEEE representation - * directly. - */ - - d = duk_to_number(thr, idx); - if (d <= 0.0) { - return 0; - } else if (d >= 255) { - return 255; - } else if (DUK_ISNAN(d)) { - /* Avoid NaN-to-integer coercion as it is compiler specific. */ - return 0; - } - - t = d - DUK_FLOOR(d); - if (t == 0.5) { - /* Exact halfway, round to even. */ - ret = (duk_uint8_t) d; - ret = (ret + 1) & 0xfe; /* Example: d=3.5, t=0.5 -> ret = (3 + 1) & 0xfe = 4 & 0xfe = 4 - * Example: d=4.5, t=0.5 -> ret = (4 + 1) & 0xfe = 5 & 0xfe = 4 - */ - } else { - /* Not halfway, round to nearest. */ - ret = (duk_uint8_t) (d + 0.5); - } - return ret; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -DUK_EXTERNAL const char *duk_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - DUK_ASSERT_API_ENTRY(thr); - - (void) duk_to_string(thr, idx); - DUK_ASSERT(duk_is_string(thr, idx)); - return duk_require_lstring(thr, idx, out_len); -} - -DUK_LOCAL duk_ret_t duk__safe_to_string_raw(duk_hthread *thr, void *udata) { - DUK_ASSERT_CTX_VALID(thr); - DUK_UNREF(udata); - - duk_to_string(thr, -1); - return 1; -} - -DUK_EXTERNAL const char *duk_safe_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) { - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - - /* We intentionally ignore the duk_safe_call() return value and only - * check the output type. This way we don't also need to check that - * the returned value is indeed a string in the success case. - */ - - duk_dup(thr, idx); - (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/); - if (!duk_is_string(thr, -1)) { - /* Error: try coercing error to string once. */ - (void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/); - if (!duk_is_string(thr, -1)) { - /* Double error */ - duk_pop_unsafe(thr); - duk_push_hstring_stridx(thr, DUK_STRIDX_UC_ERROR); - } else { - ; - } - } else { - /* String; may be a symbol, accepted. */ - ; - } - DUK_ASSERT(duk_is_string(thr, -1)); - - duk_replace(thr, idx); - DUK_ASSERT(duk_get_string(thr, idx) != NULL); - return duk_get_lstring(thr, idx, out_len); -} - -DUK_INTERNAL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - - duk_to_primitive(thr, idx, DUK_HINT_STRING); /* needed for e.g. Symbol objects */ - h = duk_get_hstring(thr, idx); - if (h == NULL) { - /* The "is string?" check may seem unnecessary, but as things - * are duk_to_hstring() invokes ToString() which fails for - * symbols. But since symbols are already strings for Duktape - * C API, we check for that before doing the coercion. - */ - h = duk_to_hstring(thr, idx); - } - DUK_ASSERT(h != NULL); - return h; -} - -#if defined(DUK_USE_DEBUGGER_SUPPORT) /* only needed by debugger for now */ -DUK_INTERNAL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - (void) duk_safe_to_string(thr, idx); - DUK_ASSERT(duk_is_string(thr, idx)); - DUK_ASSERT(duk_get_hstring(thr, idx) != NULL); - return duk_known_hstring(thr, idx); -} -#endif - -/* Push Object.prototype.toString() output for 'tv'. */ -DUK_INTERNAL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv) { - duk_small_uint_t stridx; - duk_hstring *h_strclass; - - DUK_ASSERT_API_ENTRY(thr); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNUSED: /* Treat like 'undefined', shouldn't happen. */ - case DUK_TAG_UNDEFINED: { - stridx = DUK_STRIDX_UC_UNDEFINED; - break; - } - case DUK_TAG_NULL: { - stridx = DUK_STRIDX_UC_NULL; - break; - } - case DUK_TAG_BOOLEAN: { - stridx = DUK_STRIDX_UC_BOOLEAN; - break; - } - case DUK_TAG_POINTER: { - stridx = DUK_STRIDX_UC_POINTER; - break; - } - case DUK_TAG_LIGHTFUNC: { - stridx = DUK_STRIDX_UC_FUNCTION; - break; - } - case DUK_TAG_STRING: { - duk_hstring *h; - h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - stridx = DUK_STRIDX_UC_SYMBOL; - } else { - stridx = DUK_STRIDX_UC_STRING; - } - break; - } - case DUK_TAG_OBJECT: { - duk_hobject *h; - duk_small_uint_t classnum; - - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - classnum = DUK_HOBJECT_GET_CLASS_NUMBER(h); - stridx = DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum); - - /* XXX: This is not entirely correct anymore; in ES2015 the - * default lookup should use @@toStringTag to come up with - * e.g. [object Symbol], [object Uint8Array], etc. See - * ES2015 Section 19.1.3.6. The downside of implementing that - * directly is that the @@toStringTag lookup may have side - * effects, so all call sites must be checked for that. - * Some may need a side-effect free lookup, e.g. avoiding - * getters which are not typical. - */ - break; - } - case DUK_TAG_BUFFER: { - stridx = DUK_STRIDX_UINT8_ARRAY; - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: - /* Fall through to generic number case. */ -#endif - default: { - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); /* number (maybe fastint) */ - stridx = DUK_STRIDX_UC_NUMBER; - break; - } - } - h_strclass = DUK_HTHREAD_GET_STRING(thr, stridx); - DUK_ASSERT(h_strclass != NULL); - - duk_push_sprintf(thr, "[object %s]", (const char *) DUK_HSTRING_GET_DATA(h_strclass)); -} - -/* XXX: other variants like uint, u32 etc */ -DUK_INTERNAL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped) { - duk_tval *tv; - duk_tval tv_tmp; - duk_double_t d, dmin, dmax; - duk_int_t res; - duk_bool_t clamped = 0; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - d = duk_js_tointeger(thr, tv); /* E5 Section 9.4, ToInteger() */ - - dmin = (duk_double_t) minval; - dmax = (duk_double_t) maxval; - - if (d < dmin) { - clamped = 1; - res = minval; - d = dmin; - } else if (d > dmax) { - clamped = 1; - res = maxval; - d = dmax; - } else { - res = (duk_int_t) d; - } - DUK_UNREF(d); /* SCANBUILD: with suitable dmin/dmax limits 'd' is unused */ - /* 'd' and 'res' agree here */ - - /* Relookup in case duk_js_tointeger() ends up e.g. coercing an object. */ - tv = duk_get_tval(thr, idx); - DUK_ASSERT(tv != NULL); /* not popped by side effect */ - DUK_TVAL_SET_TVAL(&tv_tmp, tv); -#if defined(DUK_USE_FASTINT) -#if (DUK_INT_MAX <= 0x7fffffffL) - DUK_TVAL_SET_I32(tv, res); -#else - /* Clamping needed if duk_int_t is 64 bits. */ - if (res >= DUK_FASTINT_MIN && res <= DUK_FASTINT_MAX) { - DUK_TVAL_SET_FASTINT(tv, res); - } else { - DUK_TVAL_SET_NUMBER(tv, d); - } -#endif -#else - DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */ -#endif - DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ - - if (out_clamped) { - *out_clamped = clamped; - } else { - /* coerced value is updated to value stack even when RangeError thrown */ - if (clamped) { - DUK_ERROR_RANGE(thr, DUK_STR_NUMBER_OUTSIDE_RANGE); - } - } - - return res; -} - -DUK_INTERNAL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_idx_t minval, duk_idx_t maxval) { - duk_bool_t dummy; - - DUK_ASSERT_API_ENTRY(thr); - - return duk_to_int_clamped_raw(thr, idx, minval, maxval, &dummy); -} - -DUK_INTERNAL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval) { - DUK_ASSERT_API_ENTRY(thr); - return duk_to_int_clamped_raw(thr, idx, minval, maxval, NULL); /* out_clamped==NULL -> RangeError if outside range */ -} - -DUK_EXTERNAL const char *duk_to_string(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: { - duk_push_hstring_stridx(thr, DUK_STRIDX_LC_UNDEFINED); - break; - } - case DUK_TAG_NULL: { - duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL); - break; - } - case DUK_TAG_BOOLEAN: { - if (DUK_TVAL_GET_BOOLEAN(tv)) { - duk_push_hstring_stridx(thr, DUK_STRIDX_TRUE); - } else { - duk_push_hstring_stridx(thr, DUK_STRIDX_FALSE); - } - break; - } - case DUK_TAG_STRING: { - /* Nop for actual strings, TypeError for Symbols. - * Because various internals rely on ToString() coercion of - * internal strings, -allow- (NOP) string coercion for hidden - * symbols. - */ -#if 1 - duk_hstring *h; - h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_STRING_COERCE_SYMBOL); - } else { - goto skip_replace; - } -#else - goto skip_replace; -#endif - } - case DUK_TAG_BUFFER: /* Go through Uint8Array.prototype.toString() for coercion. */ - case DUK_TAG_OBJECT: { - /* Plain buffers: go through ArrayBuffer.prototype.toString() - * for coercion. - * - * Symbol objects: duk_to_primitive() results in a plain symbol - * value, and duk_to_string() then causes a TypeError. - */ - duk_to_primitive(thr, idx, DUK_HINT_STRING); - DUK_ASSERT(!duk_is_buffer(thr, idx)); /* ToPrimitive() must guarantee */ - DUK_ASSERT(!duk_is_object(thr, idx)); - return duk_to_string(thr, idx); /* Note: recursive call */ - } - case DUK_TAG_POINTER: { - void *ptr = DUK_TVAL_GET_POINTER(tv); - if (ptr != NULL) { - duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) ptr); - } else { - /* Represent a null pointer as 'null' to be consistent with - * the JX format variant. Native '%p' format for a NULL - * pointer may be e.g. '(nil)'. - */ - duk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL); - } - break; - } - case DUK_TAG_LIGHTFUNC: { - /* Should match Function.prototype.toString() */ - duk_push_lightfunc_tostring(thr, tv); - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - /* number */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - duk_push_tval(thr, tv); - duk_numconv_stringify(thr, - 10 /*radix*/, - 0 /*precision:shortest*/, - 0 /*force_exponential*/); - break; - } - } - - duk_replace(thr, idx); - - skip_replace: - DUK_ASSERT(duk_is_string(thr, idx)); - return duk_require_string(thr, idx); -} - -DUK_INTERNAL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *ret; - - DUK_ASSERT_API_ENTRY(thr); - - duk_to_string(thr, idx); - ret = duk_get_hstring(thr, idx); - DUK_ASSERT(ret != NULL); - return ret; -} - -DUK_INTERNAL duk_hstring *duk_to_hstring_m1(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - return duk_to_hstring(thr, -1); -} - -DUK_INTERNAL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *ret; - - DUK_ASSERT_API_ENTRY(thr); - - ret = duk_get_hstring(thr, idx); - if (DUK_UNLIKELY(ret && DUK_HSTRING_HAS_SYMBOL(ret))) { - return ret; - } - return duk_to_hstring(thr, idx); -} - -/* Convert a plain buffer or any buffer object into a string, using the buffer - * bytes 1:1 in the internal string representation. For views the active byte - * slice (not element slice interpreted as an initializer) is used. This is - * necessary in Duktape 2.x because ToString(plainBuffer) no longer creates a - * string with the same bytes as in the buffer but rather (usually) - * '[object ArrayBuffer]'. - */ -DUK_EXTERNAL const char *duk_buffer_to_string(duk_hthread *thr, duk_idx_t idx) { - void *ptr_src; - duk_size_t len; - const char *res; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - - ptr_src = duk_require_buffer_data(thr, idx, &len); - DUK_ASSERT(ptr_src != NULL || len == 0); - - res = duk_push_lstring(thr, (const char *) ptr_src, len); - duk_replace(thr, idx); - return res; -} - -DUK_EXTERNAL void *duk_to_buffer_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, duk_uint_t mode) { - duk_hbuffer *h_buf; - const duk_uint8_t *src_data; - duk_size_t src_size; - duk_uint8_t *dst_data; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - - h_buf = duk_get_hbuffer(thr, idx); - if (h_buf != NULL) { - /* Buffer is kept as is, with the fixed/dynamic nature of the - * buffer only changed if requested. An external buffer - * is converted into a non-external dynamic buffer in a - * duk_to_dynamic_buffer() call. - */ - duk_uint_t tmp; - duk_uint8_t *tmp_ptr; - - tmp_ptr = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf); - src_data = (const duk_uint8_t *) tmp_ptr; - src_size = DUK_HBUFFER_GET_SIZE(h_buf); - - tmp = (DUK_HBUFFER_HAS_DYNAMIC(h_buf) ? DUK_BUF_MODE_DYNAMIC : DUK_BUF_MODE_FIXED); - if ((tmp == mode && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)) || - mode == DUK_BUF_MODE_DONTCARE) { - /* Note: src_data may be NULL if input is a zero-size - * dynamic buffer. - */ - dst_data = tmp_ptr; - goto skip_copy; - } - } else { - /* Non-buffer value is first ToString() coerced, then converted - * to a buffer (fixed buffer is used unless a dynamic buffer is - * explicitly requested). Symbols are rejected with a TypeError. - * XXX: C API could maybe allow symbol-to-buffer coercion? - */ - src_data = (const duk_uint8_t *) duk_to_lstring(thr, idx, &src_size); - } - - dst_data = (duk_uint8_t *) duk_push_buffer(thr, src_size, (mode == DUK_BUF_MODE_DYNAMIC) /*dynamic*/); - if (DUK_LIKELY(src_size > 0)) { - /* When src_size == 0, src_data may be NULL (if source - * buffer is dynamic), and dst_data may be NULL (if - * target buffer is dynamic). Avoid zero-size memcpy() - * with an invalid pointer. - */ - DUK_MEMCPY((void *) dst_data, (const void *) src_data, (size_t) src_size); - } - duk_replace(thr, idx); - skip_copy: - - if (out_size) { - *out_size = src_size; - } - return dst_data; -} - -DUK_EXTERNAL void *duk_to_pointer(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - void *res; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: - case DUK_TAG_BOOLEAN: - res = NULL; - break; - case DUK_TAG_POINTER: - res = DUK_TVAL_GET_POINTER(tv); - break; - case DUK_TAG_STRING: - case DUK_TAG_OBJECT: - case DUK_TAG_BUFFER: - /* Heap allocated: return heap pointer which is NOT useful - * for the caller, except for debugging. - */ - res = (void *) DUK_TVAL_GET_HEAPHDR(tv); - break; - case DUK_TAG_LIGHTFUNC: - /* Function pointers do not always cast correctly to void * - * (depends on memory and segmentation model for instance), - * so they coerce to NULL. - */ - res = NULL; - break; -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: - /* number */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - res = NULL; - break; - } - - duk_push_pointer(thr, res); - duk_replace(thr, idx); - return res; -} - -DUK_LOCAL void duk__push_func_from_lightfunc(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) { - duk_idx_t nargs; - duk_uint_t flags = 0; /* shared flags for a subset of types */ - duk_small_uint_t lf_len; - duk_hnatfunc *nf; - - nargs = (duk_idx_t) DUK_LFUNC_FLAGS_GET_NARGS(lf_flags); - if (nargs == DUK_LFUNC_NARGS_VARARGS) { - nargs = (duk_idx_t) DUK_VARARGS; - } - - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_CONSTRUCTABLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_NATFUNC | - DUK_HOBJECT_FLAG_NEWENV | - DUK_HOBJECT_FLAG_STRICT | - DUK_HOBJECT_FLAG_NOTAIL | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); - (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE); - - lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); - if ((duk_idx_t) lf_len != nargs) { - /* Explicit length is only needed if it differs from 'nargs'. */ - duk_push_int(thr, (duk_int_t) lf_len); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); - } - -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - duk_push_lightfunc_name_raw(thr, func, lf_flags); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); -#endif - - nf = duk_known_hnatfunc(thr, -1); - nf->magic = (duk_int16_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); -} - -DUK_EXTERNAL void duk_to_object(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_uint_t flags = 0; /* shared flags for a subset of types */ - duk_small_int_t proto = 0; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); - tv = DUK_GET_TVAL_POSIDX(thr, idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { -#if !defined(DUK_USE_BUFFEROBJECT_SUPPORT) - case DUK_TAG_BUFFER: /* With no bufferobject support, don't object coerce. */ -#endif - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE); - break; - } - case DUK_TAG_BOOLEAN: { - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BOOLEAN); - proto = DUK_BIDX_BOOLEAN_PROTOTYPE; - goto create_object; - } - case DUK_TAG_STRING: { - duk_hstring *h; - h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_SYMBOL); - proto = DUK_BIDX_SYMBOL_PROTOTYPE; - } else { - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING); - proto = DUK_BIDX_STRING_PROTOTYPE; - } - goto create_object; - } - case DUK_TAG_OBJECT: { - /* nop */ - break; - } -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - case DUK_TAG_BUFFER: { - /* A plain buffer object coerces to a full ArrayBuffer which - * is not fully transparent behavior (ToObject() should be a - * nop for an object). This behavior matches lightfuncs which - * also coerce to an equivalent Function object. There are - * also downsides to defining ToObject(plainBuffer) as a no-op; - * for example duk_to_hobject() could result in a NULL pointer. - */ - duk_hbuffer *h_buf; - - h_buf = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h_buf != NULL); - duk_hbufobj_push_uint8array_from_plain(thr, h_buf); - goto replace_value; - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - case DUK_TAG_POINTER: { - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER); - proto = DUK_BIDX_POINTER_PROTOTYPE; - goto create_object; - } - case DUK_TAG_LIGHTFUNC: { - /* Lightfunc coerces to a Function instance with concrete - * properties. Since 'length' is virtual for Duktape/C - * functions, don't need to define that. The result is made - * extensible to mimic what happens to strings in object - * coercion: - * - * > Object.isExtensible(Object('foo')) - * true - */ - duk_small_uint_t lf_flags; - duk_c_function func; - - DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); - duk__push_func_from_lightfunc(thr, func, lf_flags); - goto replace_value; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_NUMBER); - proto = DUK_BIDX_NUMBER_PROTOTYPE; - goto create_object; - } - } - DUK_ASSERT(duk_is_object(thr, idx)); - return; - - create_object: - (void) duk_push_object_helper(thr, flags, proto); - - /* Note: Boolean prototype's internal value property is not writable, - * but duk_xdef_prop_stridx() disregards the write protection. Boolean - * instances are immutable. - * - * String and buffer special behaviors are already enabled which is not - * ideal, but a write to the internal value is not affected by them. - */ - duk_dup(thr, idx); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); - - replace_value: - duk_replace(thr, idx); - DUK_ASSERT(duk_is_object(thr, idx)); -} - -DUK_INTERNAL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *ret; - - DUK_ASSERT_API_ENTRY(thr); - - duk_to_object(thr, idx); - ret = duk_known_hobject(thr, idx); - return ret; -} - -/* - * Type checking - */ - -DUK_LOCAL duk_bool_t duk__tag_check(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t tag) { - duk_tval *tv; - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - return (DUK_TVAL_GET_TAG(tv) == tag); -} - -DUK_LOCAL duk_bool_t duk__obj_flag_any_default_false(duk_hthread *thr, duk_idx_t idx, duk_uint_t flag_mask) { - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_get_hobject(thr, idx); - if (obj) { - return (DUK_HEAPHDR_CHECK_FLAG_BITS((duk_heaphdr *) obj, flag_mask) ? 1 : 0); - } - return 0; -} - -DUK_INTERNAL duk_int_t duk_get_type_tval(duk_tval *tv) { - DUK_ASSERT(tv != NULL); - -#if defined(DUK_USE_PACKED_TVAL) - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNUSED: - return DUK_TYPE_NONE; - case DUK_TAG_UNDEFINED: - return DUK_TYPE_UNDEFINED; - case DUK_TAG_NULL: - return DUK_TYPE_NULL; - case DUK_TAG_BOOLEAN: - return DUK_TYPE_BOOLEAN; - case DUK_TAG_STRING: - return DUK_TYPE_STRING; - case DUK_TAG_OBJECT: - return DUK_TYPE_OBJECT; - case DUK_TAG_BUFFER: - return DUK_TYPE_BUFFER; - case DUK_TAG_POINTER: - return DUK_TYPE_POINTER; - case DUK_TAG_LIGHTFUNC: - return DUK_TYPE_LIGHTFUNC; -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: - /* Note: number has no explicit tag (in 8-byte representation) */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - return DUK_TYPE_NUMBER; - } -#else /* DUK_USE_PACKED_TVAL */ - DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv)); - DUK_ASSERT(sizeof(duk__type_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1); - return (duk_int_t) duk__type_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN]; -#endif /* DUK_USE_PACKED_TVAL */ -} - -DUK_EXTERNAL duk_int_t duk_get_type(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - return duk_get_type_tval(tv); -} - -#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS) -DUK_LOCAL const char * const duk__type_names[] = { - "none", - "undefined", - "null", - "boolean", - "number", - "string", - "object", - "buffer", - "pointer", - "lightfunc" -}; - -DUK_INTERNAL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx) { - duk_int_t type_tag; - - DUK_ASSERT_API_ENTRY(thr); - - type_tag = duk_get_type(thr, idx); - DUK_ASSERT(type_tag >= DUK_TYPE_MIN && type_tag <= DUK_TYPE_MAX); - DUK_ASSERT(DUK_TYPE_MIN == 0 && sizeof(duk__type_names) / sizeof(const char *) == DUK_TYPE_MAX + 1); - - return duk__type_names[type_tag]; -} -#endif /* DUK_USE_VERBOSE_ERRORS && DUK_USE_PARANOID_ERRORS */ - -DUK_INTERNAL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_OBJECT: - obj = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(obj != NULL); - return DUK_HOBJECT_GET_CLASS_NUMBER(obj); - case DUK_TAG_BUFFER: - /* Buffers behave like Uint8Array objects. */ - return DUK_HOBJECT_CLASS_UINT8ARRAY; - case DUK_TAG_LIGHTFUNC: - /* Lightfuncs behave like Function objects. */ - return DUK_HOBJECT_CLASS_FUNCTION; - default: - /* Primitive or UNUSED, no class number. */ - return DUK_HOBJECT_CLASS_NONE; - } -} - -DUK_EXTERNAL duk_bool_t duk_check_type(duk_hthread *thr, duk_idx_t idx, duk_int_t type) { - DUK_ASSERT_API_ENTRY(thr); - - return (duk_get_type(thr, idx) == type) ? 1 : 0; -} - -DUK_INTERNAL duk_uint_t duk_get_type_mask_tval(duk_tval *tv) { - DUK_ASSERT(tv != NULL); - -#if defined(DUK_USE_PACKED_TVAL) - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNUSED: - return DUK_TYPE_MASK_NONE; - case DUK_TAG_UNDEFINED: - return DUK_TYPE_MASK_UNDEFINED; - case DUK_TAG_NULL: - return DUK_TYPE_MASK_NULL; - case DUK_TAG_BOOLEAN: - return DUK_TYPE_MASK_BOOLEAN; - case DUK_TAG_STRING: - return DUK_TYPE_MASK_STRING; - case DUK_TAG_OBJECT: - return DUK_TYPE_MASK_OBJECT; - case DUK_TAG_BUFFER: - return DUK_TYPE_MASK_BUFFER; - case DUK_TAG_POINTER: - return DUK_TYPE_MASK_POINTER; - case DUK_TAG_LIGHTFUNC: - return DUK_TYPE_MASK_LIGHTFUNC; -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: - /* Note: number has no explicit tag (in 8-byte representation) */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - return DUK_TYPE_MASK_NUMBER; - } -#else /* DUK_USE_PACKED_TVAL */ - DUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv)); - DUK_ASSERT(sizeof(duk__type_mask_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1); - return duk__type_mask_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN]; -#endif /* DUK_USE_PACKED_TVAL */ -} - -DUK_EXTERNAL duk_uint_t duk_get_type_mask(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - return duk_get_type_mask_tval(tv); -} - -DUK_EXTERNAL duk_bool_t duk_check_type_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t mask) { - DUK_ASSERT_API_ENTRY(thr); - - if (DUK_LIKELY((duk_get_type_mask(thr, idx) & mask) != 0U)) { - return 1; - } - if (mask & DUK_TYPE_MASK_THROW) { - DUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE); - DUK_UNREACHABLE(); - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_undefined(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_UNDEFINED); -} - -DUK_EXTERNAL duk_bool_t duk_is_null(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_NULL); -} - -DUK_EXTERNAL duk_bool_t duk_is_boolean(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_BOOLEAN); -} - -DUK_EXTERNAL duk_bool_t duk_is_number(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - /* - * Number is special because it doesn't have a specific - * tag in the 8-byte representation. - */ - - /* XXX: shorter version for unpacked representation? */ - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - return DUK_TVAL_IS_NUMBER(tv); -} - -DUK_EXTERNAL duk_bool_t duk_is_nan(duk_hthread *thr, duk_idx_t idx) { - /* XXX: This will now return false for non-numbers, even though they would - * coerce to NaN (as a general rule). In particular, duk_get_number() - * returns a NaN for non-numbers, so should this function also return - * true for non-numbers? - */ - - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - - /* XXX: for packed duk_tval an explicit "is number" check is unnecessary */ - if (!DUK_TVAL_IS_NUMBER(tv)) { - return 0; - } - return (duk_bool_t) DUK_ISNAN(DUK_TVAL_GET_NUMBER(tv)); -} - -DUK_EXTERNAL duk_bool_t duk_is_string(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_STRING); -} - -DUK_INTERNAL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk_get_hstring_notsymbol(thr, idx) != NULL; -} - -DUK_EXTERNAL duk_bool_t duk_is_object(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_OBJECT); -} - -DUK_EXTERNAL duk_bool_t duk_is_buffer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_BUFFER); -} - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_BUFFER(tv)) { - return 1; - } else if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (DUK_HOBJECT_IS_BUFOBJ(h)) { - return 1; - } - } - return 0; -} -#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ -DUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - - return duk_is_buffer(thr, idx); -} - -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -DUK_EXTERNAL duk_bool_t duk_is_pointer(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_POINTER); -} - -DUK_EXTERNAL duk_bool_t duk_is_lightfunc(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__tag_check(thr, idx, DUK_TAG_LIGHTFUNC); -} - -DUK_EXTERNAL duk_bool_t duk_is_symbol(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - DUK_ASSERT_API_ENTRY(thr); - h = duk_get_hstring(thr, idx); - /* Use DUK_LIKELY() here because caller may be more likely to type - * check an expected symbol than not. - */ - if (DUK_LIKELY(h != NULL && DUK_HSTRING_HAS_SYMBOL(h))) { - return 1; - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_array(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_get_hobject(thr, idx); - if (obj) { - return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_ARRAY ? 1 : 0); - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_function(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0; - } - if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - return 1; - } - return 0; -} - -DUK_INTERNAL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_UNREF(thr); - - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - return DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0; - } - if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - return 1; - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_constructable(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - return DUK_HOBJECT_HAS_CONSTRUCTABLE(h) ? 1 : 0; - } - if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - return 1; - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_c_function(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__obj_flag_any_default_false(thr, - idx, - DUK_HOBJECT_FLAG_NATFUNC); -} - -DUK_EXTERNAL duk_bool_t duk_is_ecmascript_function(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__obj_flag_any_default_false(thr, - idx, - DUK_HOBJECT_FLAG_COMPFUNC); -} - -DUK_EXTERNAL duk_bool_t duk_is_bound_function(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk__obj_flag_any_default_false(thr, - idx, - DUK_HOBJECT_FLAG_BOUNDFUNC); -} - -DUK_EXTERNAL duk_bool_t duk_is_thread(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *obj; - - DUK_ASSERT_API_ENTRY(thr); - - obj = duk_get_hobject(thr, idx); - if (obj) { - return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_THREAD ? 1 : 0); - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_fixed_buffer(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_BUFFER(tv)) { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - return (DUK_HBUFFER_HAS_DYNAMIC(h) ? 0 : 1); - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_dynamic_buffer(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_BUFFER(tv)) { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - return (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); - } - return 0; -} - -DUK_EXTERNAL duk_bool_t duk_is_external_buffer(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_get_tval_or_unused(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_BUFFER(tv)) { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - return (DUK_HBUFFER_HAS_DYNAMIC(h) && DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); - } - return 0; -} - -DUK_EXTERNAL duk_errcode_t duk_get_error_code(duk_hthread *thr, duk_idx_t idx) { - duk_hobject *h; - duk_uint_t sanity; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_get_hobject(thr, idx); - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (!h) { - return DUK_ERR_NONE; - } - - /* XXX: something more convenient? */ - - if (h == thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]) { - return DUK_ERR_EVAL_ERROR; - } - if (h == thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]) { - return DUK_ERR_RANGE_ERROR; - } - if (h == thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]) { - return DUK_ERR_REFERENCE_ERROR; - } - if (h == thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]) { - return DUK_ERR_SYNTAX_ERROR; - } - if (h == thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]) { - return DUK_ERR_TYPE_ERROR; - } - if (h == thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]) { - return DUK_ERR_URI_ERROR; - } - if (h == thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]) { - return DUK_ERR_ERROR; - } - - h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); - } while (--sanity > 0); - - return DUK_ERR_NONE; -} - -/* - * Pushers - */ - -DUK_INTERNAL void duk_push_tval(duk_hthread *thr, duk_tval *tv) { - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(tv != NULL); - - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_TVAL(tv_slot, tv); - DUK_TVAL_INCREF(thr, tv); /* no side effects */ -} - -DUK_EXTERNAL void duk_push_undefined(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - - /* Because value stack init policy is 'undefined above top', - * we don't need to write, just assert. - */ - thr->valstack_top++; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); -} - -DUK_EXTERNAL void duk_push_null(duk_hthread *thr) { - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_NULL(tv_slot); -} - -DUK_EXTERNAL void duk_push_boolean(duk_hthread *thr, duk_bool_t val) { - duk_tval *tv_slot; - duk_small_int_t b; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - b = (val ? 1 : 0); /* ensure value is 1 or 0 (not other non-zero) */ - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_BOOLEAN(tv_slot, b); -} - -DUK_EXTERNAL void duk_push_true(duk_hthread *thr) { - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_BOOLEAN_TRUE(tv_slot); -} - -DUK_EXTERNAL void duk_push_false(duk_hthread *thr) { - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_BOOLEAN_FALSE(tv_slot); -} - -/* normalize NaN which may not match our canonical internal NaN */ -DUK_EXTERNAL void duk_push_number(duk_hthread *thr, duk_double_t val) { - duk_tval *tv_slot; - duk_double_union du; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - du.d = val; - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_NUMBER(tv_slot, du.d); -} - -DUK_EXTERNAL void duk_push_int(duk_hthread *thr, duk_int_t val) { -#if defined(DUK_USE_FASTINT) - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; -#if DUK_INT_MAX <= 0x7fffffffL - DUK_TVAL_SET_I32(tv_slot, (duk_int32_t) val); -#else - if (val >= DUK_FASTINT_MIN && val <= DUK_FASTINT_MAX) { - DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); - } else { - duk_double_t = (duk_double_t) val; - DUK_TVAL_SET_NUMBER(tv_slot, d); - } -#endif -#else /* DUK_USE_FASTINT */ - duk_tval *tv_slot; - duk_double_t d; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - d = (duk_double_t) val; - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_NUMBER(tv_slot, d); -#endif /* DUK_USE_FASTINT */ -} - -DUK_EXTERNAL void duk_push_uint(duk_hthread *thr, duk_uint_t val) { -#if defined(DUK_USE_FASTINT) - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; -#if DUK_UINT_MAX <= 0xffffffffUL - DUK_TVAL_SET_U32(tv_slot, (duk_uint32_t) val); -#else - if (val <= DUK_FASTINT_MAX) { /* val is unsigned so >= 0 */ - /* XXX: take advantage of val being unsigned, no need to mask */ - DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); - } else { - duk_double_t = (duk_double_t) val; - DUK_TVAL_SET_NUMBER(tv_slot, d); - } -#endif -#else /* DUK_USE_FASTINT */ - duk_tval *tv_slot; - duk_double_t d; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - d = (duk_double_t) val; - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_NUMBER(tv_slot, d); -#endif /* DUK_USE_FASTINT */ -} - -DUK_EXTERNAL void duk_push_nan(duk_hthread *thr) { - duk_tval *tv_slot; - duk_double_union du; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - DUK_DBLUNION_SET_NAN(&du); - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_NUMBER(tv_slot, du.d); -} - -DUK_EXTERNAL const char *duk_push_lstring(duk_hthread *thr, const char *str, duk_size_t len) { - duk_hstring *h; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - /* check stack before interning (avoid hanging temp) */ - DUK__CHECK_SPACE(); - - /* NULL with zero length represents an empty string; NULL with higher - * length is also now trated like an empty string although it is - * a bit dubious. This is unlike duk_push_string() which pushes a - * 'null' if the input string is a NULL. - */ - if (!str) { - len = 0; - } - - /* Check for maximum string length */ - if (DUK_UNLIKELY(len > DUK_HSTRING_MAX_BYTELEN)) { - DUK_ERROR_RANGE(thr, DUK_STR_STRING_TOO_LONG); - } - - h = duk_heap_strtable_intern_checked(thr, (const duk_uint8_t *) str, (duk_uint32_t) len); - DUK_ASSERT(h != NULL); - - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_STRING(tv_slot, h); - DUK_HSTRING_INCREF(thr, h); /* no side effects */ - - return (const char *) DUK_HSTRING_GET_DATA(h); -} - -DUK_EXTERNAL const char *duk_push_string(duk_hthread *thr, const char *str) { - DUK_ASSERT_API_ENTRY(thr); - - if (str) { - return duk_push_lstring(thr, str, DUK_STRLEN(str)); - } else { - duk_push_null(thr); - return NULL; - } -} - -DUK_EXTERNAL void duk_push_pointer(duk_hthread *thr, void *val) { - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK__CHECK_SPACE(); - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_POINTER(tv_slot, val); -} - -DUK_INTERNAL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i) { - duk_hstring *h_tmp; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: this could be a direct DUK_SPRINTF to a buffer followed by duk_push_string() */ - duk_push_uint(thr, (duk_uint_t) i); - h_tmp = duk_to_hstring_m1(thr); - DUK_ASSERT(h_tmp != NULL); - return h_tmp; -} - -DUK_LOCAL void duk__push_this_helper(duk_hthread *thr, duk_small_uint_t check_object_coercible) { - duk_tval *tv_slot; - - DUK__CHECK_SPACE(); - - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* because of valstack init policy */ - tv_slot = thr->valstack_top++; - - if (DUK_UNLIKELY(thr->callstack_curr == NULL)) { - if (check_object_coercible) { - goto type_error; - } - /* 'undefined' already on stack top */ - } else { - duk_tval *tv; - - /* 'this' binding is just before current activation's bottom */ - DUK_ASSERT(thr->valstack_bottom > thr->valstack); - tv = thr->valstack_bottom - 1; - if (check_object_coercible && - (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv))) { - /* XXX: better macro for DUK_TVAL_IS_UNDEFINED_OR_NULL(tv) */ - goto type_error; - } - - DUK_TVAL_SET_TVAL(tv_slot, tv); - DUK_TVAL_INCREF(thr, tv); - } - return; - - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE); -} - -DUK_EXTERNAL void duk_push_this(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk__push_this_helper(thr, 0 /*check_object_coercible*/); -} - -DUK_INTERNAL void duk_push_this_check_object_coercible(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk__push_this_helper(thr, 1 /*check_object_coercible*/); -} - -DUK_INTERNAL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - duk__push_this_helper(thr, 1 /*check_object_coercible*/); - h = duk_to_hobject(thr, -1); - DUK_ASSERT(h != NULL); - return h; -} - -DUK_INTERNAL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk__push_this_helper(thr, 1 /*check_object_coercible*/); - return duk_to_hstring_m1(thr); /* This will reject all Symbol values; accepts Symbol objects. */ -} - -DUK_INTERNAL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_ASSERT(thr->callstack_top > 0); /* caller required to know */ - DUK_ASSERT(thr->callstack_curr != NULL); /* caller required to know */ - DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* consequence of above */ - DUK_ASSERT(thr->valstack_bottom - 1 >= thr->valstack); /* 'this' binding exists */ - - return thr->valstack_bottom - 1; -} - -DUK_EXTERNAL void duk_push_current_function(duk_hthread *thr) { - duk_activation *act; - - DUK_ASSERT_API_ENTRY(thr); - - act = thr->callstack_curr; - if (act != NULL) { - duk_push_tval(thr, &act->tv_func); - } else { - duk_push_undefined(thr); - } -} - -DUK_EXTERNAL void duk_push_current_thread(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - if (thr->heap->curr_thread) { - duk_push_hobject(thr, (duk_hobject *) thr->heap->curr_thread); - } else { - duk_push_undefined(thr); - } -} - -DUK_EXTERNAL void duk_push_global_object(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL); -} - -/* XXX: size optimize */ -DUK_LOCAL void duk__push_stash(duk_hthread *thr) { - if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE)) { - DUK_DDD(DUK_DDDPRINT("creating heap/global/thread stash on first use")); - duk_pop_unsafe(thr); - duk_push_bare_object(thr); - duk_dup_top(thr); - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_C); /* [ ... parent stash stash ] -> [ ... parent stash ] */ - } - duk_remove_m2(thr); -} - -DUK_EXTERNAL void duk_push_heap_stash(duk_hthread *thr) { - duk_heap *heap; - DUK_ASSERT_API_ENTRY(thr); - heap = thr->heap; - DUK_ASSERT(heap->heap_object != NULL); - duk_push_hobject(thr, heap->heap_object); - duk__push_stash(thr); -} - -DUK_EXTERNAL void duk_push_global_stash(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_push_global_object(thr); - duk__push_stash(thr); -} - -DUK_EXTERNAL void duk_push_thread_stash(duk_hthread *thr, duk_hthread *target_thr) { - DUK_ASSERT_API_ENTRY(thr); - if (DUK_UNLIKELY(target_thr == NULL)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return; /* not reached */ - } - duk_push_hobject(thr, (duk_hobject *) target_thr); - duk__push_stash(thr); -} - -/* XXX: duk_ssize_t would be useful here */ -DUK_LOCAL duk_int_t duk__try_push_vsprintf(duk_hthread *thr, void *buf, duk_size_t sz, const char *fmt, va_list ap) { - duk_int_t len; - - DUK_ASSERT_CTX_VALID(thr); - DUK_UNREF(thr); - - /* NUL terminator handling doesn't matter here */ - len = DUK_VSNPRINTF((char *) buf, sz, fmt, ap); - if (len < (duk_int_t) sz) { - /* Return value of 'sz' or more indicates output was (potentially) - * truncated. - */ - return (duk_int_t) len; - } - return -1; -} - -DUK_EXTERNAL const char *duk_push_vsprintf(duk_hthread *thr, const char *fmt, va_list ap) { - duk_uint8_t stack_buf[DUK_PUSH_SPRINTF_INITIAL_SIZE]; - duk_size_t sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; - duk_bool_t pushed_buf = 0; - void *buf; - duk_int_t len; /* XXX: duk_ssize_t */ - const char *res; - - DUK_ASSERT_API_ENTRY(thr); - - /* special handling of fmt==NULL */ - if (!fmt) { - duk_hstring *h_str; - duk_push_hstring_empty(thr); - h_str = duk_known_hstring(thr, -1); - return (const char *) DUK_HSTRING_GET_DATA(h_str); - } - - /* initial estimate based on format string */ - sz = DUK_STRLEN(fmt) + 16; /* format plus something to avoid just missing */ - if (sz < DUK_PUSH_SPRINTF_INITIAL_SIZE) { - sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; - } - DUK_ASSERT(sz > 0); - - /* Try to make do with a stack buffer to avoid allocating a temporary buffer. - * This works 99% of the time which is quite nice. - */ - for (;;) { - va_list ap_copy; /* copied so that 'ap' can be reused */ - - if (sz <= sizeof(stack_buf)) { - buf = stack_buf; - } else if (!pushed_buf) { - pushed_buf = 1; - buf = duk_push_dynamic_buffer(thr, sz); - } else { - buf = duk_resize_buffer(thr, -1, sz); - } - DUK_ASSERT(buf != NULL); - - DUK_VA_COPY(ap_copy, ap); - len = duk__try_push_vsprintf(thr, buf, sz, fmt, ap_copy); - va_end(ap_copy); - if (len >= 0) { - break; - } - - /* failed, resize and try again */ - sz = sz * 2; - if (DUK_UNLIKELY(sz >= DUK_PUSH_SPRINTF_SANITY_LIMIT)) { - DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); - } - } - - /* Cannot use duk_buffer_to_string() on the buffer because it is - * usually larger than 'len'; 'buf' is also usually a stack buffer. - */ - res = duk_push_lstring(thr, (const char *) buf, (duk_size_t) len); /* [ buf? res ] */ - if (pushed_buf) { - duk_remove_m2(thr); - } - return res; -} - -DUK_EXTERNAL const char *duk_push_sprintf(duk_hthread *thr, const char *fmt, ...) { - va_list ap; - const char *ret; - - DUK_ASSERT_API_ENTRY(thr); - - /* allow fmt==NULL */ - va_start(ap, fmt); - ret = duk_push_vsprintf(thr, fmt, ap); - va_end(ap); - - return ret; -} - -DUK_INTERNAL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { - duk_tval *tv_slot; - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(prototype_bidx == -1 || - (prototype_bidx >= 0 && prototype_bidx < DUK_NUM_BUILTINS)); - - DUK__CHECK_SPACE(); - - h = duk_hobject_alloc(thr, hobject_flags_and_class); - DUK_ASSERT(h != NULL); - - DUK_DDD(DUK_DDDPRINT("created object with flags: 0x%08lx", (unsigned long) h->hdr.h_flags)); - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, h); - DUK_HOBJECT_INCREF(thr, h); /* no side effects */ - thr->valstack_top++; - - /* object is now reachable */ - - if (prototype_bidx >= 0) { - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, thr->builtins[prototype_bidx]); - } else { - DUK_ASSERT(prototype_bidx == -1); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL); - } - - return h; -} - -DUK_INTERNAL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto) { - duk_hobject *h; - - DUK_ASSERT_API_ENTRY(thr); - - h = duk_push_object_helper(thr, hobject_flags_and_class, -1); - DUK_ASSERT(h != NULL); - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, proto); - return h; -} - -DUK_EXTERNAL duk_idx_t duk_push_object(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - DUK_BIDX_OBJECT_PROTOTYPE); - return duk_get_top_index_unsafe(thr); -} - -DUK_EXTERNAL duk_idx_t duk_push_array(duk_hthread *thr) { - duk_uint_t flags; - duk_harray *obj; - duk_idx_t ret; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_ARRAY_PART | - DUK_HOBJECT_FLAG_EXOTIC_ARRAY | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY); - - obj = duk_harray_alloc(thr, flags); - DUK_ASSERT(obj != NULL); - - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_ARRAY_PROTOTYPE]); - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HOBJECT_INCREF(thr, obj); /* XXX: could preallocate with refcount = 1 */ - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - thr->valstack_top++; - - DUK_ASSERT(obj->length == 0); /* Array .length starts at zero. */ - return ret; -} - -DUK_INTERNAL duk_harray *duk_push_harray(duk_hthread *thr) { - /* XXX: API call could do this directly, cast to void in API macro. */ - duk_harray *a; - - DUK_ASSERT_API_ENTRY(thr); - - (void) duk_push_array(thr); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(thr->valstack_top - 1)); - a = (duk_harray *) DUK_TVAL_GET_OBJECT(thr->valstack_top - 1); - DUK_ASSERT(a != NULL); - return a; -} - -/* Push a duk_harray with preallocated size (.length also set to match size). - * Caller may then populate array part of the duk_harray directly. - */ -DUK_INTERNAL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size) { - duk_harray *a; - - DUK_ASSERT_API_ENTRY(thr); - - a = duk_push_harray(thr); - - duk_hobject_realloc_props(thr, - (duk_hobject *) a, - 0, - size, - 0, - 0); - a->length = size; - return a; -} - -DUK_INTERNAL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size) { - duk_harray *a; - - DUK_ASSERT_API_ENTRY(thr); - - a = duk_push_harray_with_size(thr, size); - DUK_ASSERT(a != NULL); - return DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a); -} - -DUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_hthread *thr, duk_uint_t flags) { - duk_hthread *obj; - duk_idx_t ret; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - - obj = duk_hthread_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); - DUK_ASSERT(obj != NULL); - obj->state = DUK_HTHREAD_STATE_INACTIVE; -#if defined(DUK_USE_ROM_STRINGS) - /* Nothing to initialize, strs[] is in ROM. */ -#else -#if defined(DUK_USE_HEAPPTR16) - obj->strs16 = thr->strs16; -#else - obj->strs = thr->strs; -#endif -#endif - DUK_DDD(DUK_DDDPRINT("created thread object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); - - /* make the new thread reachable */ - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HTHREAD_INCREF(thr, obj); - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - thr->valstack_top++; - - /* important to do this *after* pushing, to make the thread reachable for gc */ - if (DUK_UNLIKELY(!duk_hthread_init_stacks(thr->heap, obj))) { - DUK_ERROR_ALLOC_FAILED(thr); - } - - /* initialize built-ins - either by copying or creating new ones */ - if (flags & DUK_THREAD_NEW_GLOBAL_ENV) { - duk_hthread_create_builtin_objects(obj); - } else { - duk_hthread_copy_builtin_objects(thr, obj); - } - - /* default prototype */ - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, obj->builtins[DUK_BIDX_THREAD_PROTOTYPE]); - - /* Initial stack size satisfies the stack slack constraints so there - * is no need to require stack here. - */ - DUK_ASSERT(DUK_VALSTACK_INITIAL_SIZE >= - DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); - - return ret; -} - -DUK_INTERNAL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr) { - duk_hcompfunc *obj; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - - /* Template functions are not strictly constructable (they don't - * have a "prototype" property for instance), so leave the - * DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here. - */ - - obj = duk_hcompfunc_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_FLAG_COMPFUNC | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION)); - if (DUK_UNLIKELY(obj == NULL)) { - DUK_ERROR_ALLOC_FAILED(thr); - } - - DUK_DDD(DUK_DDDPRINT("created compiled function object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HOBJECT_INCREF(thr, obj); - thr->valstack_top++; - - /* default prototype */ - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL); - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - - return obj; -} - -DUK_INTERNAL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr) { - duk_hboundfunc *obj; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - obj = duk_hboundfunc_alloc(thr->heap, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BOUNDFUNC | - DUK_HOBJECT_FLAG_CONSTRUCTABLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION)); - if (!obj) { - DUK_ERROR_ALLOC_FAILED(thr); - } - - tv_slot = thr->valstack_top++; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HOBJECT_INCREF(thr, obj); - - /* Prototype is left as NULL because the caller always sets it (and - * it depends on the target function). - */ - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL); - - return obj; -} - -DUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx) { - duk_hnatfunc *obj; - duk_idx_t ret; - duk_tval *tv_slot; - duk_int16_t func_nargs; - - DUK_ASSERT_CTX_VALID(thr); - - DUK__CHECK_SPACE(); - - if (DUK_UNLIKELY(func == NULL)) { - goto api_error; - } - if (nargs >= 0 && nargs < DUK_HNATFUNC_NARGS_MAX) { - func_nargs = (duk_int16_t) nargs; - } else if (nargs == DUK_VARARGS) { - func_nargs = DUK_HNATFUNC_NARGS_VARARGS; - } else { - goto api_error; - } - - obj = duk_hnatfunc_alloc(thr, flags); - DUK_ASSERT(obj != NULL); - - obj->func = func; - obj->nargs = func_nargs; - - DUK_DDD(DUK_DDDPRINT("created native function object with flags: 0x%08lx, nargs=%ld", - (unsigned long) obj->obj.hdr.h_flags, (long) obj->nargs)); - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HOBJECT_INCREF(thr, obj); - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - thr->valstack_top++; - - DUK_ASSERT_BIDX_VALID(proto_bidx); - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[proto_bidx]); - return ret; - - api_error: - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return 0; /* not reached */ -} - -DUK_EXTERNAL duk_idx_t duk_push_c_function(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_CONSTRUCTABLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_NATFUNC | - DUK_HOBJECT_FLAG_NEWENV | - DUK_HOBJECT_FLAG_STRICT | - DUK_HOBJECT_FLAG_NOTAIL | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); - - /* Default prototype is a Duktape specific %NativeFunctionPrototype% - * which provides .length and .name getters. - */ - return duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE); -} - -DUK_INTERNAL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_CONSTRUCTABLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_NATFUNC | - DUK_HOBJECT_FLAG_NEWENV | - DUK_HOBJECT_FLAG_STRICT | - DUK_HOBJECT_FLAG_NOTAIL | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); - - /* Must use Function.prototype for standard built-in functions. */ - (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE); -} - -DUK_INTERNAL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs) { - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_CALLABLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_NATFUNC | - DUK_HOBJECT_FLAG_NEWENV | - DUK_HOBJECT_FLAG_STRICT | - DUK_HOBJECT_FLAG_NOTAIL | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); - - /* Must use Function.prototype for standard built-in functions. */ - (void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE); -} - -DUK_EXTERNAL duk_idx_t duk_push_c_lightfunc(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic) { - duk_small_uint_t lf_flags; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - - if (nargs >= DUK_LFUNC_NARGS_MIN && nargs <= DUK_LFUNC_NARGS_MAX) { - /* as is */ - } else if (nargs == DUK_VARARGS) { - nargs = DUK_LFUNC_NARGS_VARARGS; - } else { - goto api_error; - } - if (DUK_UNLIKELY(!(length >= DUK_LFUNC_LENGTH_MIN && length <= DUK_LFUNC_LENGTH_MAX))) { - goto api_error; - } - if (DUK_UNLIKELY(!(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX))) { - goto api_error; - } - - lf_flags = DUK_LFUNC_FLAGS_PACK((duk_small_int_t) magic, (duk_small_uint_t) length, (duk_small_uint_t) nargs); - tv_slot = thr->valstack_top++; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_slot)); - DUK_TVAL_SET_LIGHTFUNC(tv_slot, func, lf_flags); - DUK_ASSERT(tv_slot >= thr->valstack_bottom); - return (duk_idx_t) (tv_slot - thr->valstack_bottom); - - api_error: - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return 0; /* not reached */ -} - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { - duk_hbufobj *obj; - duk_tval *tv_slot; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(prototype_bidx >= 0); - - DUK__CHECK_SPACE(); - - obj = duk_hbufobj_alloc(thr, hobject_flags_and_class); - DUK_ASSERT(obj != NULL); - - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]); - DUK_ASSERT_HBUFOBJ_VALID(obj); - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); - DUK_HOBJECT_INCREF(thr, obj); - thr->valstack_top++; - - return obj; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* XXX: There's quite a bit of overlap with buffer creation handling in - * duk_bi_buffer.c. Look for overlap and refactor. - */ -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#define DUK__PACK_ARGS(classnum,protobidx,elemtype,elemshift,istypedarray) \ - (((classnum) << 24) | ((protobidx) << 16) | ((elemtype) << 8) | ((elemshift) << 4) | (istypedarray)) - -static const duk_uint32_t duk__bufobj_flags_lookup[] = { - /* Node.js Buffers are Uint8Array instances which inherit from Buffer.prototype. */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_ARRAYBUFFER, DUK_BIDX_ARRAYBUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_ARRAYBUFFER */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_NODEJS_BUFFER */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_DATAVIEW, DUK_BIDX_DATAVIEW_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_DATAVIEW */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT8ARRAY, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT8, 0, 1), /* DUK_BUFOBJ_INT8ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_UINT8ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8CLAMPED, 0, 1), /* DUK_BUFOBJ_UINT8CLAMPEDARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT16ARRAY, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT16, 1, 1), /* DUK_BUFOBJ_INT16ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT16ARRAY, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT16, 1, 1), /* DUK_BUFOBJ_UINT16ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT32ARRAY, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_INT32, 2, 1), /* DUK_BUFOBJ_INT32ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT32ARRAY, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT32, 2, 1), /* DUK_BUFOBJ_UINT32ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT32ARRAY, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT32, 2, 1), /* DUK_BUFOBJ_FLOAT32ARRAY */ - DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT64ARRAY, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_FLOAT64, 3, 1) /* DUK_BUFOBJ_FLOAT64ARRAY */ -}; -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) { - duk_hbufobj *h_bufobj; - duk_hbuffer *h_val; - duk_hobject *h_arraybuf; - duk_uint32_t tmp; - duk_uint_t classnum; - duk_uint_t protobidx; - duk_uint_t lookupidx; - duk_uint_t uint_offset, uint_length, uint_added; - - DUK_ASSERT_API_ENTRY(thr); - - /* The underlying types for offset/length in duk_hbufobj is - * duk_uint_t; make sure argument values fit. - */ - uint_offset = (duk_uint_t) byte_offset; - uint_length = (duk_uint_t) byte_length; - if (sizeof(duk_size_t) != sizeof(duk_uint_t)) { - if (DUK_UNLIKELY((duk_size_t) uint_offset != byte_offset || (duk_size_t) uint_length != byte_length)) { - goto range_error; - } - } - - DUK_ASSERT_DISABLE(flags >= 0); /* flags is unsigned */ - lookupidx = flags; - if (DUK_UNLIKELY(lookupidx >= sizeof(duk__bufobj_flags_lookup) / sizeof(duk_uint32_t))) { - goto arg_error; - } - tmp = duk__bufobj_flags_lookup[lookupidx]; - classnum = tmp >> 24; - protobidx = (tmp >> 16) & 0xff; - - h_arraybuf = duk_get_hobject(thr, idx_buffer); - if (h_arraybuf != NULL && /* argument is an object */ - flags != DUK_BUFOBJ_ARRAYBUFFER && /* creating a view */ - DUK_HOBJECT_GET_CLASS_NUMBER(h_arraybuf) == DUK_HOBJECT_CLASS_ARRAYBUFFER /* argument is ArrayBuffer */) { - duk_uint_t tmp_offset; - - DUK_ASSERT_HBUFOBJ_VALID((duk_hbufobj *) h_arraybuf); - h_val = ((duk_hbufobj *) h_arraybuf)->buf; - if (DUK_UNLIKELY(h_val == NULL)) { - goto arg_error; - } - - tmp_offset = uint_offset + ((duk_hbufobj *) h_arraybuf)->offset; - if (DUK_UNLIKELY(tmp_offset < uint_offset)) { - goto range_error; - } - uint_offset = tmp_offset; - - /* Note intentional difference to new TypedArray(): we allow - * caller to create an uncovered typed array (which is memory - * safe); new TypedArray() rejects it. - */ - } else { - /* Handle unexpected object arguments here too, for nice error - * messages. - */ - h_arraybuf = NULL; - h_val = duk_require_hbuffer(thr, idx_buffer); - } - - /* Wrap check for offset+length. */ - uint_added = uint_offset + uint_length; - if (DUK_UNLIKELY(uint_added < uint_offset)) { - goto range_error; - } - DUK_ASSERT(uint_added >= uint_offset && uint_added >= uint_length); - - DUK_ASSERT(h_val != NULL); - - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(classnum), - (duk_small_int_t) protobidx); - DUK_ASSERT(h_bufobj != NULL); - - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->buf_prop = h_arraybuf; - DUK_HOBJECT_INCREF_ALLOWNULL(thr, h_arraybuf); - h_bufobj->offset = uint_offset; - h_bufobj->length = uint_length; - h_bufobj->shift = (tmp >> 4) & 0x0f; - h_bufobj->elem_type = (tmp >> 8) & 0xff; - h_bufobj->is_typedarray = tmp & 0x0f; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - /* TypedArray views need an automatic ArrayBuffer which must be - * provided as .buffer property of the view. The ArrayBuffer is - * referenced via duk_hbufobj->buf_prop and an inherited .buffer - * accessor returns it. The ArrayBuffer is created lazily on first - * access if necessary so we don't need to do anything more here. - */ - return; - - range_error: - DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS); - return; /* not reached */ - - arg_error: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_ARGS); - return; /* not reached */ -} -#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ -DUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(idx_buffer); - DUK_UNREF(byte_offset); - DUK_UNREF(byte_length); - DUK_UNREF(flags); - DUK_ERROR_UNSUPPORTED(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -DUK_EXTERNAL duk_idx_t duk_push_error_object_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { - duk_hobject *proto; -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) - duk_small_uint_t augment_flags; -#endif - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr != NULL); - DUK_UNREF(filename); - DUK_UNREF(line); - - /* Error code also packs a tracedata related flag. */ -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) - augment_flags = 0; - if (err_code & DUK_ERRCODE_FLAG_NOBLAME_FILELINE) { - augment_flags = DUK_AUGMENT_FLAG_NOBLAME_FILELINE; - } -#endif - err_code = err_code & (~DUK_ERRCODE_FLAG_NOBLAME_FILELINE); - - /* error gets its 'name' from the prototype */ - proto = duk_error_prototype_from_code(thr, err_code); - (void) duk_push_object_helper_proto(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR), - proto); - - /* ... and its 'message' from an instance property */ - if (fmt) { - duk_push_vsprintf(thr, fmt, ap); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); - } else { - /* If no explicit message given, put error code into message field - * (as a number). This is not fully in keeping with the Ecmascript - * error model because messages are supposed to be strings (Error - * constructors use ToString() on their argument). However, it's - * probably more useful than having a separate 'code' property. - */ - duk_push_int(thr, err_code); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); - } - - /* XXX: .code = err_code disabled, not sure if useful */ - - /* Creation time error augmentation */ -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) - /* filename may be NULL in which case file/line is not recorded */ - duk_err_augment_error_create(thr, thr, filename, line, augment_flags); /* may throw an error */ -#endif - - return duk_get_top_index_unsafe(thr); -} - -DUK_EXTERNAL duk_idx_t duk_push_error_object_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { - va_list ap; - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - va_start(ap, fmt); - ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); - va_end(ap); - return ret; -} - -#if !defined(DUK_USE_VARIADIC_MACROS) -DUK_EXTERNAL duk_idx_t duk_push_error_object_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) { - const char *filename = duk_api_global_filename; - duk_int_t line = duk_api_global_line; - va_list ap; - duk_idx_t ret; - - DUK_ASSERT_API_ENTRY(thr); - - duk_api_global_filename = NULL; - duk_api_global_line = 0; - va_start(ap, fmt); - ret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); - va_end(ap); - return ret; -} -#endif /* DUK_USE_VARIADIC_MACROS */ - -DUK_EXTERNAL void *duk_push_buffer_raw(duk_hthread *thr, duk_size_t size, duk_small_uint_t flags) { - duk_tval *tv_slot; - duk_hbuffer *h; - void *buf_data; - - DUK_ASSERT_API_ENTRY(thr); - - DUK__CHECK_SPACE(); - - /* Check for maximum buffer length. */ - if (DUK_UNLIKELY(size > DUK_HBUFFER_MAX_BYTELEN)) { - DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG); - } - - h = duk_hbuffer_alloc(thr->heap, size, flags, &buf_data); - if (DUK_UNLIKELY(h == NULL)) { - DUK_ERROR_ALLOC_FAILED(thr); - } - - tv_slot = thr->valstack_top; - DUK_TVAL_SET_BUFFER(tv_slot, h); - DUK_HBUFFER_INCREF(thr, h); - thr->valstack_top++; - - return (void *) buf_data; -} - -DUK_INTERNAL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len) { - DUK_ASSERT_API_ENTRY(thr); - return duk_push_buffer_raw(thr, len, DUK_BUF_FLAG_NOZERO); -} - -DUK_INTERNAL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len) { - void *ptr; - - DUK_ASSERT_API_ENTRY(thr); - - ptr = duk_push_buffer_raw(thr, len, 0); -#if !defined(DUK_USE_ZERO_BUFFER_DATA) - /* ES2015 requires zeroing even when DUK_USE_ZERO_BUFFER_DATA - * is not set. - */ - DUK_MEMZERO((void *) ptr, (size_t) len); -#endif - return ptr; -} - -#if defined(DUK_USE_ES6_PROXY) -DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) { - duk_hobject *h_target; - duk_hobject *h_handler; - duk_hproxy *h_proxy; - duk_tval *tv_slot; - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(proxy_flags); - - /* DUK__CHECK_SPACE() unnecessary because the Proxy is written to - * value stack in-place. - */ -#if 0 - DUK__CHECK_SPACE(); -#endif - - /* Reject a proxy object as the target because it would need - * special handling in property lookups. (ES2015 has no such - * restriction.) - */ - h_target = duk_require_hobject_promote_mask(thr, -2, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - DUK_ASSERT(h_target != NULL); - if (DUK_HOBJECT_IS_PROXY(h_target)) { - goto fail_args; - } - - /* Reject a proxy object as the handler because it would cause - * potentially unbounded recursion. (ES2015 has no such - * restriction.) - * - * There's little practical reason to use a lightfunc or a plain - * buffer as the handler table: one could only provide traps via - * their prototype objects (Function.prototype and ArrayBuffer.prototype). - * Even so, as lightfuncs and plain buffers mimic their object - * counterparts, they're promoted and accepted here. - */ - h_handler = duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - DUK_ASSERT(h_handler != NULL); - if (DUK_HOBJECT_IS_PROXY(h_handler)) { - goto fail_args; - } - - /* XXX: Proxy object currently has no prototype, so ToPrimitive() - * coercion fails which is a bit confusing. - */ - - /* CALLABLE and CONSTRUCTABLE flags are copied from the (initial) - * target, see ES2015 Sections 9.5.15 and 9.5.13. - */ - flags = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h_target) & - (DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE); - flags |= DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ; - if (flags & DUK_HOBJECT_FLAG_CALLABLE) { - flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION) | - DUK_HOBJECT_FLAG_SPECIAL_CALL; - } else { - flags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT); - } - - h_proxy = duk_hproxy_alloc(thr, flags); - DUK_ASSERT(h_proxy != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_proxy) == NULL); - - /* Initialize Proxy target and handler references; avoid INCREF - * by stealing the value stack refcounts via direct value stack - * manipulation. INCREF is needed for the Proxy itself however. - */ - DUK_ASSERT(h_target != NULL); - h_proxy->target = h_target; - DUK_ASSERT(h_handler != NULL); - h_proxy->handler = h_handler; - DUK_ASSERT_HPROXY_VALID(h_proxy); - - DUK_ASSERT(duk_get_hobject(thr, -2) == h_target); - DUK_ASSERT(duk_get_hobject(thr, -1) == h_handler); - tv_slot = thr->valstack_top - 2; - DUK_ASSERT(tv_slot >= thr->valstack_bottom); - DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) h_proxy); - DUK_HOBJECT_INCREF(thr, (duk_hobject *) h_proxy); - tv_slot++; - DUK_TVAL_SET_UNDEFINED(tv_slot); /* [ ... target handler ] -> [ ... proxy undefined ] */ - thr->valstack_top = tv_slot; /* -> [ ... proxy ] */ - - DUK_DD(DUK_DDPRINT("created Proxy: %!iT", duk_get_tval(thr, -1))); - - return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom - 1); - - fail_args: - DUK_ERROR_TYPE_INVALID_ARGS(thr); -} -#else /* DUK_USE_ES6_PROXY */ -DUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(proxy_flags); - DUK_ERROR_UNSUPPORTED(thr); -} -#endif /* DUK_USE_ES6_PROXY */ - -#if defined(DUK_USE_ASSERTIONS) -DUK_LOCAL void duk__validate_push_heapptr(duk_hthread *thr, void *ptr) { - duk_heaphdr *h; - duk_heaphdr *curr; - duk_bool_t found = 0; - - h = (duk_heaphdr *) ptr; - if (h == NULL) { - /* Allowed. */ - return; - } - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); - - /* One particular problem case is where an object has been - * queued for finalization but the finalizer hasn't yet been - * executed. - * - * Corner case: we're running in a finalizer for object X, and - * user code calls duk_push_heapptr() for X itself. In this - * case X will be in finalize_list, and we can detect the case - * by seeing that X's FINALIZED flag is set (which is done before - * the finalizer starts executing). - */ -#if defined(DUK_USE_FINALIZER_SUPPORT) - for (curr = thr->heap->finalize_list; - curr != NULL; - curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) { - /* FINALIZABLE is set for all objects on finalize_list - * except for an object being finalized right now. So - * can't assert here. - */ -#if 0 - DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr)); -#endif - - if (curr == h) { - if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h)) { - /* Object is currently being finalized. */ - DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ - found = 1; - } else { - /* Not being finalized but on finalize_list, - * allowed since Duktape 2.1. - */ - DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ - found = 1; - } - } - } -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Because refzero_list is now processed to completion inline with - * no side effects, it's always empty here. - */ - DUK_ASSERT(thr->heap->refzero_list == NULL); -#endif - - /* If not present in finalize_list (or refzero_list), it - * must be either in heap_allocated or the string table. - */ - if (DUK_HEAPHDR_IS_STRING(h)) { - duk_uint32_t i; - duk_hstring *str; - duk_heap *heap = thr->heap; - - DUK_ASSERT(found == 0); - for (i = 0; i < heap->st_size; i++) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - str = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]); -#else - str = heap->strtable[i]; -#endif - while (str != NULL) { - if (str == (duk_hstring *) h) { - DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ - found = 1; - break; - } - str = str->hdr.h_next; - } - } - DUK_ASSERT(found != 0); - } else { - for (curr = thr->heap->heap_allocated; - curr != NULL; - curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) { - if (curr == h) { - DUK_ASSERT(found == 0); /* Would indicate corrupted lists. */ - found = 1; - } - } - DUK_ASSERT(found != 0); - } -} -#endif /* DUK_USE_ASSERTIONS */ - -DUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_hthread *thr, void *ptr) { - duk_idx_t ret; - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - /* Reviving an object using a heap pointer is a dangerous API - * operation: if the application doesn't guarantee that the - * pointer target is always reachable, difficult-to-diagnose - * problems may ensue. Try to validate the 'ptr' argument to - * the extent possible. - */ - -#if defined(DUK_USE_ASSERTIONS) - duk__validate_push_heapptr(thr, ptr); -#endif - - DUK__CHECK_SPACE(); - - ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - tv = thr->valstack_top++; - - if (ptr == NULL) { - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); - return ret; - } - - DUK_ASSERT_HEAPHDR_VALID((duk_heaphdr *) ptr); - - /* If the argument is on finalize_list it has technically been - * unreachable before duk_push_heapptr() but it's still safe to - * push it. Starting from Duktape 2.1 allow application code to - * do so. There are two main cases: - * - * (1) The object is on the finalize_list and we're called by - * the finalizer for the object being finalized. In this - * case do nothing: finalize_list handling will deal with - * the object queueing. This is detected by the object not - * having a FINALIZABLE flag despite being on the finalize_list; - * the flag is cleared for the object being finalized only. - * - * (2) The object is on the finalize_list but is not currently - * being processed. In this case the object can be queued - * back to heap_allocated with a few flags cleared, in effect - * cancelling the finalizer. - */ - if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) ptr))) { - duk_heaphdr *curr; - - DUK_D(DUK_DPRINT("duk_push_heapptr() with a pointer on finalize_list, autorescue")); - - curr = (duk_heaphdr *) ptr; - DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); - - /* Because FINALIZED is set prior to finalizer call, it will - * be set for the object being currently finalized, but not - * for other objects on finalize_list. - */ - DUK_HEAPHDR_CLEAR_FINALIZED(curr); - - /* Dequeue object from finalize_list and queue it back to - * heap_allocated. - */ -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); /* Preincremented on finalize_list insert. */ - DUK_HEAPHDR_PREDEC_REFCOUNT(curr); -#endif - DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(thr->heap, curr); - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(thr->heap, curr); - - /* Continue with the rest. */ - } - - switch (DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr)) { - case DUK_HTYPE_STRING: - DUK_TVAL_SET_STRING(tv, (duk_hstring *) ptr); - break; - case DUK_HTYPE_OBJECT: - DUK_TVAL_SET_OBJECT(tv, (duk_hobject *) ptr); - break; - default: - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr) == DUK_HTYPE_BUFFER); - DUK_TVAL_SET_BUFFER(tv, (duk_hbuffer *) ptr); - break; - } - - DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) ptr); - - return ret; -} - -/* Push object with no prototype, i.e. a "bare" object. */ -DUK_EXTERNAL duk_idx_t duk_push_bare_object(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - -1); /* no prototype */ - return duk_get_top_index_unsafe(thr); -} - -DUK_INTERNAL void duk_push_hstring(duk_hthread *thr, duk_hstring *h) { - duk_tval tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(h != NULL); - - DUK_TVAL_SET_STRING(&tv, h); - duk_push_tval(thr, &tv); -} - -DUK_INTERNAL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT_STRIDX_VALID(stridx); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); -} - -DUK_INTERNAL void duk_push_hstring_empty(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, DUK_STRIDX_EMPTY_STRING)); -} - -DUK_INTERNAL void duk_push_hobject(duk_hthread *thr, duk_hobject *h) { - duk_tval tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(h != NULL); - - DUK_TVAL_SET_OBJECT(&tv, h); - duk_push_tval(thr, &tv); -} - -DUK_INTERNAL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h) { - duk_tval tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(h != NULL); - - DUK_TVAL_SET_BUFFER(&tv, h); - duk_push_tval(thr, &tv); -} - -DUK_INTERNAL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(builtin_idx >= 0 && builtin_idx < DUK_NUM_BUILTINS); - DUK_ASSERT(thr->builtins[builtin_idx] != NULL); - - duk_push_hobject(thr, thr->builtins[builtin_idx]); -} - -/* - * Poppers - */ - -DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_n_unsafe_raw(duk_hthread *thr, duk_idx_t count) { - duk_tval *tv; -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_tval *tv_end; -#endif - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(count >= 0); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count); - -#if defined(DUK_USE_REFERENCE_COUNTING) - tv = thr->valstack_top; - tv_end = tv - count; - while (tv != tv_end) { - tv--; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); - } - thr->valstack_top = tv; - DUK_REFZERO_CHECK_FAST(thr); -#else - tv = thr->valstack_top; - while (count > 0) { - count--; - tv--; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED(tv); - } - thr->valstack_top = tv; -#endif - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} - -DUK_EXTERNAL void duk_pop_n(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - - if (DUK_UNLIKELY((duk_uidx_t) (thr->valstack_top - thr->valstack_bottom) < (duk_uidx_t) count)) { - DUK_ERROR_RANGE_INVALID_COUNT(thr); - return; - } - DUK_ASSERT(count >= 0); - - duk__pop_n_unsafe_raw(thr, count); -} - -#if defined(DUK_USE_PREFER_SIZE) -DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n(thr, count); -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - duk__pop_n_unsafe_raw(thr, count); -} -#endif /* DUK_USE_PREFER_SIZE */ - -/* Pop N elements without DECREF (in effect "stealing" any actual refcounts). */ -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(count >= 0); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count); - - tv = thr->valstack_top; - while (count > 0) { - count--; - tv--; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED(tv); - } - thr->valstack_top = tv; - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -#else /* DUK_USE_REFERENCE_COUNTING */ -DUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_unsafe(thr, count); -} -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* Popping one element is called so often that when footprint is not an issue, - * compile a specialized function for it. - */ -#if defined(DUK_USE_PREFER_SIZE) -DUK_EXTERNAL void duk_pop(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n(thr, 1); -} -DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_unsafe(thr, 1); -} -DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_nodecref_unsafe(thr, 1); -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_unsafe_raw(duk_hthread *thr) { - duk_tval *tv; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); - - tv = --thr->valstack_top; - DUK_ASSERT(tv >= thr->valstack_bottom); -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ -#else - DUK_TVAL_SET_UNDEFINED(tv); -#endif - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -DUK_EXTERNAL void duk_pop(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) { - DUK_ERROR_RANGE_INVALID_COUNT(thr); - } - - duk__pop_unsafe_raw(thr); -} -DUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk__pop_unsafe_raw(thr); -} -DUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); - - tv = --thr->valstack_top; - DUK_ASSERT(tv >= thr->valstack_bottom); - DUK_TVAL_SET_UNDEFINED(tv); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -#endif /* !DUK_USE_PREFER_SIZE */ - -#if defined(DUK_USE_PREFER_SIZE) -DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_nodecref_unsafe(thr); -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1); - - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); - thr->valstack_top--; - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -#endif /* !DUK_USE_PREFER_SIZE */ - -#if defined(DUK_USE_PREFER_SIZE) -DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n(thr, 2); -} -DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_unsafe(thr, 2); -} -DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_nodecref_unsafe(thr, 2); -} -#else -DUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_2_unsafe_raw(duk_hthread *thr) { - duk_tval *tv; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2); - - tv = --thr->valstack_top; - DUK_ASSERT(tv >= thr->valstack_bottom); -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ -#else - DUK_TVAL_SET_UNDEFINED(tv); -#endif - tv = --thr->valstack_top; - DUK_ASSERT(tv >= thr->valstack_bottom); -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); /* side effects */ -#else - DUK_TVAL_SET_UNDEFINED(tv); -#endif - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -DUK_EXTERNAL void duk_pop_2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - if (DUK_UNLIKELY(thr->valstack_top - 2 < thr->valstack_bottom)) { - DUK_ERROR_RANGE_INVALID_COUNT(thr); - } - - duk__pop_2_unsafe_raw(thr); -} -DUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk__pop_2_unsafe_raw(thr); -} -DUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2); - - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1)); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 2)); - thr->valstack_top -= 2; - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); -} -#endif /* !DUK_USE_PREFER_SIZE */ - -DUK_EXTERNAL void duk_pop_3(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n(thr, 3); -} - -DUK_INTERNAL void duk_pop_3_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_unsafe(thr, 3); -} - -DUK_INTERNAL void duk_pop_3_nodecref_unsafe(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_pop_n_nodecref_unsafe(thr, 3); -} - -/* - * Pack and unpack (pack value stack entries into an array and vice versa) - */ - -/* XXX: pack index range? array index offset? */ -DUK_INTERNAL void duk_pack(duk_hthread *thr, duk_idx_t count) { - duk_tval *tv_src; - duk_tval *tv_dst; - duk_tval *tv_curr; - duk_tval *tv_limit; - duk_idx_t top; - - DUK_ASSERT_API_ENTRY(thr); - - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - top = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT(top >= 0); - if (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) top)) { - /* Also handles negative count. */ - DUK_ERROR_RANGE_INVALID_COUNT(thr); - return; - } - DUK_ASSERT(count >= 0); - - /* Wrapping is controlled by the check above: value stack top can be - * at most DUK_USE_VALSTACK_LIMIT which is low enough so that - * multiplying with sizeof(duk_tval) won't wrap. - */ - DUK_ASSERT(count >= 0 && count <= (duk_idx_t) DUK_USE_VALSTACK_LIMIT); - DUK_ASSERT((duk_size_t) count <= DUK_SIZE_MAX / sizeof(duk_tval)); /* no wrapping */ - - tv_dst = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count); /* XXX: uninitialized would be OK */ - DUK_ASSERT(count == 0 || tv_dst != NULL); - - /* Copy value stack values directly to the array part without - * any refcount updates: net refcount changes are zero. - */ - - tv_src = thr->valstack_top - count - 1; - DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, (size_t) count * sizeof(duk_tval)); - - /* Overwrite result array to final value stack location and wipe - * the rest; no refcount operations needed. - */ - - tv_dst = tv_src; /* when count == 0, same as tv_src (OK) */ - tv_src = thr->valstack_top - 1; - DUK_TVAL_SET_TVAL(tv_dst, tv_src); - - /* XXX: internal helper to wipe a value stack segment? */ - tv_curr = tv_dst + 1; - tv_limit = thr->valstack_top; - while (tv_curr != tv_limit) { - /* Wipe policy: keep as 'undefined'. */ - DUK_TVAL_SET_UNDEFINED(tv_curr); - tv_curr++; - } - thr->valstack_top = tv_dst + 1; -} - -DUK_INTERNAL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - - tv = duk_require_tval(thr, idx); - if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv))) { - duk_hobject *h; - duk_uint32_t len; - duk_uint32_t i; - - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - DUK_UNREF(h); - -#if defined(DUK_USE_ARRAY_FASTPATH) /* close enough */ - if (DUK_LIKELY(DUK_HOBJECT_IS_ARRAY(h) && - ((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h))) { - duk_harray *h_arr; - duk_tval *tv_src; - duk_tval *tv_dst; - - h_arr = (duk_harray *) h; - len = h_arr->length; - if (DUK_UNLIKELY(len >= 0x80000000UL)) { - goto fail_over_2g; - } - duk_require_stack(thr, (duk_idx_t) len); - - /* The potential allocation in duk_require_stack() may - * run a finalizer which modifies the argArray so that - * e.g. becomes sparse. So, we need to recheck that the - * array didn't change size and that there's still a - * valid backing array part. - * - * XXX: alternatively, could prevent finalizers for the - * duration. - */ - if (DUK_UNLIKELY(len != h_arr->length || - h_arr->length > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr))) { - goto skip_fast; - } - - /* Main fast path: arguments array is almost always - * an actual array (though it might also be an arguments - * object). - */ - - DUK_DDD(DUK_DDDPRINT("fast path for %ld elements", (long) h_arr->length)); - tv_src = DUK_HOBJECT_A_GET_BASE(thr->heap, h); - tv_dst = thr->valstack_top; - while (len-- > 0) { - DUK_ASSERT(tv_dst < thr->valstack_end); - if (DUK_UNLIKELY(DUK_TVAL_IS_UNUSED(tv_src))) { - /* Gaps are very unlikely. Skip over them, - * without an ancestor lookup (technically - * not compliant). - */ - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_dst)); /* valstack policy */ - } else { - DUK_TVAL_SET_TVAL(tv_dst, tv_src); - DUK_TVAL_INCREF(thr, tv_dst); - } - tv_src++; - tv_dst++; - } - DUK_ASSERT(tv_dst <= thr->valstack_end); - thr->valstack_top = tv_dst; - return (duk_idx_t) h_arr->length; - } - skip_fast: -#endif /* DUK_USE_ARRAY_FASTPATH */ - - /* Slow path: actual lookups. The initial 'length' lookup - * decides the output length, regardless of side effects that - * may resize or change the argArray while we read the - * indices. - */ - idx = duk_normalize_index(thr, idx); - duk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH); - len = duk_to_uint32(thr, -1); /* ToUint32() coercion required */ - if (DUK_UNLIKELY(len >= 0x80000000UL)) { - goto fail_over_2g; - } - duk_pop_unsafe(thr); - DUK_DDD(DUK_DDDPRINT("slow path for %ld elements", (long) len)); - - duk_require_stack(thr, (duk_idx_t) len); - for (i = 0; i < len; i++) { - duk_get_prop_index(thr, idx, (duk_uarridx_t) i); - } - return (duk_idx_t) len; - } else if (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv)) { - return 0; - } - - DUK_ERROR_TYPE_INVALID_ARGS(thr); - return 0; - - fail_over_2g: - DUK_ERROR_RANGE_INVALID_LENGTH(thr); - return 0; -} - -/* - * Error throwing - */ - -DUK_EXTERNAL void duk_throw_raw(duk_hthread *thr) { - duk_tval *tv_val; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - - if (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - - /* Errors are augmented when they are created, not when they are - * thrown or re-thrown. The current error handler, however, runs - * just before an error is thrown. - */ - - /* Sync so that augmentation sees up-to-date activations, NULL - * thr->ptr_curr_pc so that it's not used if side effects occur - * in augmentation or longjmp handling. - */ - duk_hthread_sync_and_null_currpc(thr); - -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (before throw augment)", (duk_tval *) duk_get_tval(thr, -1))); - duk_err_augment_error_throw(thr); -#endif - DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (after throw augment)", (duk_tval *) duk_get_tval(thr, -1))); - - tv_val = DUK_GET_TVAL_NEGIDX(thr, -1); - duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, tv_val); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_err_check_debugger_integration(thr); -#endif - - /* thr->heap->lj.jmpbuf_ptr is checked by duk_err_longjmp() so we don't - * need to check that here. If the value is NULL, a fatal error occurs - * because we can't return. - */ - - duk_err_longjmp(thr); - DUK_UNREACHABLE(); -} - -DUK_EXTERNAL void duk_fatal_raw(duk_hthread *thr, const char *err_msg) { - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(thr->heap->fatal_func != NULL); - - DUK_D(DUK_DPRINT("fatal error occurred: %s", err_msg ? err_msg : "NULL")); - - /* fatal_func should be noreturn, but noreturn declarations on function - * pointers has a very spotty support apparently so it's not currently - * done. - */ - thr->heap->fatal_func(thr->heap->heap_udata, err_msg); - - /* If the fatal handler returns, all bets are off. It'd be nice to - * print something here but since we don't want to depend on stdio, - * there's no way to do so portably. - */ - DUK_D(DUK_DPRINT("fatal error handler returned, all bets are off!")); - for (;;) { - /* loop forever, don't return (function marked noreturn) */ - } -} - -DUK_EXTERNAL void duk_error_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { - DUK_ASSERT_API_ENTRY(thr); - - duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); - (void) duk_throw(thr); -} - -DUK_EXTERNAL void duk_error_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { - va_list ap; - - DUK_ASSERT_API_ENTRY(thr); - - va_start(ap, fmt); - duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); - va_end(ap); - (void) duk_throw(thr); -} - -#if !defined(DUK_USE_VARIADIC_MACROS) -DUK_NORETURN(DUK_LOCAL_DECL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap)); - -DUK_LOCAL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap) { - const char *filename; - duk_int_t line; - - DUK_ASSERT_CTX_VALID(thr); - - filename = duk_api_global_filename; - line = duk_api_global_line; - duk_api_global_filename = NULL; - duk_api_global_line = 0; - - duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap); - (void) duk_throw(thr); -} - -#define DUK__ERROR_STASH_SHARED(code) do { \ - va_list ap; \ - va_start(ap, fmt); \ - duk__throw_error_from_stash(thr, (code), fmt, ap); \ - va_end(ap); \ - /* Never reached; if return 0 here, gcc/clang will complain. */ \ - } while (0) - -DUK_EXTERNAL duk_ret_t duk_error_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(err_code); -} -DUK_EXTERNAL duk_ret_t duk_generic_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_eval_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_EVAL_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_range_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_RANGE_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_reference_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_REFERENCE_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_syntax_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_SYNTAX_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_type_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_TYPE_ERROR); -} -DUK_EXTERNAL duk_ret_t duk_uri_error_stash(duk_hthread *thr, const char *fmt, ...) { - DUK_ASSERT_API_ENTRY(thr); - DUK__ERROR_STASH_SHARED(DUK_ERR_URI_ERROR); -} -#endif /* DUK_USE_VARIADIC_MACROS */ - -/* - * Comparison - */ - -DUK_EXTERNAL duk_bool_t duk_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { - duk_tval *tv1, *tv2; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_get_tval(thr, idx1); - tv2 = duk_get_tval(thr, idx2); - if ((tv1 == NULL) || (tv2 == NULL)) { - return 0; - } - - /* Coercion may be needed, the helper handles that by pushing the - * tagged values to the stack. - */ - return duk_js_equals(thr, tv1, tv2); -} - -DUK_EXTERNAL duk_bool_t duk_strict_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { - duk_tval *tv1, *tv2; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_get_tval(thr, idx1); - tv2 = duk_get_tval(thr, idx2); - if ((tv1 == NULL) || (tv2 == NULL)) { - return 0; - } - - /* No coercions or other side effects, so safe */ - return duk_js_strict_equals(tv1, tv2); -} - -DUK_EXTERNAL duk_bool_t duk_samevalue(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { - duk_tval *tv1, *tv2; - - DUK_ASSERT_API_ENTRY(thr); - - tv1 = duk_get_tval(thr, idx1); - tv2 = duk_get_tval(thr, idx2); - if ((tv1 == NULL) || (tv2 == NULL)) { - return 0; - } - - /* No coercions or other side effects, so safe */ - return duk_js_samevalue(tv1, tv2); -} - -/* - * instanceof - */ - -DUK_EXTERNAL duk_bool_t duk_instanceof(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) { - duk_tval *tv1, *tv2; - - DUK_ASSERT_API_ENTRY(thr); - - /* Index validation is strict, which differs from duk_equals(). - * The strict behavior mimics how instanceof itself works, e.g. - * it is a TypeError if rval is not a -callable- object. It would - * be somewhat inconsistent if rval would be allowed to be - * non-existent without a TypeError. - */ - tv1 = duk_require_tval(thr, idx1); - DUK_ASSERT(tv1 != NULL); - tv2 = duk_require_tval(thr, idx2); - DUK_ASSERT(tv2 != NULL); - - return duk_js_instanceof(thr, tv1, tv2); -} - -/* - * Lightfunc - */ - -DUK_INTERNAL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) { - /* Lightfunc name, includes Duktape/C native function pointer, which - * can often be used to locate the function from a symbol table. - * The name also includes the 16-bit duk_tval flags field because it - * includes the magic value. Because a single native function often - * provides different functionality depending on the magic value, it - * seems reasonably to include it in the name. - * - * On the other hand, a complicated name increases string table - * pressure in low memory environments (but only when function name - * is accessed). - */ - - DUK_ASSERT_API_ENTRY(thr); - - duk_push_sprintf(thr, "light_"); - duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func)); - duk_push_sprintf(thr, "_%04x", (unsigned int) lf_flags); - duk_concat(thr, 3); -} - -DUK_INTERNAL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv) { - duk_c_function func; - duk_small_uint_t lf_flags; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); - - DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); - duk_push_lightfunc_name_raw(thr, func, lf_flags); -} - -DUK_INTERNAL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv) { - duk_c_function func; - duk_small_uint_t lf_flags; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); - - DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); /* read before 'tv' potentially invalidated */ - duk_push_string(thr, "function "); - duk_push_lightfunc_name_raw(thr, func, lf_flags); - duk_push_string(thr, "() { [lightfunc code] }"); - duk_concat(thr, 3); -} - -/* - * Function pointers - * - * Printing function pointers is non-portable, so we do that by hex printing - * bytes from memory. - */ - -DUK_INTERNAL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz) { - duk_uint8_t buf[32 * 2]; - duk_uint8_t *p, *q; - duk_small_uint_t i; - duk_small_uint_t t; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(sz <= 32); /* sanity limit for function pointer size */ - - p = buf; -#if defined(DUK_USE_INTEGER_LE) - q = ptr + sz; -#else - q = ptr; -#endif - for (i = 0; i < sz; i++) { -#if defined(DUK_USE_INTEGER_LE) - t = *(--q); -#else - t = *(q++); -#endif - *p++ = duk_lc_digits[t >> 4]; - *p++ = duk_lc_digits[t & 0x0f]; - } - - duk_push_lstring(thr, (const char *) buf, sz * 2); -} - -/* - * Push readable string summarizing duk_tval. The operation is side effect - * free and will only throw from internal errors (e.g. out of memory). - * This is used by e.g. property access code to summarize a key/base safely, - * and is not intended to be fast (but small and safe). - */ - -/* String limits for summary strings. */ -#define DUK__READABLE_SUMMARY_MAXCHARS 96 /* maximum supported by helper */ -#define DUK__READABLE_STRING_MAXCHARS 32 /* for strings/symbols */ -#define DUK__READABLE_ERRMSG_MAXCHARS 96 /* for error messages */ - -/* String sanitizer which escapes ASCII control characters and a few other - * ASCII characters, passes Unicode as is, and replaces invalid UTF-8 with - * question marks. No errors are thrown for any input string, except in out - * of memory situations. - */ -DUK_LOCAL void duk__push_hstring_readable_unicode(duk_hthread *thr, duk_hstring *h_input, duk_small_uint_t maxchars) { - const duk_uint8_t *p, *p_start, *p_end; - duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH * DUK__READABLE_SUMMARY_MAXCHARS + - 2 /*quotes*/ + 3 /*periods*/]; - duk_uint8_t *q; - duk_ucodepoint_t cp; - duk_small_uint_t nchars; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(h_input != NULL); - DUK_ASSERT(maxchars <= DUK__READABLE_SUMMARY_MAXCHARS); - - p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start; - q = buf; - - nchars = 0; - *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE; - for (;;) { - if (p >= p_end) { - break; - } - if (nchars == maxchars) { - *q++ = (duk_uint8_t) DUK_ASC_PERIOD; - *q++ = (duk_uint8_t) DUK_ASC_PERIOD; - *q++ = (duk_uint8_t) DUK_ASC_PERIOD; - break; - } - if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) { - if (cp < 0x20 || cp == 0x7f || cp == DUK_ASC_SINGLEQUOTE || cp == DUK_ASC_BACKSLASH) { - DUK_ASSERT(DUK_UNICODE_MAX_XUTF8_LENGTH >= 4); /* estimate is valid */ - DUK_ASSERT((cp >> 4) <= 0x0f); - *q++ = (duk_uint8_t) DUK_ASC_BACKSLASH; - *q++ = (duk_uint8_t) DUK_ASC_LC_X; - *q++ = (duk_uint8_t) duk_lc_digits[cp >> 4]; - *q++ = (duk_uint8_t) duk_lc_digits[cp & 0x0f]; - } else { - q += duk_unicode_encode_xutf8(cp, q); - } - } else { - p++; /* advance manually */ - *q++ = (duk_uint8_t) DUK_ASC_QUESTION; - } - nchars++; - } - *q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE; - - duk_push_lstring(thr, (const char *) buf, (duk_size_t) (q - buf)); -} - -DUK_LOCAL const char *duk__push_string_tval_readable(duk_hthread *thr, duk_tval *tv, duk_bool_t error_aware) { - DUK_ASSERT_CTX_VALID(thr); - /* 'tv' may be NULL */ - - if (tv == NULL) { - duk_push_string(thr, "none"); - } else { - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_STRING: { - duk_hstring *h = DUK_TVAL_GET_STRING(tv); - if (DUK_HSTRING_HAS_SYMBOL(h)) { - /* XXX: string summary produces question marks - * so this is not very ideal. - */ - duk_push_string(thr, "[Symbol "); - duk_push_string(thr, duk__get_symbol_type_string(h)); - duk_push_string(thr, " "); - duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS); - duk_push_string(thr, "]"); - duk_concat(thr, 5); - break; - } - duk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS); - break; - } - case DUK_TAG_OBJECT: { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - if (error_aware && - duk_hobject_prototype_chain_contains(thr, h, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) { - /* Get error message in a side effect free way if - * possible; if not, summarize as a generic object. - * Error message currently gets quoted. - */ - /* XXX: better internal getprop call; get without side effects - * but traverse inheritance chain. - */ - duk_tval *tv_msg; - tv_msg = duk_hobject_find_existing_entry_tval_ptr(thr->heap, h, DUK_HTHREAD_STRING_MESSAGE(thr)); - if (tv_msg != NULL && DUK_TVAL_IS_STRING(tv_msg)) { - /* It's critical to avoid recursion so - * only summarize a string .message. - */ - duk__push_hstring_readable_unicode(thr, DUK_TVAL_GET_STRING(tv_msg), DUK__READABLE_ERRMSG_MAXCHARS); - break; - } - } - duk_push_class_string_tval(thr, tv); - break; - } - case DUK_TAG_BUFFER: { - /* While plain buffers mimic Uint8Arrays, they summarize differently. - * This is useful so that the summarized string accurately reflects the - * internal type which may matter for figuring out bugs etc. - */ - /* XXX: Hex encoded, length limited buffer summary here? */ - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h != NULL); - duk_push_sprintf(thr, "[buffer:%ld]", (long) DUK_HBUFFER_GET_SIZE(h)); - break; - } - case DUK_TAG_POINTER: { - /* Surround with parentheses like in JX, ensures NULL pointer - * is distinguishable from null value ("(null)" vs "null"). - */ - duk_push_tval(thr, tv); - duk_push_sprintf(thr, "(%s)", duk_to_string(thr, -1)); - duk_remove_m2(thr); - break; - } - default: { - duk_push_tval(thr, tv); - break; - } - } - } - - return duk_to_string(thr, -1); -} -DUK_INTERNAL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT_API_ENTRY(thr); - return duk__push_string_tval_readable(thr, tv, 0 /*error_aware*/); -} - -DUK_INTERNAL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx) { - DUK_ASSERT_API_ENTRY(thr); - return duk_push_string_tval_readable(thr, duk_get_tval(thr, idx)); -} - -DUK_INTERNAL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT_API_ENTRY(thr); - return duk__push_string_tval_readable(thr, tv, 1 /*error_aware*/); -} - -DUK_INTERNAL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h) { - const duk_uint8_t *p; - const duk_uint8_t *p_end; - const duk_uint8_t *q; - - DUK_ASSERT_API_ENTRY(thr); - - /* .toString() */ - duk_push_string(thr, "Symbol("); - p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - p_end = p + DUK_HSTRING_GET_BYTELEN(h); - DUK_ASSERT(p[0] == 0xff || (p[0] & 0xc0) == 0x80); - p++; - for (q = p; q < p_end; q++) { - if (*q == 0xffU) { - /* Terminate either at end-of-string (but NUL MUST - * be accepted without terminating description) or - * 0xFF, which is used to mark start of unique trailer - * (and cannot occur in CESU-8 / extended UTF-8). - */ - break; - } - } - duk_push_lstring(thr, (const char *) p, (duk_size_t) (q - p)); - duk_push_string(thr, ")"); - duk_concat(thr, 3); -} - -/* - * Functions - */ - -#if 0 /* not used yet */ -DUK_INTERNAL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h) { - duk_c_function func; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)); - - duk_push_sprintf(thr, "native_"); - func = h->func; - duk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func)); - duk_push_sprintf(thr, "_%04x_%04x", - (unsigned int) (duk_uint16_t) h->nargs, - (unsigned int) (duk_uint16_t) h->magic); - duk_concat(thr, 3); -} -#endif - -/* - * duk_tval slice copy - */ - -DUK_INTERNAL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count) { - duk_tval *tv; - - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(thr); - DUK_ASSERT(count * sizeof(duk_tval) >= count); /* no wrap */ - DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, count * sizeof(duk_tval)); - - tv = tv_dst; - while (count-- > 0) { - DUK_TVAL_INCREF(thr, tv); - tv++; - } -} - -/* automatic undefs */ -#undef DUK__ASSERT_SPACE -#undef DUK__CHECK_SPACE -#undef DUK__ERROR_STASH_SHARED -#undef DUK__PACK_ARGS -#undef DUK__READABLE_ERRMSG_MAXCHARS -#undef DUK__READABLE_STRING_MAXCHARS -#undef DUK__READABLE_SUMMARY_MAXCHARS -#line 1 "duk_api_string.c" -/* - * String manipulation - */ - -/* #include duk_internal.h -> already included */ - -DUK_LOCAL void duk__concat_and_join_helper(duk_hthread *thr, duk_idx_t count_in, duk_bool_t is_join) { - duk_uint_t count; - duk_uint_t i; - duk_size_t idx; - duk_size_t len; - duk_hstring *h; - duk_uint8_t *buf; - - DUK_ASSERT_CTX_VALID(thr); - - if (DUK_UNLIKELY(count_in <= 0)) { - if (count_in < 0) { - DUK_ERROR_RANGE_INVALID_COUNT(thr); - return; - } - DUK_ASSERT(count_in == 0); - duk_push_hstring_empty(thr); - return; - } - count = (duk_uint_t) count_in; - - if (is_join) { - duk_size_t t1, t2, limit; - h = duk_to_hstring(thr, -((duk_idx_t) count) - 1); - DUK_ASSERT(h != NULL); - - /* A bit tricky overflow test, see doc/code-issues.rst. */ - t1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); - t2 = (duk_size_t) (count - 1); - limit = (duk_size_t) DUK_HSTRING_MAX_BYTELEN; - if (DUK_UNLIKELY(t2 != 0 && t1 > limit / t2)) { - /* Combined size of separators already overflows. */ - goto error_overflow; - } - len = (duk_size_t) (t1 * t2); - } else { - len = (duk_size_t) 0; - } - - for (i = count; i >= 1; i--) { - duk_size_t new_len; - h = duk_to_hstring(thr, -((duk_idx_t) i)); - new_len = len + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); - - /* Impose a string maximum length, need to handle overflow - * correctly. - */ - if (new_len < len || /* wrapped */ - new_len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN) { - goto error_overflow; - } - len = new_len; - } - - DUK_DDD(DUK_DDDPRINT("join/concat %lu strings, total length %lu bytes", - (unsigned long) count, (unsigned long) len)); - - /* Use stack allocated buffer to ensure reachability in errors - * (e.g. intern error). - */ - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len); - DUK_ASSERT(buf != NULL); - - /* [ ... (sep) str1 str2 ... strN buf ] */ - - idx = 0; - for (i = count; i >= 1; i--) { - if (is_join && i != count) { - h = duk_require_hstring(thr, -((duk_idx_t) count) - 2); /* extra -1 for buffer */ - DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); - idx += DUK_HSTRING_GET_BYTELEN(h); - } - h = duk_require_hstring(thr, -((duk_idx_t) i) - 1); /* extra -1 for buffer */ - DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); - idx += DUK_HSTRING_GET_BYTELEN(h); - } - - DUK_ASSERT(idx == len); - - /* [ ... (sep) str1 str2 ... strN buf ] */ - - /* Get rid of the strings early to minimize memory use before intern. */ - - if (is_join) { - duk_replace(thr, -((duk_idx_t) count) - 2); /* overwrite sep */ - duk_pop_n(thr, (duk_idx_t) count); - } else { - duk_replace(thr, -((duk_idx_t) count) - 1); /* overwrite str1 */ - duk_pop_n(thr, (duk_idx_t) (count - 1)); - } - - /* [ ... buf ] */ - - (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ - - /* [ ... res ] */ - return; - - error_overflow: - DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); -} - -DUK_EXTERNAL void duk_concat(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - - duk__concat_and_join_helper(thr, count, 0 /*is_join*/); -} - -#if defined(DUK_USE_PREFER_SIZE) -DUK_INTERNAL void duk_concat_2(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - duk_concat(thr, 2); -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_INTERNAL void duk_concat_2(duk_hthread *thr) { - duk_hstring *h1; - duk_hstring *h2; - duk_uint8_t *buf; - duk_size_t len1; - duk_size_t len2; - duk_size_t len; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(duk_get_top(thr) >= 2); /* Trusted caller. */ - - h1 = duk_to_hstring(thr, -2); - h2 = duk_to_hstring(thr, -1); - len1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1); - len2 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2); - len = len1 + len2; - if (DUK_UNLIKELY(len < len1 || /* wrapped */ - len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN)) { - goto error_overflow; - } - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len); - DUK_ASSERT(buf != NULL); - - DUK_MEMCPY((void *) buf, (const void *) DUK_HSTRING_GET_DATA(h1), (size_t) len1); - DUK_MEMCPY((void *) (buf + len1), (const void *) DUK_HSTRING_GET_DATA(h2), (size_t) len2); - (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ - - /* [ ... str1 str2 buf ] */ - - duk_replace(thr, -3); - duk_pop_unsafe(thr); - return; - - error_overflow: - DUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG); -} -#endif /* DUK_USE_PREFER_SIZE */ - -DUK_EXTERNAL void duk_join(duk_hthread *thr, duk_idx_t count) { - DUK_ASSERT_API_ENTRY(thr); - - duk__concat_and_join_helper(thr, count, 1 /*is_join*/); -} - -/* XXX: could map/decode be unified with duk_unicode_support.c code? - * Case conversion needs also the character surroundings though. - */ - -DUK_EXTERNAL void duk_decode_string(duk_hthread *thr, duk_idx_t idx, duk_decode_char_function callback, void *udata) { - duk_hstring *h_input; - const duk_uint8_t *p, *p_start, *p_end; - duk_codepoint_t cp; - - DUK_ASSERT_API_ENTRY(thr); - - h_input = duk_require_hstring(thr, idx); /* Accept symbols. */ - DUK_ASSERT(h_input != NULL); - - p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start; - - for (;;) { - if (p >= p_end) { - break; - } - cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); - callback(udata, cp); - } -} - -DUK_EXTERNAL void duk_map_string(duk_hthread *thr, duk_idx_t idx, duk_map_char_function callback, void *udata) { - duk_hstring *h_input; - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; - const duk_uint8_t *p, *p_start, *p_end; - duk_codepoint_t cp; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_normalize_index(thr, idx); - - h_input = duk_require_hstring(thr, idx); /* Accept symbols. */ - DUK_ASSERT(h_input != NULL); - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* Reasonable output estimate. */ - - p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start; - - for (;;) { - /* XXX: could write output in chunks with fewer ensure calls, - * but relative benefit would be small here. - */ - - if (p >= p_end) { - break; - } - cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); - cp = callback(udata, cp); - - DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp); - } - - DUK_BW_COMPACT(thr, bw); - (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 encoded. */ - duk_replace(thr, idx); -} - -DUK_EXTERNAL void duk_substring(duk_hthread *thr, duk_idx_t idx, duk_size_t start_offset, duk_size_t end_offset) { - duk_hstring *h; - duk_hstring *res; - duk_size_t start_byte_offset; - duk_size_t end_byte_offset; - duk_size_t charlen; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */ - h = duk_require_hstring(thr, idx); - DUK_ASSERT(h != NULL); - - charlen = DUK_HSTRING_GET_CHARLEN(h); - if (end_offset >= charlen) { - end_offset = charlen; - } - if (start_offset > end_offset) { - start_offset = end_offset; - } - - DUK_ASSERT_DISABLE(start_offset >= 0); - DUK_ASSERT(start_offset <= end_offset && start_offset <= DUK_HSTRING_GET_CHARLEN(h)); - DUK_ASSERT_DISABLE(end_offset >= 0); - DUK_ASSERT(end_offset >= start_offset && end_offset <= DUK_HSTRING_GET_CHARLEN(h)); - - /* Guaranteed by string limits. */ - DUK_ASSERT(start_offset <= DUK_UINT32_MAX); - DUK_ASSERT(end_offset <= DUK_UINT32_MAX); - - start_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) start_offset); - end_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) end_offset); - - DUK_ASSERT(end_byte_offset >= start_byte_offset); - DUK_ASSERT(end_byte_offset - start_byte_offset <= DUK_UINT32_MAX); /* Guaranteed by string limits. */ - - /* No size check is necessary. */ - res = duk_heap_strtable_intern_checked(thr, - DUK_HSTRING_GET_DATA(h) + start_byte_offset, - (duk_uint32_t) (end_byte_offset - start_byte_offset)); - - duk_push_hstring(thr, res); - duk_replace(thr, idx); -} - -/* XXX: this is quite clunky. Add Unicode helpers to scan backwards and - * forwards with a callback to process codepoints? - */ -DUK_EXTERNAL void duk_trim(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - const duk_uint8_t *p, *p_start, *p_end, *p_tmp1, *p_tmp2; /* pointers for scanning */ - const duk_uint8_t *q_start, *q_end; /* start (incl) and end (excl) of trimmed part */ - duk_codepoint_t cp; - - DUK_ASSERT_API_ENTRY(thr); - - idx = duk_require_normalize_index(thr, idx); /* Accept symbols. */ - h = duk_require_hstring(thr, idx); - DUK_ASSERT(h != NULL); - - p_start = DUK_HSTRING_GET_DATA(h); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); - - p = p_start; - while (p < p_end) { - p_tmp1 = p; - cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp1, p_start, p_end); - if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { - break; - } - p = p_tmp1; - } - q_start = p; - if (p == p_end) { - /* Entire string is whitespace. */ - q_end = p; - goto scan_done; - } - - p = p_end; - while (p > p_start) { - p_tmp1 = p; - while (p > p_start) { - p--; - if (((*p) & 0xc0) != 0x80) { - break; - } - } - p_tmp2 = p; - - cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp2, p_start, p_end); - if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { - p = p_tmp1; - break; - } - } - q_end = p; - - scan_done: - /* This may happen when forward and backward scanning disagree - * (possible for non-extended-UTF-8 strings). - */ - if (q_end < q_start) { - q_end = q_start; - } - - DUK_ASSERT(q_start >= p_start && q_start <= p_end); - DUK_ASSERT(q_end >= p_start && q_end <= p_end); - DUK_ASSERT(q_end >= q_start); - - DUK_DDD(DUK_DDDPRINT("trim: p_start=%p, p_end=%p, q_start=%p, q_end=%p", - (const void *) p_start, (const void *) p_end, - (const void *) q_start, (const void *) q_end)); - - if (q_start == p_start && q_end == p_end) { - DUK_DDD(DUK_DDDPRINT("nothing was trimmed: avoid interning (hashing etc)")); - return; - } - - duk_push_lstring(thr, (const char *) q_start, (duk_size_t) (q_end - q_start)); - duk_replace(thr, idx); -} - -DUK_EXTERNAL duk_codepoint_t duk_char_code_at(duk_hthread *thr, duk_idx_t idx, duk_size_t char_offset) { - duk_hstring *h; - duk_ucodepoint_t cp; - - DUK_ASSERT_API_ENTRY(thr); - - /* XXX: Share code with String.prototype.charCodeAt? Main difference - * is handling of clamped offsets. - */ - - h = duk_require_hstring(thr, idx); /* Accept symbols. */ - DUK_ASSERT(h != NULL); - - DUK_ASSERT_DISABLE(char_offset >= 0); /* Always true, arg is unsigned. */ - if (char_offset >= DUK_HSTRING_GET_CHARLEN(h)) { - return 0; - } - - DUK_ASSERT(char_offset <= DUK_UINT_MAX); /* Guaranteed by string limits. */ - cp = duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) char_offset, 0 /*surrogate_aware*/); - return (duk_codepoint_t) cp; -} -#line 1 "duk_api_time.c" -/* - * Date/time. - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr) { - /* Ecmascript time, with millisecond fractions. Exposed via - * duk_get_now() for example. - */ - DUK_UNREF(thr); - return (duk_double_t) DUK_USE_DATE_GET_NOW(thr); -} - -DUK_INTERNAL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr) { - /* Ecmascript time without millisecond fractions. Exposed via - * the Date built-in which doesn't allow fractions. - */ - DUK_UNREF(thr); - return (duk_double_t) DUK_FLOOR(DUK_USE_DATE_GET_NOW(thr)); -} - -DUK_INTERNAL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr) { - DUK_UNREF(thr); -#if defined(DUK_USE_GET_MONOTONIC_TIME) - return (duk_double_t) DUK_USE_GET_MONOTONIC_TIME(thr); -#else - return (duk_double_t) DUK_USE_DATE_GET_NOW(thr); -#endif -} - -DUK_EXTERNAL duk_double_t duk_get_now(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(thr); - - /* This API intentionally allows millisecond fractions. */ - return duk_time_get_ecmascript_time(thr); -} - -#if 0 /* XXX: worth exposing? */ -DUK_EXTERNAL duk_double_t duk_get_monotonic_time(duk_hthread *thr) { - DUK_ASSERT_API_ENTRY(thr); - DUK_UNREF(thr); - - return duk_time_get_monotonic_time(thr); -} -#endif - -DUK_EXTERNAL void duk_time_to_components(duk_hthread *thr, duk_double_t timeval, duk_time_components *comp) { - duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(comp != NULL); /* XXX: or check? */ - DUK_UNREF(thr); - - /* Convert as one-based, but change month to zero-based to match the - * Ecmascript Date built-in behavior 1:1. - */ - flags = DUK_DATE_FLAG_ONEBASED | DUK_DATE_FLAG_NAN_TO_ZERO; - - duk_bi_date_timeval_to_parts(timeval, parts, dparts, flags); - - /* XXX: sub-millisecond accuracy for the API */ - - DUK_ASSERT(dparts[DUK_DATE_IDX_MONTH] >= 1.0 && dparts[DUK_DATE_IDX_MONTH] <= 12.0); - comp->year = dparts[DUK_DATE_IDX_YEAR]; - comp->month = dparts[DUK_DATE_IDX_MONTH] - 1.0; - comp->day = dparts[DUK_DATE_IDX_DAY]; - comp->hours = dparts[DUK_DATE_IDX_HOUR]; - comp->minutes = dparts[DUK_DATE_IDX_MINUTE]; - comp->seconds = dparts[DUK_DATE_IDX_SECOND]; - comp->milliseconds = dparts[DUK_DATE_IDX_MILLISECOND]; - comp->weekday = dparts[DUK_DATE_IDX_WEEKDAY]; -} - -DUK_EXTERNAL duk_double_t duk_components_to_time(duk_hthread *thr, duk_time_components *comp) { - duk_double_t d; - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_uint_t flags; - - DUK_ASSERT_API_ENTRY(thr); - DUK_ASSERT(comp != NULL); /* XXX: or check? */ - DUK_UNREF(thr); - - /* Match Date constructor behavior (with UTC time). Month is given - * as zero-based. Day-of-month is given as one-based so normalize - * it to zero-based as the internal conversion helpers expects all - * components to be zero-based. - */ - flags = 0; - - /* XXX: expensive conversion; use array format in API instead, or unify - * time provider and time API to use same struct? - */ - - dparts[DUK_DATE_IDX_YEAR] = comp->year; - dparts[DUK_DATE_IDX_MONTH] = comp->month; - dparts[DUK_DATE_IDX_DAY] = comp->day - 1.0; - dparts[DUK_DATE_IDX_HOUR] = comp->hours; - dparts[DUK_DATE_IDX_MINUTE] = comp->minutes; - dparts[DUK_DATE_IDX_SECOND] = comp->seconds; - dparts[DUK_DATE_IDX_MILLISECOND] = comp->milliseconds; - dparts[DUK_DATE_IDX_WEEKDAY] = 0; /* ignored */ - - d = duk_bi_date_get_timeval_from_dparts(dparts, flags); - - return d; -} -#line 1 "duk_bi_array.c" -/* - * Array built-ins - * - * Most Array built-ins are intentionally generic in Ecmascript, and are - * intended to work even when the 'this' binding is not an Array instance. - * This Ecmascript feature is also used by much real world code. For this - * reason the implementations here don't assume exotic Array behavior or - * e.g. presence of a .length property. However, some algorithms have a - * fast path for duk_harray backed actual Array instances, enabled when - * footprint is not a concern. - * - * XXX: the "Throw" flag should be set for (almost?) all [[Put]] and - * [[Delete]] operations, but it's currently false throughout. Go through - * all put/delete cases and check throw flag use. Need a new API primitive - * which allows throws flag to be specified. - * - * XXX: array lengths above 2G won't work reliably. There are many places - * where one needs a full signed 32-bit range ([-0xffffffff, 0xffffffff], - * i.e. -33- bits). Although array 'length' cannot be written to be outside - * the unsigned 32-bit range (E5.1 Section 15.4.5.1 throws a RangeError if so) - * some intermediate values may be above 0xffffffff and this may not be always - * correctly handled now (duk_uint32_t is not enough for all algorithms). - * For instance, push() can legitimately write entries beyond length 0xffffffff - * and cause a RangeError only at the end. To do this properly, the current - * push() implementation tracks the array index using a 'double' instead of a - * duk_uint32_t (which is somewhat awkward). See test-bi-array-push-maxlen.js. - * - * On using "put" vs. "def" prop - * ============================= - * - * Code below must be careful to use the appropriate primitive as it matters - * for compliance. When using "put" there may be inherited properties in - * Array.prototype which cause side effects when values are written. When - * using "define" there are no such side effects, and many test262 test cases - * check for this (for real world code, such side effects are very rare). - * Both "put" and "define" are used in the E5.1 specification; as a rule, - * "put" is used when modifying an existing array (or a non-array 'this' - * binding) and "define" for setting values into a fresh result array. - */ - -/* #include duk_internal.h -> already included */ - -/* Perform an intermediate join when this many elements have been pushed - * on the value stack. - */ -#define DUK__ARRAY_MID_JOIN_LIMIT 4096 - -#if defined(DUK_USE_ARRAY_BUILTIN) - -/* - * Shared helpers. - */ - -/* Shared entry code for many Array built-ins: the 'this' binding is pushed - * on the value stack and object coerced, and the current .length is returned. - * Note that length is left on stack (it could be popped, but that's not - * usually necessary because call handling will clean it up automatically). - */ -DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32(duk_hthread *thr) { - duk_uint32_t len; - - /* XXX: push more directly? */ - (void) duk_push_this_coercible_to_object(thr); - DUK_ASSERT_HOBJECT_VALID(duk_get_hobject(thr, -1)); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_LENGTH); - len = duk_to_uint32(thr, -1); - - /* -> [ ... ToObject(this) ToUint32(length) ] */ - return len; -} - -DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32_limited(duk_hthread *thr) { - /* Range limited to [0, 0x7fffffff] range, i.e. range that can be - * represented with duk_int32_t. Use this when the method doesn't - * handle the full 32-bit unsigned range correctly. - */ - duk_uint32_t ret = duk__push_this_obj_len_u32(thr); - if (DUK_UNLIKELY(ret >= 0x80000000UL)) { - DUK_ERROR_RANGE_INVALID_LENGTH(thr); - } - return ret; -} - -#if defined(DUK_USE_ARRAY_FASTPATH) -/* Check if 'this' binding is an Array instance (duk_harray) which satisfies - * a few other guarantees for fast path operation. The fast path doesn't - * need to handle all operations, even for duk_harrays, but must handle a - * significant fraction to improve performance. Return a non-NULL duk_harray - * pointer when all fast path criteria are met, NULL otherwise. - */ -DUK_LOCAL duk_harray *duk__arraypart_fastpath_this(duk_hthread *thr) { - duk_tval *tv; - duk_hobject *h; - duk_uint_t flags_mask, flags_bits, flags_value; - - DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* because call in progress */ - tv = DUK_GET_THIS_TVAL_PTR(thr); - - /* Fast path requires that 'this' is a duk_harray. Read only arrays - * (ROM backed) are also rejected for simplicity. - */ - if (!DUK_TVAL_IS_OBJECT(tv)) { - DUK_DD(DUK_DDPRINT("reject array fast path: not an object")); - return NULL; - } - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - flags_mask = DUK_HOBJECT_FLAG_ARRAY_PART | \ - DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \ - DUK_HEAPHDR_FLAG_READONLY; - flags_bits = DUK_HOBJECT_FLAG_ARRAY_PART | \ - DUK_HOBJECT_FLAG_EXOTIC_ARRAY; - flags_value = DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) h); - if ((flags_value & flags_mask) != flags_bits) { - DUK_DD(DUK_DDPRINT("reject array fast path: object flag check failed")); - return NULL; - } - - /* In some cases a duk_harray's 'length' may be larger than the - * current array part allocation. Avoid the fast path in these - * cases, so that all fast path code can safely assume that all - * items in the range [0,length[ are backed by the current array - * part allocation. - */ - if (((duk_harray *) h)->length > DUK_HOBJECT_GET_ASIZE(h)) { - DUK_DD(DUK_DDPRINT("reject array fast path: length > array part size")); - return NULL; - } - - /* Guarantees for fast path. */ - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0 || DUK_HOBJECT_A_GET_BASE(thr->heap, h) != NULL); - DUK_ASSERT(((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h)); - - DUK_DD(DUK_DDPRINT("array fast path allowed for: %!O", (duk_heaphdr *) h)); - return (duk_harray *) h; -} -#endif /* DUK_USE_ARRAY_FASTPATH */ - -/* - * Constructor - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_constructor(duk_hthread *thr) { - duk_idx_t nargs; - duk_harray *a; - duk_double_t d; - duk_uint32_t len; - duk_uint32_t len_prealloc; - - nargs = duk_get_top(thr); - - if (nargs == 1 && duk_is_number(thr, 0)) { - /* XXX: expensive check (also shared elsewhere - so add a shared internal API call?) */ - d = duk_get_number(thr, 0); - len = duk_to_uint32(thr, 0); - if (((duk_double_t) len) != d) { - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); - } - - /* For small lengths create a dense preallocated array. - * For large arrays preallocate an initial part. - */ - len_prealloc = len < 64 ? len : 64; - a = duk_push_harray_with_size(thr, len_prealloc); - DUK_ASSERT(a != NULL); - a->length = len; - return 1; - } - - duk_pack(thr, nargs); - return 1; -} - -/* - * isArray() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_constructor_is_array(duk_hthread *thr) { - duk_hobject *h; - - h = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_ARRAY); - duk_push_boolean(thr, (h != NULL)); - return 1; -} - -/* - * toString() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_to_string(duk_hthread *thr) { - (void) duk_push_this_coercible_to_object(thr); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_JOIN); - - /* [ ... this func ] */ - if (!duk_is_callable(thr, -1)) { - /* Fall back to the initial (original) Object.toString(). We don't - * currently have pointers to the built-in functions, only the top - * level global objects (like "Array") so this is now done in a bit - * of a hacky manner. It would be cleaner to push the (original) - * function and use duk_call_method(). - */ - - /* XXX: 'this' will be ToObject() coerced twice, which is incorrect - * but should have no visible side effects. - */ - DUK_DDD(DUK_DDDPRINT("this.join is not callable, fall back to (original) Object.toString")); - duk_set_top(thr, 0); - return duk_bi_object_prototype_to_string(thr); /* has access to 'this' binding */ - } - - /* [ ... this func ] */ - - duk_insert(thr, -2); - - /* [ ... func this ] */ - - DUK_DDD(DUK_DDDPRINT("calling: func=%!iT, this=%!iT", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - duk_call_method(thr, 0); - - return 1; -} - -/* - * concat() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_concat(duk_hthread *thr) { - duk_idx_t i, n; - duk_uarridx_t idx, idx_last; - duk_uarridx_t j, len; - duk_hobject *h; - - /* XXX: the insert here is a bit expensive if there are a lot of items. - * It could also be special cased in the outermost for loop quite easily - * (as the element is dup()'d anyway). - */ - - (void) duk_push_this_coercible_to_object(thr); - duk_insert(thr, 0); - n = duk_get_top(thr); - duk_push_array(thr); /* -> [ ToObject(this) item1 ... itemN arr ] */ - - /* NOTE: The Array special behaviors are NOT invoked by duk_xdef_prop_index() - * (which differs from the official algorithm). If no error is thrown, this - * doesn't matter as the length is updated at the end. However, if an error - * is thrown, the length will be unset. That shouldn't matter because the - * caller won't get a reference to the intermediate value. - */ - - idx = 0; - idx_last = 0; - for (i = 0; i < n; i++) { - DUK_ASSERT_TOP(thr, n + 1); - - /* [ ToObject(this) item1 ... itemN arr ] */ - - duk_dup(thr, i); - h = duk_get_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_ARRAY); - if (!h) { - duk_xdef_prop_index_wec(thr, -2, idx++); - idx_last = idx; - continue; - } - - /* [ ToObject(this) item1 ... itemN arr item(i) ] */ - - /* XXX: an array can have length higher than 32 bits; this is not handled - * correctly now. - */ - len = (duk_uarridx_t) duk_get_length(thr, -1); - for (j = 0; j < len; j++) { - if (duk_get_prop_index(thr, -1, j)) { - /* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */ - duk_xdef_prop_index_wec(thr, -3, idx++); - idx_last = idx; - } else { - idx++; - duk_pop_undefined(thr); -#if defined(DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER) - /* According to E5.1 Section 15.4.4.4 nonexistent trailing - * elements do not affect 'length' of the result. Test262 - * and other engines disagree, so update idx_last here too. - */ - idx_last = idx; -#else - /* Strict standard behavior, ignore trailing elements for - * result 'length'. - */ -#endif - } - } - duk_pop_unsafe(thr); - } - - /* The E5.1 Section 15.4.4.4 algorithm doesn't set the length explicitly - * in the end, but because we're operating with an internal value which - * is known to be an array, this should be equivalent. - */ - duk_push_uarridx(thr, idx_last); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); - - DUK_ASSERT_TOP(thr, n + 1); - return 1; -} - -/* - * join(), toLocaleString() - * - * Note: checking valstack is necessary, but only in the per-element loop. - * - * Note: the trivial approach of pushing all the elements on the value stack - * and then calling duk_join() fails when the array contains a large number - * of elements. This problem can't be offloaded to duk_join() because the - * elements to join must be handled here and have special handling. Current - * approach is to do intermediate joins with very large number of elements. - * There is no fancy handling; the prefix gets re-joined multiple times. - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_hthread *thr) { - duk_uint32_t len, count; - duk_uint32_t idx; - duk_small_int_t to_locale_string = duk_get_current_magic(thr); - duk_idx_t valstack_required; - - /* For join(), nargs is 1. For toLocaleString(), nargs is 0 and - * setting the top essentially pushes an undefined to the stack, - * thus defaulting to a comma separator. - */ - duk_set_top(thr, 1); - if (duk_is_undefined(thr, 0)) { - duk_pop_undefined(thr); - duk_push_hstring_stridx(thr, DUK_STRIDX_COMMA); - } else { - duk_to_string(thr, 0); - } - - len = duk__push_this_obj_len_u32(thr); - - /* [ sep ToObject(this) len ] */ - - DUK_DDD(DUK_DDDPRINT("sep=%!T, this=%!T, len=%lu", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1), - (unsigned long) len)); - - /* The extra (+4) is tight. */ - valstack_required = (duk_idx_t) ((len >= DUK__ARRAY_MID_JOIN_LIMIT ? - DUK__ARRAY_MID_JOIN_LIMIT : len) + 4); - duk_require_stack(thr, valstack_required); - - duk_dup_0(thr); - - /* [ sep ToObject(this) len sep ] */ - - count = 0; - idx = 0; - for (;;) { - DUK_DDD(DUK_DDDPRINT("join idx=%ld", (long) idx)); - if (count >= DUK__ARRAY_MID_JOIN_LIMIT || /* intermediate join to avoid valstack overflow */ - idx >= len) { /* end of loop (careful with len==0) */ - /* [ sep ToObject(this) len sep str0 ... str(count-1) ] */ - DUK_DDD(DUK_DDDPRINT("mid/final join, count=%ld, idx=%ld, len=%ld", - (long) count, (long) idx, (long) len)); - duk_join(thr, (duk_idx_t) count); /* -> [ sep ToObject(this) len str ] */ - duk_dup_0(thr); /* -> [ sep ToObject(this) len str sep ] */ - duk_insert(thr, -2); /* -> [ sep ToObject(this) len sep str ] */ - count = 1; - } - if (idx >= len) { - /* if true, the stack already contains the final result */ - break; - } - - duk_get_prop_index(thr, 1, (duk_uarridx_t) idx); - if (duk_is_null_or_undefined(thr, -1)) { - duk_pop_nodecref_unsafe(thr); - duk_push_hstring_empty(thr); - } else { - if (to_locale_string) { - duk_to_object(thr, -1); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_LOCALE_STRING); - duk_insert(thr, -2); /* -> [ ... toLocaleString ToObject(val) ] */ - duk_call_method(thr, 0); - } - duk_to_string(thr, -1); - } - - count++; - idx++; - } - - /* [ sep ToObject(this) len sep result ] */ - - return 1; -} - -/* - * pop(), push() - */ - -#if defined(DUK_USE_ARRAY_FASTPATH) -DUK_LOCAL duk_ret_t duk__array_pop_fastpath(duk_hthread *thr, duk_harray *h_arr) { - duk_tval *tv_arraypart; - duk_tval *tv_val; - duk_uint32_t len; - - tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr); - len = h_arr->length; - if (len <= 0) { - /* nop, return undefined */ - return 0; - } - - len--; - h_arr->length = len; - - /* Fast path doesn't check for an index property inherited from - * Array.prototype. This is quite often acceptable; if not, - * disable fast path. - */ - DUK_ASSERT_VS_SPACE(thr); - tv_val = tv_arraypart + len; - if (DUK_TVAL_IS_UNUSED(tv_val)) { - /* No net refcount change. Value stack already has - * 'undefined' based on value stack init policy. - */ - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); - DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv_val)); - } else { - /* No net refcount change. */ - DUK_TVAL_SET_TVAL(thr->valstack_top, tv_val); - DUK_TVAL_SET_UNUSED(tv_val); - } - thr->valstack_top++; - - /* XXX: there's no shrink check in the fast path now */ - - return 1; -} -#endif /* DUK_USE_ARRAY_FASTPATH */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_pop(duk_hthread *thr) { - duk_uint32_t len; - duk_uint32_t idx; -#if defined(DUK_USE_ARRAY_FASTPATH) - duk_harray *h_arr; -#endif - - DUK_ASSERT_TOP(thr, 0); - -#if defined(DUK_USE_ARRAY_FASTPATH) - h_arr = duk__arraypart_fastpath_this(thr); - if (h_arr) { - return duk__array_pop_fastpath(thr, h_arr); - } -#endif - - /* XXX: Merge fastpath check into a related call (push this, coerce length, etc)? */ - - len = duk__push_this_obj_len_u32(thr); - if (len == 0) { - duk_push_int(thr, 0); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); - return 0; - } - idx = len - 1; - - duk_get_prop_index(thr, 0, (duk_uarridx_t) idx); - duk_del_prop_index(thr, 0, (duk_uarridx_t) idx); - duk_push_u32(thr, idx); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); - return 1; -} - -#if defined(DUK_USE_ARRAY_FASTPATH) -DUK_LOCAL duk_ret_t duk__array_push_fastpath(duk_hthread *thr, duk_harray *h_arr) { - duk_tval *tv_arraypart; - duk_tval *tv_src; - duk_tval *tv_dst; - duk_uint32_t len; - duk_idx_t i, n; - - len = h_arr->length; - tv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr); - - n = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); - DUK_ASSERT(n >= 0); - DUK_ASSERT((duk_uint32_t) n <= DUK_UINT32_MAX); - if (DUK_UNLIKELY(len + (duk_uint32_t) n < len)) { - DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw")); - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); /* != 0 return value returned as is by caller */ - } - if (len + (duk_uint32_t) n > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr)) { - /* Array part would need to be extended. Rely on slow path - * for now. - * - * XXX: Rework hobject code a bit and add extend support. - */ - return 0; - } - - tv_src = thr->valstack_bottom; - tv_dst = tv_arraypart + len; - for (i = 0; i < n; i++) { - /* No net refcount change; reset value stack values to - * undefined to satisfy value stack init policy. - */ - DUK_TVAL_SET_TVAL(tv_dst, tv_src); - DUK_TVAL_SET_UNDEFINED(tv_src); - tv_src++; - tv_dst++; - } - thr->valstack_top = thr->valstack_bottom; - len += (duk_uint32_t) n; - h_arr->length = len; - - DUK_ASSERT((duk_uint_t) len == len); - duk_push_uint(thr, (duk_uint_t) len); - return 1; -} -#endif /* DUK_USE_ARRAY_FASTPATH */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_push(duk_hthread *thr) { - /* Note: 'this' is not necessarily an Array object. The push() - * algorithm is supposed to work for other kinds of objects too, - * so the algorithm has e.g. an explicit update for the 'length' - * property which is normally "magical" in arrays. - */ - - duk_uint32_t len; - duk_idx_t i, n; -#if defined(DUK_USE_ARRAY_FASTPATH) - duk_harray *h_arr; -#endif - -#if defined(DUK_USE_ARRAY_FASTPATH) - h_arr = duk__arraypart_fastpath_this(thr); - if (h_arr) { - duk_ret_t rc; - rc = duk__array_push_fastpath(thr, h_arr); - if (rc != 0) { - return rc; - } - DUK_DD(DUK_DDPRINT("array push() fast path exited, resize case")); - } -#endif - - n = duk_get_top(thr); - len = duk__push_this_obj_len_u32(thr); - - /* [ arg1 ... argN obj length ] */ - - /* Technically Array.prototype.push() can create an Array with length - * longer than 2^32-1, i.e. outside the 32-bit range. The final length - * is *not* wrapped to 32 bits in the specification. - * - * This implementation tracks length with a uint32 because it's much - * more practical. - * - * See: test-bi-array-push-maxlen.js. - */ - - if (len + (duk_uint32_t) n < len) { - DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw")); - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); - } - - for (i = 0; i < n; i++) { - duk_dup(thr, i); - duk_put_prop_index(thr, -3, (duk_uarridx_t) (len + (duk_uint32_t) i)); - } - len += (duk_uint32_t) n; - - duk_push_u32(thr, len); - duk_dup_top(thr); - duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); - - /* [ arg1 ... argN obj length new_length ] */ - return 1; -} - -/* - * sort() - * - * Currently qsort with random pivot. This is now really, really slow, - * because there is no fast path for array parts. - * - * Signed indices are used because qsort() leaves and degenerate cases - * may use a negative offset. - */ - -DUK_LOCAL duk_small_int_t duk__array_sort_compare(duk_hthread *thr, duk_int_t idx1, duk_int_t idx2) { - duk_bool_t have1, have2; - duk_bool_t undef1, undef2; - duk_small_int_t ret; - duk_idx_t idx_obj = 1; /* fixed offsets in valstack */ - duk_idx_t idx_fn = 0; - duk_hstring *h1, *h2; - - /* Fast exit if indices are identical. This is valid for a non-existent property, - * for an undefined value, and almost always for ToString() coerced comparison of - * arbitrary values (corner cases where this is not the case include e.g. a an - * object with varying ToString() coercion). - * - * The specification does not prohibit "caching" of values read from the array, so - * assuming equality for comparing an index with itself falls into the category of - * "caching". - * - * Also, compareFn may be inconsistent, so skipping a call to compareFn here may - * have an effect on the final result. The specification does not require any - * specific behavior for inconsistent compare functions, so again, this fast path - * is OK. - */ - - if (idx1 == idx2) { - DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld -> indices identical, quick exit", - (long) idx1, (long) idx2)); - return 0; - } - - have1 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx1); - have2 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx2); - - DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld, have1=%ld, have2=%ld, val1=%!T, val2=%!T", - (long) idx1, (long) idx2, (long) have1, (long) have2, - (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); - - if (have1) { - if (have2) { - ; - } else { - ret = -1; - goto pop_ret; - } - } else { - if (have2) { - ret = 1; - goto pop_ret; - } else { - ret = 0; - goto pop_ret; - } - } - - undef1 = duk_is_undefined(thr, -2); - undef2 = duk_is_undefined(thr, -1); - if (undef1) { - if (undef2) { - ret = 0; - goto pop_ret; - } else { - ret = 1; - goto pop_ret; - } - } else { - if (undef2) { - ret = -1; - goto pop_ret; - } else { - ; - } - } - - if (!duk_is_undefined(thr, idx_fn)) { - duk_double_t d; - - /* No need to check callable; duk_call() will do that. */ - duk_dup(thr, idx_fn); /* -> [ ... x y fn ] */ - duk_insert(thr, -3); /* -> [ ... fn x y ] */ - duk_call(thr, 2); /* -> [ ... res ] */ - - /* ES5 is a bit vague about what to do if the return value is - * not a number. ES2015 provides a concrete description: - * http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare. - */ - - d = duk_to_number_m1(thr); - if (d < 0.0) { - ret = -1; - } else if (d > 0.0) { - ret = 1; - } else { - /* Because NaN compares to false, NaN is handled here - * without an explicit check above. - */ - ret = 0; - } - - duk_pop_nodecref_unsafe(thr); - DUK_DDD(DUK_DDDPRINT("-> result %ld (from comparefn, after coercion)", (long) ret)); - return ret; - } - - /* string compare is the default (a bit oddly) */ - - /* XXX: any special handling for plain array; causes repeated coercion now? */ - h1 = duk_to_hstring(thr, -2); - h2 = duk_to_hstring_m1(thr); - DUK_ASSERT(h1 != NULL); - DUK_ASSERT(h2 != NULL); - - ret = duk_js_string_compare(h1, h2); /* retval is directly usable */ - goto pop_ret; - - pop_ret: - duk_pop_2_unsafe(thr); - DUK_DDD(DUK_DDDPRINT("-> result %ld", (long) ret)); - return ret; -} - -DUK_LOCAL void duk__array_sort_swap(duk_hthread *thr, duk_int_t l, duk_int_t r) { - duk_bool_t have_l, have_r; - duk_idx_t idx_obj = 1; /* fixed offset in valstack */ - - if (l == r) { - return; - } - - /* swap elements; deal with non-existent elements correctly */ - have_l = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) l); - have_r = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) r); - - if (have_r) { - /* right exists, [[Put]] regardless whether or not left exists */ - duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) l); - } else { - duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) l); - duk_pop_undefined(thr); - } - - if (have_l) { - duk_put_prop_index(thr, idx_obj, (duk_uarridx_t) r); - } else { - duk_del_prop_index(thr, idx_obj, (duk_uarridx_t) r); - duk_pop_undefined(thr); - } -} - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -/* Debug print which visualizes the qsort partitioning process. */ -DUK_LOCAL void duk__debuglog_qsort_state(duk_hthread *thr, duk_int_t lo, duk_int_t hi, duk_int_t pivot) { - char buf[4096]; - char *ptr = buf; - duk_int_t i, n; - n = (duk_int_t) duk_get_length(thr, 1); - if (n > 4000) { - n = 4000; - } - *ptr++ = '['; - for (i = 0; i < n; i++) { - if (i == pivot) { - *ptr++ = '|'; - } else if (i == lo) { - *ptr++ = '<'; - } else if (i == hi) { - *ptr++ = '>'; - } else if (i >= lo && i <= hi) { - *ptr++ = '-'; - } else { - *ptr++ = ' '; - } - } - *ptr++ = ']'; - *ptr++ = '\0'; - - DUK_DDD(DUK_DDDPRINT("%s (lo=%ld, hi=%ld, pivot=%ld)", - (const char *) buf, (long) lo, (long) hi, (long) pivot)); -} -#endif - -DUK_LOCAL void duk__array_qsort(duk_hthread *thr, duk_int_t lo, duk_int_t hi) { - duk_int_t p, l, r; - - /* The lo/hi indices may be crossed and hi < 0 is possible at entry. */ - - DUK_DDD(DUK_DDDPRINT("duk__array_qsort: lo=%ld, hi=%ld, obj=%!T", - (long) lo, (long) hi, (duk_tval *) duk_get_tval(thr, 1))); - - DUK_ASSERT_TOP(thr, 3); - - /* In some cases it may be that lo > hi, or hi < 0; these - * degenerate cases happen e.g. for empty arrays, and in - * recursion leaves. - */ - - /* trivial cases */ - if (hi - lo < 1) { - DUK_DDD(DUK_DDDPRINT("degenerate case, return immediately")); - return; - } - DUK_ASSERT(hi > lo); - DUK_ASSERT(hi - lo + 1 >= 2); - - /* randomized pivot selection */ - p = lo + (duk_int_t) (DUK_UTIL_GET_RANDOM_DOUBLE(thr) * (duk_double_t) (hi - lo + 1)); - DUK_ASSERT(p >= lo && p <= hi); - DUK_DDD(DUK_DDDPRINT("lo=%ld, hi=%ld, chose pivot p=%ld", (long) lo, (long) hi, (long) p)); - - /* move pivot out of the way */ - duk__array_sort_swap(thr, p, lo); - p = lo; - DUK_DDD(DUK_DDDPRINT("pivot moved out of the way: %!T", (duk_tval *) duk_get_tval(thr, 1))); - - l = lo + 1; - r = hi; - for (;;) { - /* find elements to swap */ - for (;;) { - DUK_DDD(DUK_DDDPRINT("left scan: l=%ld, r=%ld, p=%ld", - (long) l, (long) r, (long) p)); - if (l >= hi) { - break; - } - if (duk__array_sort_compare(thr, l, p) >= 0) { /* !(l < p) */ - break; - } - l++; - } - for (;;) { - DUK_DDD(DUK_DDDPRINT("right scan: l=%ld, r=%ld, p=%ld", - (long) l, (long) r, (long) p)); - if (r <= lo) { - break; - } - if (duk__array_sort_compare(thr, p, r) >= 0) { /* !(p < r) */ - break; - } - r--; - } - if (l >= r) { - goto done; - } - DUK_ASSERT(l < r); - - DUK_DDD(DUK_DDDPRINT("swap %ld and %ld", (long) l, (long) r)); - - duk__array_sort_swap(thr, l, r); - - DUK_DDD(DUK_DDDPRINT("after swap: %!T", (duk_tval *) duk_get_tval(thr, 1))); - l++; - r--; - } - done: - /* Note that 'l' and 'r' may cross, i.e. r < l */ - DUK_ASSERT(l >= lo && l <= hi); - DUK_ASSERT(r >= lo && r <= hi); - - /* XXX: there's no explicit recursion bound here now. For the average - * qsort recursion depth O(log n) that's not really necessary: e.g. for - * 2**32 recursion depth would be about 32 which is OK. However, qsort - * worst case recursion depth is O(n) which may be a problem. - */ - - /* move pivot to its final place */ - DUK_DDD(DUK_DDDPRINT("before final pivot swap: %!T", (duk_tval *) duk_get_tval(thr, 1))); - duk__array_sort_swap(thr, lo, r); - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - duk__debuglog_qsort_state(thr, lo, hi, r); -#endif - - DUK_DDD(DUK_DDDPRINT("recurse: pivot=%ld, obj=%!T", (long) r, (duk_tval *) duk_get_tval(thr, 1))); - duk__array_qsort(thr, lo, r - 1); - duk__array_qsort(thr, r + 1, hi); -} - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_sort(duk_hthread *thr) { - duk_uint32_t len; - - /* XXX: len >= 0x80000000 won't work below because a signed type - * is needed by qsort. - */ - len = duk__push_this_obj_len_u32_limited(thr); - - /* stack[0] = compareFn - * stack[1] = ToObject(this) - * stack[2] = ToUint32(length) - */ - - if (len > 0) { - /* avoid degenerate cases, so that (len - 1) won't underflow */ - duk__array_qsort(thr, (duk_int_t) 0, (duk_int_t) (len - 1)); - } - - DUK_ASSERT_TOP(thr, 3); - duk_pop_nodecref_unsafe(thr); - return 1; /* return ToObject(this) */ -} - -/* - * splice() - */ - -/* XXX: this compiles to over 500 bytes now, even without special handling - * for an array part. Uses signed ints so does not handle full array range correctly. - */ - -/* XXX: can shift() / unshift() use the same helper? - * shift() is (close to?) <--> splice(0, 1) - * unshift is (close to?) <--> splice(0, 0, [items])? - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_hthread *thr) { - duk_idx_t nargs; - duk_uint32_t len_u32; - duk_int_t len; - duk_bool_t have_delcount; - duk_int_t item_count; - duk_int_t act_start; - duk_int_t del_count; - duk_int_t i, n; - - DUK_UNREF(have_delcount); - - nargs = duk_get_top(thr); - if (nargs < 2) { - duk_set_top(thr, 2); - nargs = 2; - have_delcount = 0; - } else { - have_delcount = 1; - } - - /* XXX: len >= 0x80000000 won't work below because we need to be - * able to represent -len. - */ - len_u32 = duk__push_this_obj_len_u32_limited(thr); - len = (duk_int_t) len_u32; - DUK_ASSERT(len >= 0); - - act_start = duk_to_int_clamped(thr, 0, -len, len); - if (act_start < 0) { - act_start = len + act_start; - } - DUK_ASSERT(act_start >= 0 && act_start <= len); - -#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT) - if (have_delcount) { -#endif - del_count = duk_to_int_clamped(thr, 1, 0, len - act_start); -#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT) - } else { - /* E5.1 standard behavior when deleteCount is not given would be - * to treat it just like if 'undefined' was given, which coerces - * ultimately to 0. Real world behavior is to splice to the end - * of array, see test-bi-array-proto-splice-no-delcount.js. - */ - del_count = len - act_start; - } -#endif - - DUK_ASSERT(nargs >= 2); - item_count = (duk_int_t) (nargs - 2); - - DUK_ASSERT(del_count >= 0 && del_count <= len - act_start); - DUK_ASSERT(del_count + act_start <= len); - - /* For now, restrict result array into 32-bit length range. */ - if (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) { - DUK_D(DUK_DPRINT("Array.prototype.splice() would go beyond 32-bit length, throw")); - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); - } - - duk_push_array(thr); - - /* stack[0] = start - * stack[1] = deleteCount - * stack[2...nargs-1] = items - * stack[nargs] = ToObject(this) -3 - * stack[nargs+1] = ToUint32(length) -2 - * stack[nargs+2] = result array -1 - */ - - DUK_ASSERT_TOP(thr, nargs + 3); - - /* Step 9: copy elements-to-be-deleted into the result array */ - - for (i = 0; i < del_count; i++) { - if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (act_start + i))) { - duk_xdef_prop_index_wec(thr, -2, (duk_uarridx_t) i); /* throw flag irrelevant (false in std alg) */ - } else { - duk_pop_undefined(thr); - } - } - duk_push_u32(thr, (duk_uint32_t) del_count); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); - - /* Steps 12 and 13: reorganize elements to make room for itemCount elements */ - - if (item_count < del_count) { - /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1 - * -> [ A B F G H ] (conceptual intermediate step) - * -> [ A B . F G H ] (placeholder marked) - * [ A B C F G H ] (actual result at this point, C will be replaced) - */ - - DUK_ASSERT_TOP(thr, nargs + 3); - - n = len - del_count; - for (i = act_start; i < n; i++) { - if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) { - duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count)); - } else { - duk_pop_undefined(thr); - duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count)); - } - } - - DUK_ASSERT_TOP(thr, nargs + 3); - - /* loop iterator init and limit changed from standard algorithm */ - n = len - del_count + item_count; - for (i = len - 1; i >= n; i--) { - duk_del_prop_index(thr, -3, (duk_uarridx_t) i); - } - - DUK_ASSERT_TOP(thr, nargs + 3); - } else if (item_count > del_count) { - /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 4 - * -> [ A B F G H ] (conceptual intermediate step) - * -> [ A B . . . . F G H ] (placeholder marked) - * [ A B C D E F F G H ] (actual result at this point) - */ - - DUK_ASSERT_TOP(thr, nargs + 3); - - /* loop iterator init and limit changed from standard algorithm */ - for (i = len - del_count - 1; i >= act_start; i--) { - if (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) { - duk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count)); - } else { - duk_pop_undefined(thr); - duk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count)); - } - } - - DUK_ASSERT_TOP(thr, nargs + 3); - } else { - /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 3 - * -> [ A B F G H ] (conceptual intermediate step) - * -> [ A B . . . F G H ] (placeholder marked) - * [ A B C D E F G H ] (actual result at this point) - */ - } - DUK_ASSERT_TOP(thr, nargs + 3); - - /* Step 15: insert itemCount elements into the hole made above */ - - for (i = 0; i < item_count; i++) { - duk_dup(thr, i + 2); /* args start at index 2 */ - duk_put_prop_index(thr, -4, (duk_uarridx_t) (act_start + i)); - } - - /* Step 16: update length; note that the final length may be above 32 bit range - * (but we checked above that this isn't the case here) - */ - - duk_push_u32(thr, (duk_uint32_t) (len - del_count + item_count)); - duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); - - /* result array is already at the top of stack */ - DUK_ASSERT_TOP(thr, nargs + 3); - return 1; -} - -/* - * reverse() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reverse(duk_hthread *thr) { - duk_uint32_t len; - duk_uint32_t middle; - duk_uint32_t lower, upper; - duk_bool_t have_lower, have_upper; - - len = duk__push_this_obj_len_u32(thr); - middle = len / 2; - - /* If len <= 1, middle will be 0 and for-loop bails out - * immediately (0 < 0 -> false). - */ - - for (lower = 0; lower < middle; lower++) { - DUK_ASSERT(len >= 2); - DUK_ASSERT_TOP(thr, 2); - - DUK_ASSERT(len >= lower + 1); - upper = len - lower - 1; - - have_lower = duk_get_prop_index(thr, -2, (duk_uarridx_t) lower); - have_upper = duk_get_prop_index(thr, -3, (duk_uarridx_t) upper); - - /* [ ToObject(this) ToUint32(length) lowerValue upperValue ] */ - - if (have_upper) { - duk_put_prop_index(thr, -4, (duk_uarridx_t) lower); - } else { - duk_del_prop_index(thr, -4, (duk_uarridx_t) lower); - duk_pop_undefined(thr); - } - - if (have_lower) { - duk_put_prop_index(thr, -3, (duk_uarridx_t) upper); - } else { - duk_del_prop_index(thr, -3, (duk_uarridx_t) upper); - duk_pop_undefined(thr); - } - - DUK_ASSERT_TOP(thr, 2); - } - - DUK_ASSERT_TOP(thr, 2); - duk_pop_unsafe(thr); /* -> [ ToObject(this) ] */ - return 1; -} - -/* - * slice() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_slice(duk_hthread *thr) { - duk_uint32_t len_u32; - duk_int_t len; - duk_int_t start, end; - duk_int_t i; - duk_uarridx_t idx; - duk_uint32_t res_length = 0; - - /* XXX: len >= 0x80000000 won't work below because we need to be - * able to represent -len. - */ - len_u32 = duk__push_this_obj_len_u32_limited(thr); - len = (duk_int_t) len_u32; - DUK_ASSERT(len >= 0); - - duk_push_array(thr); - - /* stack[0] = start - * stack[1] = end - * stack[2] = ToObject(this) - * stack[3] = ToUint32(length) - * stack[4] = result array - */ - - start = duk_to_int_clamped(thr, 0, -len, len); - if (start < 0) { - start = len + start; - } - /* XXX: could duk_is_undefined() provide defaulting undefined to 'len' - * (the upper limit)? - */ - if (duk_is_undefined(thr, 1)) { - end = len; - } else { - end = duk_to_int_clamped(thr, 1, -len, len); - if (end < 0) { - end = len + end; - } - } - DUK_ASSERT(start >= 0 && start <= len); - DUK_ASSERT(end >= 0 && end <= len); - - idx = 0; - for (i = start; i < end; i++) { - DUK_ASSERT_TOP(thr, 5); - if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { - duk_xdef_prop_index_wec(thr, 4, idx); - res_length = idx + 1; - } else { - duk_pop_undefined(thr); - } - idx++; - DUK_ASSERT_TOP(thr, 5); - } - - duk_push_u32(thr, res_length); - duk_xdef_prop_stridx_short(thr, 4, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); - - DUK_ASSERT_TOP(thr, 5); - return 1; -} - -/* - * shift() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_shift(duk_hthread *thr) { - duk_uint32_t len; - duk_uint32_t i; - - len = duk__push_this_obj_len_u32(thr); - if (len == 0) { - duk_push_int(thr, 0); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); - return 0; - } - - duk_get_prop_index(thr, 0, 0); - - /* stack[0] = object (this) - * stack[1] = ToUint32(length) - * stack[2] = elem at index 0 (retval) - */ - - for (i = 1; i < len; i++) { - DUK_ASSERT_TOP(thr, 3); - if (duk_get_prop_index(thr, 0, (duk_uarridx_t) i)) { - /* fromPresent = true */ - duk_put_prop_index(thr, 0, (duk_uarridx_t) (i - 1)); - } else { - /* fromPresent = false */ - duk_del_prop_index(thr, 0, (duk_uarridx_t) (i - 1)); - duk_pop_undefined(thr); - } - } - duk_del_prop_index(thr, 0, (duk_uarridx_t) (len - 1)); - - duk_push_u32(thr, (duk_uint32_t) (len - 1)); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); - - DUK_ASSERT_TOP(thr, 3); - return 1; -} - -/* - * unshift() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_unshift(duk_hthread *thr) { - duk_idx_t nargs; - duk_uint32_t len; - duk_uint32_t i; - - nargs = duk_get_top(thr); - len = duk__push_this_obj_len_u32(thr); - - /* stack[0...nargs-1] = unshift args (vararg) - * stack[nargs] = ToObject(this) - * stack[nargs+1] = ToUint32(length) - */ - - DUK_ASSERT_TOP(thr, nargs + 2); - - /* Note: unshift() may operate on indices above unsigned 32-bit range - * and the final length may be >= 2**32. However, we restrict the - * final result to 32-bit range for practicality. - */ - - if (len + (duk_uint32_t) nargs < len) { - DUK_D(DUK_DPRINT("Array.prototype.unshift() would go beyond 32-bit length, throw")); - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); - } - - i = len; - while (i > 0) { - DUK_ASSERT_TOP(thr, nargs + 2); - i--; - /* k+argCount-1; note that may be above 32-bit range */ - - if (duk_get_prop_index(thr, -2, (duk_uarridx_t) i)) { - /* fromPresent = true */ - /* [ ... ToObject(this) ToUint32(length) val ] */ - duk_put_prop_index(thr, -3, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ - } else { - /* fromPresent = false */ - /* [ ... ToObject(this) ToUint32(length) val ] */ - duk_pop_undefined(thr); - duk_del_prop_index(thr, -2, (duk_uarridx_t) (i + (duk_uint32_t) nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ - } - DUK_ASSERT_TOP(thr, nargs + 2); - } - - for (i = 0; i < (duk_uint32_t) nargs; i++) { - DUK_ASSERT_TOP(thr, nargs + 2); - duk_dup(thr, (duk_idx_t) i); /* -> [ ... ToObject(this) ToUint32(length) arg[i] ] */ - duk_put_prop_index(thr, -3, (duk_uarridx_t) i); - DUK_ASSERT_TOP(thr, nargs + 2); - } - - DUK_ASSERT_TOP(thr, nargs + 2); - duk_push_u32(thr, len + (duk_uint32_t) nargs); - duk_dup_top(thr); /* -> [ ... ToObject(this) ToUint32(length) final_len final_len ] */ - duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH); - return 1; -} - -/* - * indexOf(), lastIndexOf() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_hthread *thr) { - duk_idx_t nargs; - duk_int_t i, len; - duk_int_t from_idx; - duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for indexOf, -1 for lastIndexOf */ - - /* lastIndexOf() needs to be a vararg function because we must distinguish - * between an undefined fromIndex and a "not given" fromIndex; indexOf() is - * made vararg for symmetry although it doesn't strictly need to be. - */ - - nargs = duk_get_top(thr); - duk_set_top(thr, 2); - - /* XXX: must be able to represent -len */ - len = (duk_int_t) duk__push_this_obj_len_u32_limited(thr); - if (len == 0) { - goto not_found; - } - - /* Index clamping is a bit tricky, we must ensure that we'll only iterate - * through elements that exist and that the specific requirements from E5.1 - * Sections 15.4.4.14 and 15.4.4.15 are fulfilled; especially: - * - * - indexOf: clamp to [-len,len], negative handling -> [0,len], - * if clamped result is len, for-loop bails out immediately - * - * - lastIndexOf: clamp to [-len-1, len-1], negative handling -> [-1, len-1], - * if clamped result is -1, for-loop bails out immediately - * - * If fromIndex is not given, ToInteger(undefined) = 0, which is correct - * for indexOf() but incorrect for lastIndexOf(). Hence special handling, - * and why lastIndexOf() needs to be a vararg function. - */ - - if (nargs >= 2) { - /* indexOf: clamp fromIndex to [-len, len] - * (if fromIndex == len, for-loop terminates directly) - * - * lastIndexOf: clamp fromIndex to [-len - 1, len - 1] - * (if clamped to -len-1 -> fromIndex becomes -1, terminates for-loop directly) - */ - from_idx = duk_to_int_clamped(thr, - 1, - (idx_step > 0 ? -len : -len - 1), - (idx_step > 0 ? len : len - 1)); - if (from_idx < 0) { - /* for lastIndexOf, result may be -1 (mark immediate termination) */ - from_idx = len + from_idx; - } - } else { - /* for indexOf, ToInteger(undefined) would be 0, i.e. correct, but - * handle both indexOf and lastIndexOf specially here. - */ - if (idx_step > 0) { - from_idx = 0; - } else { - from_idx = len - 1; - } - } - - /* stack[0] = searchElement - * stack[1] = fromIndex - * stack[2] = object - * stack[3] = length (not needed, but not popped above) - */ - - for (i = from_idx; i >= 0 && i < len; i += idx_step) { - DUK_ASSERT_TOP(thr, 4); - - if (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { - DUK_ASSERT_TOP(thr, 5); - if (duk_strict_equals(thr, 0, 4)) { - duk_push_int(thr, i); - return 1; - } - } - - duk_pop_unsafe(thr); - } - - not_found: - duk_push_int(thr, -1); - return 1; -} - -/* - * every(), some(), forEach(), map(), filter() - */ - -#define DUK__ITER_EVERY 0 -#define DUK__ITER_SOME 1 -#define DUK__ITER_FOREACH 2 -#define DUK__ITER_MAP 3 -#define DUK__ITER_FILTER 4 - -/* XXX: This helper is a bit awkward because the handling for the different iteration - * callers is quite different. This now compiles to a bit less than 500 bytes, so with - * 5 callers the net result is about 100 bytes / caller. - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_iter_shared(duk_hthread *thr) { - duk_uint32_t len; - duk_uint32_t i; - duk_uarridx_t k; - duk_bool_t bval; - duk_small_int_t iter_type = duk_get_current_magic(thr); - duk_uint32_t res_length = 0; - - /* each call this helper serves has nargs==2 */ - DUK_ASSERT_TOP(thr, 2); - - len = duk__push_this_obj_len_u32(thr); - duk_require_callable(thr, 0); - /* if thisArg not supplied, behave as if undefined was supplied */ - - if (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) { - duk_push_array(thr); - } else { - duk_push_undefined(thr); - } - - /* stack[0] = callback - * stack[1] = thisArg - * stack[2] = object - * stack[3] = ToUint32(length) (unused, but avoid unnecessary pop) - * stack[4] = result array (or undefined) - */ - - k = 0; /* result index for filter() */ - for (i = 0; i < len; i++) { - DUK_ASSERT_TOP(thr, 5); - - if (!duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) { -#if defined(DUK_USE_NONSTD_ARRAY_MAP_TRAILER) - /* Real world behavior for map(): trailing non-existent - * elements don't invoke the user callback, but are still - * counted towards result 'length'. - */ - if (iter_type == DUK__ITER_MAP) { - res_length = i + 1; - } -#else - /* Standard behavior for map(): trailing non-existent - * elements don't invoke the user callback and are not - * counted towards result 'length'. - */ -#endif - duk_pop_undefined(thr); - continue; - } - - /* The original value needs to be preserved for filter(), hence - * this funny order. We can't re-get the value because of side - * effects. - */ - - duk_dup_0(thr); - duk_dup_1(thr); - duk_dup_m3(thr); - duk_push_u32(thr, i); - duk_dup_2(thr); /* [ ... val callback thisArg val i obj ] */ - duk_call_method(thr, 3); /* -> [ ... val retval ] */ - - switch (iter_type) { - case DUK__ITER_EVERY: - bval = duk_to_boolean(thr, -1); - if (!bval) { - /* stack top contains 'false' */ - return 1; - } - break; - case DUK__ITER_SOME: - bval = duk_to_boolean(thr, -1); - if (bval) { - /* stack top contains 'true' */ - return 1; - } - break; - case DUK__ITER_FOREACH: - /* nop */ - break; - case DUK__ITER_MAP: - duk_dup_top(thr); - duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) i); /* retval to result[i] */ - res_length = i + 1; - break; - case DUK__ITER_FILTER: - bval = duk_to_boolean(thr, -1); - if (bval) { - duk_dup_m2(thr); /* orig value */ - duk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) k); - k++; - res_length = k; - } - break; - default: - DUK_UNREACHABLE(); - break; - } - duk_pop_2_unsafe(thr); - - DUK_ASSERT_TOP(thr, 5); - } - - switch (iter_type) { - case DUK__ITER_EVERY: - duk_push_true(thr); - break; - case DUK__ITER_SOME: - duk_push_false(thr); - break; - case DUK__ITER_FOREACH: - duk_push_undefined(thr); - break; - case DUK__ITER_MAP: - case DUK__ITER_FILTER: - DUK_ASSERT_TOP(thr, 5); - DUK_ASSERT(duk_is_array(thr, -1)); /* topmost element is the result array already */ - duk_push_u32(thr, res_length); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); - break; - default: - DUK_UNREACHABLE(); - break; - } - - return 1; -} - -/* - * reduce(), reduceRight() - */ - -DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_hthread *thr) { - duk_idx_t nargs; - duk_bool_t have_acc; - duk_uint32_t i, len; - duk_small_int_t idx_step = duk_get_current_magic(thr); /* idx_step is +1 for reduce, -1 for reduceRight */ - - /* We're a varargs function because we need to detect whether - * initialValue was given or not. - */ - nargs = duk_get_top(thr); - DUK_DDD(DUK_DDDPRINT("nargs=%ld", (long) nargs)); - - duk_set_top(thr, 2); - len = duk__push_this_obj_len_u32(thr); - duk_require_callable(thr, 0); - - /* stack[0] = callback fn - * stack[1] = initialValue - * stack[2] = object (coerced this) - * stack[3] = length (not needed, but not popped above) - * stack[4] = accumulator - */ - - have_acc = 0; - if (nargs >= 2) { - duk_dup_1(thr); - have_acc = 1; - } - DUK_DDD(DUK_DDDPRINT("have_acc=%ld, acc=%!T", - (long) have_acc, (duk_tval *) duk_get_tval(thr, 3))); - - /* For len == 0, i is initialized to len - 1 which underflows. - * The condition (i < len) will then exit the for-loop on the - * first round which is correct. Similarly, loop termination - * happens by i underflowing. - */ - - for (i = (idx_step >= 0 ? 0 : len - 1); - i < len; /* i >= 0 would always be true */ - i += (duk_uint32_t) idx_step) { - DUK_DDD(DUK_DDDPRINT("i=%ld, len=%ld, have_acc=%ld, top=%ld, acc=%!T", - (long) i, (long) len, (long) have_acc, - (long) duk_get_top(thr), - (duk_tval *) duk_get_tval(thr, 4))); - - DUK_ASSERT((have_acc && duk_get_top(thr) == 5) || - (!have_acc && duk_get_top(thr) == 4)); - - if (!duk_has_prop_index(thr, 2, (duk_uarridx_t) i)) { - continue; - } - - if (!have_acc) { - DUK_ASSERT_TOP(thr, 4); - duk_get_prop_index(thr, 2, (duk_uarridx_t) i); - have_acc = 1; - DUK_ASSERT_TOP(thr, 5); - } else { - DUK_ASSERT_TOP(thr, 5); - duk_dup_0(thr); - duk_dup(thr, 4); - duk_get_prop_index(thr, 2, (duk_uarridx_t) i); - duk_push_u32(thr, i); - duk_dup_2(thr); - DUK_DDD(DUK_DDDPRINT("calling reduce function: func=%!T, prev=%!T, curr=%!T, idx=%!T, obj=%!T", - (duk_tval *) duk_get_tval(thr, -5), (duk_tval *) duk_get_tval(thr, -4), - (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - duk_call(thr, 4); - DUK_DDD(DUK_DDDPRINT("-> result: %!T", (duk_tval *) duk_get_tval(thr, -1))); - duk_replace(thr, 4); - DUK_ASSERT_TOP(thr, 5); - } - } - - if (!have_acc) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - DUK_ASSERT_TOP(thr, 5); - return 1; -} - -#endif /* DUK_USE_ARRAY_BUILTIN */ - -/* automatic undefs */ -#undef DUK__ARRAY_MID_JOIN_LIMIT -#undef DUK__ITER_EVERY -#undef DUK__ITER_FILTER -#undef DUK__ITER_FOREACH -#undef DUK__ITER_MAP -#undef DUK__ITER_SOME -#line 1 "duk_bi_boolean.c" -/* - * Boolean built-ins - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_BOOLEAN_BUILTIN) - -/* Shared helper to provide toString() and valueOf(). Checks 'this', gets - * the primitive value to stack top, and optionally coerces with ToString(). - */ -DUK_INTERNAL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_hthread *thr) { - duk_tval *tv; - duk_hobject *h; - duk_small_int_t coerce_tostring = duk_get_current_magic(thr); - - /* XXX: there is room to use a shared helper here, many built-ins - * check the 'this' type, and if it's an object, check its class, - * then get its internal value, etc. - */ - - duk_push_this(thr); - tv = duk_get_tval(thr, -1); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_BOOLEAN(tv)) { - goto type_ok; - } else if (DUK_TVAL_IS_OBJECT(tv)) { - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_BOOLEAN) { - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - DUK_ASSERT(duk_is_boolean(thr, -1)); - goto type_ok; - } - } - - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - /* never here */ - - type_ok: - if (coerce_tostring) { - duk_to_string(thr, -1); - } - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_boolean_constructor(duk_hthread *thr) { - duk_hobject *h_this; - - duk_to_boolean(thr, 0); - - if (duk_is_constructor_call(thr)) { - /* XXX: helper; rely on Boolean.prototype as being non-writable, non-configurable */ - duk_push_this(thr); - h_this = duk_known_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]); - - DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_BOOLEAN); - - duk_dup_0(thr); /* -> [ val obj val ] */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); /* XXX: proper flags? */ - } /* unbalanced stack */ - - return 1; -} - -#endif /* DUK_USE_BOOLEAN_BUILTIN */ -#line 1 "duk_bi_buffer.c" -/* - * ES2015 TypedArray and Node.js Buffer built-ins - */ - -/* #include duk_internal.h -> already included */ - -/* - * Helpers for buffer handling, enabled with DUK_USE_BUFFEROBJECT_SUPPORT. - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -/* Map class number (minus DUK_HOBJECT_CLASS_BUFOBJ_MIN) to a bidx for the - * default internal prototype. - */ -static const duk_uint8_t duk__buffer_proto_from_classnum[] = { - DUK_BIDX_ARRAYBUFFER_PROTOTYPE, - DUK_BIDX_DATAVIEW_PROTOTYPE, - DUK_BIDX_INT8ARRAY_PROTOTYPE, - DUK_BIDX_UINT8ARRAY_PROTOTYPE, - DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, - DUK_BIDX_INT16ARRAY_PROTOTYPE, - DUK_BIDX_UINT16ARRAY_PROTOTYPE, - DUK_BIDX_INT32ARRAY_PROTOTYPE, - DUK_BIDX_UINT32ARRAY_PROTOTYPE, - DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, - DUK_BIDX_FLOAT64ARRAY_PROTOTYPE -}; - -/* Map DUK_HBUFOBJ_ELEM_xxx to duk_hobject class number. - * Sync with duk_hbufobj.h and duk_hobject.h. - */ -static const duk_uint8_t duk__buffer_class_from_elemtype[9] = { - DUK_HOBJECT_CLASS_UINT8ARRAY, - DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, - DUK_HOBJECT_CLASS_INT8ARRAY, - DUK_HOBJECT_CLASS_UINT16ARRAY, - DUK_HOBJECT_CLASS_INT16ARRAY, - DUK_HOBJECT_CLASS_UINT32ARRAY, - DUK_HOBJECT_CLASS_INT32ARRAY, - DUK_HOBJECT_CLASS_FLOAT32ARRAY, - DUK_HOBJECT_CLASS_FLOAT64ARRAY -}; - -/* Map DUK_HBUFOBJ_ELEM_xxx to prototype object built-in index. - * Sync with duk_hbufobj.h. - */ -static const duk_uint8_t duk__buffer_proto_from_elemtype[9] = { - DUK_BIDX_UINT8ARRAY_PROTOTYPE, - DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, - DUK_BIDX_INT8ARRAY_PROTOTYPE, - DUK_BIDX_UINT16ARRAY_PROTOTYPE, - DUK_BIDX_INT16ARRAY_PROTOTYPE, - DUK_BIDX_UINT32ARRAY_PROTOTYPE, - DUK_BIDX_INT32ARRAY_PROTOTYPE, - DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, - DUK_BIDX_FLOAT64ARRAY_PROTOTYPE -}; - -/* Map DUK__FLD_xxx to byte size. */ -static const duk_uint8_t duk__buffer_nbytes_from_fldtype[6] = { - 1, /* DUK__FLD_8BIT */ - 2, /* DUK__FLD_16BIT */ - 4, /* DUK__FLD_32BIT */ - 4, /* DUK__FLD_FLOAT */ - 8, /* DUK__FLD_DOUBLE */ - 0 /* DUK__FLD_VARINT; not relevant here */ -}; - -/* Bitfield for each DUK_HBUFOBJ_ELEM_xxx indicating which element types - * are compatible with a blind byte copy for the TypedArray set() method (also - * used for TypedArray constructor). Array index is target buffer elem type, - * bitfield indicates compatible source types. The types must have same byte - * size and they must be coercion compatible. - */ -#if !defined(DUK_USE_PREFER_SIZE) -static duk_uint16_t duk__buffer_elemtype_copy_compatible[9] = { - /* xxx -> DUK_HBUFOBJ_ELEM_UINT8 */ - (1U << DUK_HBUFOBJ_ELEM_UINT8) | - (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) | - (1U << DUK_HBUFOBJ_ELEM_INT8), - - /* xxx -> DUK_HBUFOBJ_ELEM_UINT8CLAMPED - * Note: INT8 is -not- copy compatible, e.g. -1 would coerce to 0x00. - */ - (1U << DUK_HBUFOBJ_ELEM_UINT8) | - (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED), - - /* xxx -> DUK_HBUFOBJ_ELEM_INT8 */ - (1U << DUK_HBUFOBJ_ELEM_UINT8) | - (1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) | - (1U << DUK_HBUFOBJ_ELEM_INT8), - - /* xxx -> DUK_HBUFOBJ_ELEM_UINT16 */ - (1U << DUK_HBUFOBJ_ELEM_UINT16) | - (1U << DUK_HBUFOBJ_ELEM_INT16), - - /* xxx -> DUK_HBUFOBJ_ELEM_INT16 */ - (1U << DUK_HBUFOBJ_ELEM_UINT16) | - (1U << DUK_HBUFOBJ_ELEM_INT16), - - /* xxx -> DUK_HBUFOBJ_ELEM_UINT32 */ - (1U << DUK_HBUFOBJ_ELEM_UINT32) | - (1U << DUK_HBUFOBJ_ELEM_INT32), - - /* xxx -> DUK_HBUFOBJ_ELEM_INT32 */ - (1U << DUK_HBUFOBJ_ELEM_UINT32) | - (1U << DUK_HBUFOBJ_ELEM_INT32), - - /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT32 */ - (1U << DUK_HBUFOBJ_ELEM_FLOAT32), - - /* xxx -> DUK_HBUFOBJ_ELEM_FLOAT64 */ - (1U << DUK_HBUFOBJ_ELEM_FLOAT64) -}; -#endif /* !DUK_USE_PREFER_SIZE */ - -DUK_LOCAL duk_hbufobj *duk__hbufobj_promote_this(duk_hthread *thr) { - duk_tval *tv_dst; - duk_hbufobj *res; - - duk_push_this(thr); - DUK_ASSERT(duk_is_buffer(thr, -1)); - res = (duk_hbufobj *) duk_to_hobject(thr, -1); - DUK_ASSERT_HBUFOBJ_VALID(res); - DUK_DD(DUK_DDPRINT("promoted 'this' automatically to an ArrayBuffer: %!iT", duk_get_tval(thr, -1))); - - tv_dst = duk_get_borrowed_this_tval(thr); - DUK_TVAL_SET_OBJECT_UPDREF(thr, tv_dst, (duk_hobject *) res); - duk_pop(thr); - - return res; -} - -#define DUK__BUFOBJ_FLAG_THROW (1 << 0) -#define DUK__BUFOBJ_FLAG_PROMOTE (1 << 1) - -/* Shared helper. When DUK__BUFOBJ_FLAG_PROMOTE is given, the return value is - * always a duk_hbufobj *. Without the flag the return value can also be a - * plain buffer, and the caller must check for it using DUK_HEAPHDR_IS_BUFFER(). - */ -DUK_LOCAL duk_heaphdr *duk__getrequire_bufobj_this(duk_hthread *thr, duk_small_uint_t flags) { - duk_tval *tv; - duk_hbufobj *h_this; - - DUK_ASSERT(thr != NULL); - - tv = duk_get_borrowed_this_tval(thr); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_OBJECT(tv)) { - h_this = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h_this != NULL); - if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_this)) { - DUK_ASSERT_HBUFOBJ_VALID(h_this); - return (duk_heaphdr *) h_this; - } - } else if (DUK_TVAL_IS_BUFFER(tv)) { - if (flags & DUK__BUFOBJ_FLAG_PROMOTE) { - /* Promote a plain buffer to a Uint8Array. This is very - * inefficient but allows plain buffer to be used wherever an - * Uint8Array is used with very small cost; hot path functions - * like index read/write calls should provide direct buffer - * support to avoid promotion. - */ - /* XXX: make this conditional to a flag if call sites need it? */ - h_this = duk__hbufobj_promote_this(thr); - DUK_ASSERT(h_this != NULL); - DUK_ASSERT_HBUFOBJ_VALID(h_this); - return (duk_heaphdr *) h_this; - } else { - /* XXX: ugly, share return pointer for duk_hbuffer. */ - return (duk_heaphdr *) DUK_TVAL_GET_BUFFER(tv); - } - } - - if (flags & DUK__BUFOBJ_FLAG_THROW) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER); - } - return NULL; -} - -/* Check that 'this' is a duk_hbufobj and return a pointer to it. */ -DUK_LOCAL duk_hbufobj *duk__get_bufobj_this(duk_hthread *thr) { - return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_PROMOTE); -} - -/* Check that 'this' is a duk_hbufobj and return a pointer to it - * (NULL if not). - */ -DUK_LOCAL duk_hbufobj *duk__require_bufobj_this(duk_hthread *thr) { - return (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW | DUK__BUFOBJ_FLAG_PROMOTE); -} - -/* Check that value is a duk_hbufobj and return a pointer to it. */ -DUK_LOCAL duk_hbufobj *duk__require_bufobj_value(duk_hthread *thr, duk_idx_t idx) { - duk_tval *tv; - duk_hbufobj *h_obj; - - /* Don't accept relative indices now. */ - DUK_ASSERT(idx >= 0); - - tv = duk_require_tval(thr, idx); - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_OBJECT(tv)) { - h_obj = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h_obj != NULL); - if (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_obj)) { - DUK_ASSERT_HBUFOBJ_VALID(h_obj); - return h_obj; - } - } else if (DUK_TVAL_IS_BUFFER(tv)) { - h_obj = (duk_hbufobj *) duk_to_hobject(thr, idx); - DUK_ASSERT(h_obj != NULL); - DUK_ASSERT_HBUFOBJ_VALID(h_obj); - return h_obj; - } - - DUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER); - return NULL; /* not reachable */ -} - -DUK_LOCAL void duk__set_bufobj_buffer(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_hbuffer *h_val) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h_bufobj != NULL); - DUK_ASSERT(h_bufobj->buf == NULL); /* no need to decref */ - DUK_ASSERT(h_val != NULL); - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - DUK_UNREF(thr); - - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val); - DUK_ASSERT(h_bufobj->shift == 0); - DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8); - DUK_ASSERT(h_bufobj->is_typedarray == 0); - - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); -} - -/* Shared offset/length coercion helper. */ -DUK_LOCAL void duk__resolve_offset_opt_length(duk_hthread *thr, - duk_hbufobj *h_bufarg, - duk_idx_t idx_offset, - duk_idx_t idx_length, - duk_uint_t *out_offset, - duk_uint_t *out_length, - duk_bool_t throw_flag) { - duk_int_t offset_signed; - duk_int_t length_signed; - duk_uint_t offset; - duk_uint_t length; - - offset_signed = duk_to_int(thr, idx_offset); - if (offset_signed < 0) { - goto fail_range; - } - offset = (duk_uint_t) offset_signed; - if (offset > h_bufarg->length) { - goto fail_range; - } - DUK_ASSERT_DISABLE(offset >= 0); /* unsigned */ - DUK_ASSERT(offset <= h_bufarg->length); - - if (duk_is_undefined(thr, idx_length)) { - DUK_ASSERT(h_bufarg->length >= offset); - length = h_bufarg->length - offset; /* >= 0 */ - } else { - length_signed = duk_to_int(thr, idx_length); - if (length_signed < 0) { - goto fail_range; - } - length = (duk_uint_t) length_signed; - DUK_ASSERT(h_bufarg->length >= offset); - if (length > h_bufarg->length - offset) { - /* Unlike for negative arguments, some call sites - * want length to be clamped if it's positive. - */ - if (throw_flag) { - goto fail_range; - } else { - length = h_bufarg->length - offset; - } - } - } - DUK_ASSERT_DISABLE(length >= 0); /* unsigned */ - DUK_ASSERT(offset + length <= h_bufarg->length); - - *out_offset = offset; - *out_length = length; - return; - - fail_range: - DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS); -} - -/* Shared lenient buffer length clamping helper. No negative indices, no - * element/byte shifting. - */ -DUK_LOCAL void duk__clamp_startend_nonegidx_noshift(duk_hthread *thr, - duk_int_t buffer_length, - duk_idx_t idx_start, - duk_idx_t idx_end, - duk_int_t *out_start_offset, - duk_int_t *out_end_offset) { - duk_int_t start_offset; - duk_int_t end_offset; - - DUK_ASSERT(out_start_offset != NULL); - DUK_ASSERT(out_end_offset != NULL); - - /* undefined coerces to zero which is correct */ - start_offset = duk_to_int_clamped(thr, idx_start, 0, buffer_length); - if (duk_is_undefined(thr, idx_end)) { - end_offset = buffer_length; - } else { - end_offset = duk_to_int_clamped(thr, idx_end, start_offset, buffer_length); - } - - DUK_ASSERT(start_offset >= 0); - DUK_ASSERT(start_offset <= buffer_length); - DUK_ASSERT(end_offset >= 0); - DUK_ASSERT(end_offset <= buffer_length); - DUK_ASSERT(start_offset <= end_offset); - - *out_start_offset = start_offset; - *out_end_offset = end_offset; -} - -/* Shared lenient buffer length clamping helper. Indices are treated as - * element indices (though output values are byte offsets) which only - * really matters for TypedArray views as other buffer object have a zero - * shift. Negative indices are counted from end of input slice; crossed - * indices are clamped to zero length; and final indices are clamped - * against input slice. Used for e.g. ArrayBuffer slice(). - */ -DUK_LOCAL void duk__clamp_startend_negidx_shifted(duk_hthread *thr, - duk_int_t buffer_length, - duk_uint8_t buffer_shift, - duk_idx_t idx_start, - duk_idx_t idx_end, - duk_int_t *out_start_offset, - duk_int_t *out_end_offset) { - duk_int_t start_offset; - duk_int_t end_offset; - - DUK_ASSERT(out_start_offset != NULL); - DUK_ASSERT(out_end_offset != NULL); - - buffer_length >>= buffer_shift; /* as (full) elements */ - - /* Resolve start/end offset as element indices first; arguments - * at idx_start/idx_end are element offsets. Working with element - * indices first also avoids potential for wrapping. - */ - - start_offset = duk_to_int(thr, idx_start); - if (start_offset < 0) { - start_offset = buffer_length + start_offset; - } - if (duk_is_undefined(thr, idx_end)) { - end_offset = buffer_length; - } else { - end_offset = duk_to_int(thr, idx_end); - if (end_offset < 0) { - end_offset = buffer_length + end_offset; - } - } - /* Note: start_offset/end_offset can still be < 0 here. */ - - if (start_offset < 0) { - start_offset = 0; - } else if (start_offset > buffer_length) { - start_offset = buffer_length; - } - if (end_offset < start_offset) { - end_offset = start_offset; - } else if (end_offset > buffer_length) { - end_offset = buffer_length; - } - DUK_ASSERT(start_offset >= 0); - DUK_ASSERT(start_offset <= buffer_length); - DUK_ASSERT(end_offset >= 0); - DUK_ASSERT(end_offset <= buffer_length); - DUK_ASSERT(start_offset <= end_offset); - - /* Convert indices to byte offsets. */ - start_offset <<= buffer_shift; - end_offset <<= buffer_shift; - - *out_start_offset = start_offset; - *out_end_offset = end_offset; -} - -DUK_INTERNAL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx) { - if (duk_is_buffer(thr, idx)) { - duk_to_object(thr, idx); - } -} - -DUK_INTERNAL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf) { - /* Push Uint8Array which will share the same underlying buffer as - * the plain buffer argument. Also create an ArrayBuffer with the - * same backing for the result .buffer property. - */ - - duk_push_hbuffer(thr, h_buf); - duk_push_buffer_object(thr, -1, 0, (duk_size_t) DUK_HBUFFER_GET_SIZE(h_buf), DUK_BUFOBJ_UINT8ARRAY); - duk_remove_m2(thr); - -#if 0 - /* More verbose equivalent; maybe useful if e.g. .buffer is omitted. */ - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY), - DUK_BIDX_UINT8ARRAY_PROTOTYPE); - DUK_ASSERT(h_bufobj != NULL); - duk__set_bufobj_buffer(thr, h_bufobj, h_buf); - h_bufobj->is_typedarray = 1; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - h_arrbuf = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), - DUK_BIDX_ARRAYBUFFER_PROTOTYPE); - DUK_ASSERT(h_arrbuf != NULL); - duk__set_bufobj_buffer(thr, h_arrbuf, h_buf); - DUK_ASSERT(h_arrbuf->is_typedarray == 0); - DUK_ASSERT_HBUFOBJ_VALID(h_arrbuf); - - DUK_ASSERT(h_bufobj->buf_prop == NULL); - h_bufobj->buf_prop = (duk_hobject *) h_arrbuf; - DUK_ASSERT(h_arrbuf != NULL); - DUK_HBUFOBJ_INCREF(thr, h_arrbuf); - duk_pop(thr); -#endif -} - -/* Indexed read helper for buffer objects, also called from outside this file. */ -DUK_INTERNAL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { - duk_double_union du; - - DUK_MEMCPY((void *) du.uc, (const void *) p, (size_t) elem_size); - - switch (h_bufobj->elem_type) { - case DUK_HBUFOBJ_ELEM_UINT8: - case DUK_HBUFOBJ_ELEM_UINT8CLAMPED: - duk_push_uint(thr, (duk_uint_t) du.uc[0]); - break; - case DUK_HBUFOBJ_ELEM_INT8: - duk_push_int(thr, (duk_int_t) (duk_int8_t) du.uc[0]); - break; - case DUK_HBUFOBJ_ELEM_UINT16: - duk_push_uint(thr, (duk_uint_t) du.us[0]); - break; - case DUK_HBUFOBJ_ELEM_INT16: - duk_push_int(thr, (duk_int_t) (duk_int16_t) du.us[0]); - break; - case DUK_HBUFOBJ_ELEM_UINT32: - duk_push_uint(thr, (duk_uint_t) du.ui[0]); - break; - case DUK_HBUFOBJ_ELEM_INT32: - duk_push_int(thr, (duk_int_t) (duk_int32_t) du.ui[0]); - break; - case DUK_HBUFOBJ_ELEM_FLOAT32: - duk_push_number(thr, (duk_double_t) du.f[0]); - break; - case DUK_HBUFOBJ_ELEM_FLOAT64: - duk_push_number(thr, (duk_double_t) du.d); - break; - default: - DUK_UNREACHABLE(); - } -} - -/* Indexed write helper for buffer objects, also called from outside this file. */ -DUK_INTERNAL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { - duk_double_union du; - - /* NOTE! Caller must ensure that any side effects from the - * coercions below are safe. If that cannot be guaranteed - * (which is normally the case), caller must coerce the - * argument using duk_to_number() before any pointer - * validations; the result of duk_to_number() always coerces - * without side effects here. - */ - - switch (h_bufobj->elem_type) { - case DUK_HBUFOBJ_ELEM_UINT8: - du.uc[0] = (duk_uint8_t) duk_to_uint32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_UINT8CLAMPED: - du.uc[0] = (duk_uint8_t) duk_to_uint8clamped(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_INT8: - du.uc[0] = (duk_uint8_t) duk_to_int32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_UINT16: - du.us[0] = (duk_uint16_t) duk_to_uint32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_INT16: - du.us[0] = (duk_uint16_t) duk_to_int32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_UINT32: - du.ui[0] = (duk_uint32_t) duk_to_uint32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_INT32: - du.ui[0] = (duk_uint32_t) duk_to_int32(thr, -1); - break; - case DUK_HBUFOBJ_ELEM_FLOAT32: - du.f[0] = (duk_float_t) duk_to_number_m1(thr); - break; - case DUK_HBUFOBJ_ELEM_FLOAT64: - du.d = (duk_double_t) duk_to_number_m1(thr); - break; - default: - DUK_UNREACHABLE(); - } - - DUK_MEMCPY((void *) p, (const void *) du.uc, (size_t) elem_size); -} - -/* Helper to create a fixed buffer from argument value at index 0. - * Node.js and allocPlain() compatible. - */ -DUK_LOCAL duk_hbuffer *duk__hbufobj_fixed_from_argvalue(duk_hthread *thr) { - duk_int_t len; - duk_int_t i; - duk_size_t buf_size; - duk_uint8_t *buf; - - switch (duk_get_type(thr, 0)) { - case DUK_TYPE_NUMBER: { - len = duk_to_int_clamped(thr, 0, 0, DUK_INT_MAX); - (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len); - break; - } - case DUK_TYPE_BUFFER: { /* Treat like Uint8Array. */ - goto slow_copy; - } - case DUK_TYPE_OBJECT: { - duk_hobject *h; - duk_hbufobj *h_bufobj; - - /* For Node.js Buffers "Passing an ArrayBuffer returns a Buffer - * that shares allocated memory with the given ArrayBuffer." - * https://nodejs.org/api/buffer.html#buffer_buffer_from_buffer_alloc_and_buffer_allocunsafe - */ - - h = duk_known_hobject(thr, 0); - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAYBUFFER) { - DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(h)); - h_bufobj = (duk_hbufobj *) h; - if (DUK_UNLIKELY(h_bufobj->buf == NULL)) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - if (DUK_UNLIKELY(h_bufobj->offset != 0 || h_bufobj->length != DUK_HBUFFER_GET_SIZE(h_bufobj->buf))) { - /* No support for ArrayBuffers with slice - * offset/length. - */ - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - duk_push_hbuffer(thr, h_bufobj->buf); - return h_bufobj->buf; - } - goto slow_copy; - } - case DUK_TYPE_STRING: { - /* ignore encoding for now */ - duk_require_hstring_notsymbol(thr, 0); - duk_dup_0(thr); - (void) duk_to_buffer(thr, -1, &buf_size); - break; - } - default: - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - - done: - DUK_ASSERT(duk_is_buffer(thr, -1)); - return duk_known_hbuffer(thr, -1); - - slow_copy: - /* XXX: fast path for typed arrays and other buffer objects? */ - - (void) duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH); - len = duk_to_int_clamped(thr, -1, 0, DUK_INT_MAX); - duk_pop(thr); - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len); /* no zeroing, all indices get initialized */ - for (i = 0; i < len; i++) { - /* XXX: fast path for array or buffer arguments? */ - duk_get_prop_index(thr, 0, (duk_uarridx_t) i); - buf[i] = (duk_uint8_t) (duk_to_uint32(thr, -1) & 0xffU); - duk_pop(thr); - } - goto done; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer constructor - * - * Node.js Buffers are just Uint8Arrays with internal prototype set to - * Buffer.prototype so they're handled otherwise the same as Uint8Array. - * However, the constructor arguments are very different so a separate - * constructor entry point is used. - */ -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_hthread *thr) { - duk_hbuffer *h_buf; - - h_buf = duk__hbufobj_fixed_from_argvalue(thr); - DUK_ASSERT(h_buf != NULL); - - duk_push_buffer_object(thr, - -1, - 0, - DUK_HBUFFER_FIXED_GET_SIZE((duk_hbuffer_fixed *) h_buf), - DUK_BUFOBJ_UINT8ARRAY); - duk_push_hobject_bidx(thr, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); - duk_set_prototype(thr, -2); - - /* XXX: a more direct implementation */ - - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * ArrayBuffer, DataView, and TypedArray constructors - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_hthread *thr) { - duk_hbufobj *h_bufobj; - duk_hbuffer *h_val; - duk_int_t len; - - DUK_ASSERT_CTX_VALID(thr); - - duk_require_constructor_call(thr); - - len = duk_to_int(thr, 0); - if (len < 0) { - goto fail_length; - } - (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len); - h_val = (duk_hbuffer *) duk_known_hbuffer(thr, -1); - - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), - DUK_BIDX_ARRAYBUFFER_PROTOTYPE); - DUK_ASSERT(h_bufobj != NULL); - - duk__set_bufobj_buffer(thr, h_bufobj, h_val); - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - return 1; - - fail_length: - DUK_DCERROR_RANGE_INVALID_LENGTH(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - - -/* Format of magic, bits: - * 0...1: elem size shift (0-3) - * 2...5: elem type (DUK_HBUFOBJ_ELEM_xxx) - * - * XXX: add prototype bidx explicitly to magic instead of using a mapping? - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) { - duk_tval *tv; - duk_hobject *h_obj; - duk_hbufobj *h_bufobj = NULL; - duk_hbufobj *h_bufarg = NULL; - duk_hbuffer *h_val; - duk_small_uint_t magic; - duk_small_uint_t shift; - duk_small_uint_t elem_type; - duk_small_uint_t elem_size; - duk_small_uint_t class_num; - duk_small_uint_t proto_bidx; - duk_uint_t align_mask; - duk_uint_t elem_length; - duk_int_t elem_length_signed; - duk_uint_t byte_length; - duk_small_uint_t copy_mode; - - /* XXX: The same copy helpers could be shared with at least some - * buffer functions. - */ - - duk_require_constructor_call(thr); - - /* We could fit built-in index into magic but that'd make the magic - * number dependent on built-in numbering (genbuiltins.py doesn't - * handle that yet). So map both class and prototype from the - * element type. - */ - magic = (duk_small_uint_t) duk_get_current_magic(thr); - shift = magic & 0x03U; /* bits 0...1: shift */ - elem_type = (magic >> 2) & 0x0fU; /* bits 2...5: type */ - elem_size = 1U << shift; - align_mask = elem_size - 1; - DUK_ASSERT(elem_type < sizeof(duk__buffer_proto_from_elemtype) / sizeof(duk_uint8_t)); - proto_bidx = duk__buffer_proto_from_elemtype[elem_type]; - DUK_ASSERT(proto_bidx < DUK_NUM_BUILTINS); - DUK_ASSERT(elem_type < sizeof(duk__buffer_class_from_elemtype) / sizeof(duk_uint8_t)); - class_num = duk__buffer_class_from_elemtype[elem_type]; - - DUK_DD(DUK_DDPRINT("typedarray constructor, magic=%d, shift=%d, elem_type=%d, " - "elem_size=%d, proto_bidx=%d, class_num=%d", - (int) magic, (int) shift, (int) elem_type, (int) elem_size, - (int) proto_bidx, (int) class_num)); - - /* Argument variants. When the argument is an ArrayBuffer a view to - * the same buffer is created; otherwise a new ArrayBuffer is always - * created. - */ - - /* XXX: initial iteration to treat a plain buffer like an ArrayBuffer: - * coerce to an ArrayBuffer object and use that as .buffer. The underlying - * buffer will be the same but result .buffer !== inputPlainBuffer. - */ - duk_hbufobj_promote_plain(thr, 0); - - tv = duk_get_tval(thr, 0); - DUK_ASSERT(tv != NULL); /* arg count */ - if (DUK_TVAL_IS_OBJECT(tv)) { - h_obj = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h_obj != NULL); - - if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_ARRAYBUFFER) { - /* ArrayBuffer: unlike any other argument variant, create - * a view into the existing buffer. - */ - - duk_int_t byte_offset_signed; - duk_uint_t byte_offset; - - h_bufarg = (duk_hbufobj *) h_obj; - - byte_offset_signed = duk_to_int(thr, 1); - if (byte_offset_signed < 0) { - goto fail_arguments; - } - byte_offset = (duk_uint_t) byte_offset_signed; - if (byte_offset > h_bufarg->length || - (byte_offset & align_mask) != 0) { - /* Must be >= 0 and multiple of element size. */ - goto fail_arguments; - } - if (duk_is_undefined(thr, 2)) { - DUK_ASSERT(h_bufarg->length >= byte_offset); - byte_length = h_bufarg->length - byte_offset; - if ((byte_length & align_mask) != 0) { - /* Must be element size multiple from - * start offset to end of buffer. - */ - goto fail_arguments; - } - elem_length = (byte_length >> shift); - } else { - elem_length_signed = duk_to_int(thr, 2); - if (elem_length_signed < 0) { - goto fail_arguments; - } - elem_length = (duk_uint_t) elem_length_signed; - byte_length = elem_length << shift; - if ((byte_length >> shift) != elem_length) { - /* Byte length would overflow. */ - /* XXX: easier check with less code? */ - goto fail_arguments; - } - DUK_ASSERT(h_bufarg->length >= byte_offset); - if (byte_length > h_bufarg->length - byte_offset) { - /* Not enough data. */ - goto fail_arguments; - } - } - DUK_UNREF(elem_length); - DUK_ASSERT_DISABLE(byte_offset >= 0); - DUK_ASSERT(byte_offset <= h_bufarg->length); - DUK_ASSERT_DISABLE(byte_length >= 0); - DUK_ASSERT(byte_offset + byte_length <= h_bufarg->length); - DUK_ASSERT((elem_length << shift) == byte_length); - - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(class_num), - (duk_small_int_t) proto_bidx); - h_val = h_bufarg->buf; - if (h_val == NULL) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->offset = h_bufarg->offset + byte_offset; - h_bufobj->length = byte_length; - h_bufobj->shift = (duk_uint8_t) shift; - h_bufobj->elem_type = (duk_uint8_t) elem_type; - h_bufobj->is_typedarray = 1; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - /* Set .buffer to the argument ArrayBuffer. */ - DUK_ASSERT(h_bufobj->buf_prop == NULL); - h_bufobj->buf_prop = (duk_hobject *) h_bufarg; - DUK_ASSERT(h_bufarg != NULL); - DUK_HBUFOBJ_INCREF(thr, h_bufarg); - return 1; - } else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { - /* TypedArray (or other non-ArrayBuffer duk_hbufobj). - * Conceptually same behavior as for an Array-like argument, - * with a few fast paths. - */ - - h_bufarg = (duk_hbufobj *) h_obj; - DUK_ASSERT_HBUFOBJ_VALID(h_bufarg); - elem_length_signed = (duk_int_t) (h_bufarg->length >> h_bufarg->shift); - if (h_bufarg->buf == NULL) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - /* Select copy mode. Must take into account element - * compatibility and validity of the underlying source - * buffer. - */ - - DUK_DDD(DUK_DDDPRINT("selecting copy mode for bufobj arg, " - "src byte_length=%ld, src shift=%d, " - "src/dst elem_length=%ld; " - "dst shift=%d -> dst byte_length=%ld", - (long) h_bufarg->length, (int) h_bufarg->shift, - (long) elem_length_signed, (int) shift, - (long) (elem_length_signed << shift))); - - copy_mode = 2; /* default is explicit index read/write copy */ -#if !defined(DUK_USE_PREFER_SIZE) - /* With a size optimized build copy_mode 2 is enough. - * Modes 0 and 1 are faster but conceptually the same. - */ - DUK_ASSERT(elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); - if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) { - if ((duk__buffer_elemtype_copy_compatible[elem_type] & (1 << h_bufarg->elem_type)) != 0) { - DUK_DDD(DUK_DDDPRINT("source/target are copy compatible, memcpy")); - DUK_ASSERT(shift == h_bufarg->shift); /* byte sizes will match */ - copy_mode = 0; - } else { - DUK_DDD(DUK_DDDPRINT("source/target not copy compatible but valid, fast copy")); - copy_mode = 1; - } - } -#endif /* !DUK_USE_PREFER_SIZE */ - } else { - /* Array or Array-like */ - elem_length_signed = (duk_int_t) duk_get_length(thr, 0); - copy_mode = 2; - } - } else { - /* Non-object argument is simply int coerced, matches - * V8 behavior (except for "null", which we coerce to - * 0 but V8 TypeErrors). - */ - elem_length_signed = duk_to_int(thr, 0); - copy_mode = 3; - } - if (elem_length_signed < 0) { - goto fail_arguments; - } - elem_length = (duk_uint_t) elem_length_signed; - byte_length = (duk_uint_t) (elem_length << shift); - if ((byte_length >> shift) != elem_length) { - /* Byte length would overflow. */ - /* XXX: easier check with less code? */ - goto fail_arguments; - } - - DUK_DDD(DUK_DDDPRINT("elem_length=%ld, byte_length=%ld", - (long) elem_length, (long) byte_length)); - - /* ArrayBuffer argument is handled specially above; the rest of the - * argument variants are handled by shared code below. - * - * ArrayBuffer in h_bufobj->buf_prop is intentionally left unset. - * It will be automatically created by the .buffer accessor on - * first access. - */ - - /* Push the resulting view object on top of a plain fixed buffer. */ - (void) duk_push_fixed_buffer(thr, byte_length); - h_val = duk_known_hbuffer(thr, -1); - DUK_ASSERT(h_val != NULL); - - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(class_num), - (duk_small_int_t) proto_bidx); - - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - DUK_ASSERT(h_bufobj->offset == 0); - h_bufobj->length = byte_length; - h_bufobj->shift = (duk_uint8_t) shift; - h_bufobj->elem_type = (duk_uint8_t) elem_type; - h_bufobj->is_typedarray = 1; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - /* Copy values, the copy method depends on the arguments. - * - * Copy mode decision may depend on the validity of the underlying - * buffer of the source argument; there must be no harmful side effects - * from there to here for copy_mode to still be valid. - */ - DUK_DDD(DUK_DDDPRINT("copy mode: %d", (int) copy_mode)); - switch (copy_mode) { - /* Copy modes 0 and 1 can be omitted in size optimized build, - * copy mode 2 handles them (but more slowly). - */ -#if !defined(DUK_USE_PREFER_SIZE) - case 0: { - /* Use byte copy. */ - - duk_uint8_t *p_src; - duk_uint8_t *p_dst; - - DUK_ASSERT(h_bufobj != NULL); - DUK_ASSERT(h_bufobj->buf != NULL); - DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj)); - DUK_ASSERT(h_bufarg != NULL); - DUK_ASSERT(h_bufarg->buf != NULL); - DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg)); - - p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj); - p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); - - DUK_DDD(DUK_DDDPRINT("using memcpy: p_src=%p, p_dst=%p, byte_length=%ld", - (void *) p_src, (void *) p_dst, (long) byte_length)); - - DUK_MEMCPY((void *) p_dst, (const void *) p_src, (size_t) byte_length); - break; - } - case 1: { - /* Copy values through direct validated reads and writes. */ - - duk_small_uint_t src_elem_size; - duk_small_uint_t dst_elem_size; - duk_uint8_t *p_src; - duk_uint8_t *p_src_end; - duk_uint8_t *p_dst; - - DUK_ASSERT(h_bufobj != NULL); - DUK_ASSERT(h_bufobj->buf != NULL); - DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj)); - DUK_ASSERT(h_bufarg != NULL); - DUK_ASSERT(h_bufarg->buf != NULL); - DUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg)); - - src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift); - dst_elem_size = elem_size; - - p_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); - p_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj); - p_src_end = p_src + h_bufarg->length; - - DUK_DDD(DUK_DDDPRINT("using fast copy: p_src=%p, p_src_end=%p, p_dst=%p, " - "src_elem_size=%d, dst_elem_size=%d", - (void *) p_src, (void *) p_src_end, (void *) p_dst, - (int) src_elem_size, (int) dst_elem_size)); - - while (p_src != p_src_end) { - DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " - "p_src=%p, p_src_end=%p, p_dst=%p", - (void *) p_src, (void *) p_src_end, (void *) p_dst)); - /* A validated read() is always a number, so it's write coercion - * is always side effect free an won't invalidate pointers etc. - */ - duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size); - duk_hbufobj_validated_write(thr, h_bufobj, p_dst, dst_elem_size); - duk_pop(thr); - p_src += src_elem_size; - p_dst += dst_elem_size; - } - break; - } -#endif /* !DUK_USE_PREFER_SIZE */ - case 2: { - /* Copy values by index reads and writes. Let virtual - * property handling take care of coercion. - */ - duk_uint_t i; - - DUK_DDD(DUK_DDDPRINT("using slow copy")); - - for (i = 0; i < elem_length; i++) { - duk_get_prop_index(thr, 0, (duk_uarridx_t) i); - duk_put_prop_index(thr, -2, (duk_uarridx_t) i); - } - break; - } - default: - case 3: { - /* No copy, leave zero bytes in the buffer. There's no - * ambiguity with Float32/Float64 because zero bytes also - * represent 0.0. - */ - - DUK_DDD(DUK_DDDPRINT("using no copy")); - break; - } - } - - return 1; - - fail_arguments: - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ -/* When bufferobject support is disabled, new Uint8Array() could still be - * supported to create a plain fixed buffer. Disabled for now. - */ -#if 0 -DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) { - duk_int_t elem_length_signed; - duk_uint_t byte_length; - - /* XXX: The same copy helpers could be shared with at least some - * buffer functions. - */ - - duk_require_constructor_call(thr); - - elem_length_signed = duk_require_int(thr, 0); - if (elem_length_signed < 0) { - goto fail_arguments; - } - byte_length = (duk_uint_t) elem_length_signed; - - (void) duk_push_fixed_buffer_zero(thr, (duk_size_t) byte_length); - return 1; - - fail_arguments: - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* 0 */ -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_hthread *thr) { - duk_hbufobj *h_bufarg; - duk_hbufobj *h_bufobj; - duk_hbuffer *h_val; - duk_uint_t offset; - duk_uint_t length; - - duk_require_constructor_call(thr); - - h_bufarg = duk__require_bufobj_value(thr, 0); - DUK_ASSERT(h_bufarg != NULL); - if (DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufarg) != DUK_HOBJECT_CLASS_ARRAYBUFFER) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - duk__resolve_offset_opt_length(thr, h_bufarg, 1, 2, &offset, &length, 1 /*throw_flag*/); - DUK_ASSERT(offset <= h_bufarg->length); - DUK_ASSERT(offset + length <= h_bufarg->length); - - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATAVIEW), - DUK_BIDX_DATAVIEW_PROTOTYPE); - - h_val = h_bufarg->buf; - if (h_val == NULL) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->offset = h_bufarg->offset + offset; - h_bufobj->length = length; - DUK_ASSERT(h_bufobj->shift == 0); - DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8); - DUK_ASSERT(h_bufobj->is_typedarray == 0); - - DUK_ASSERT(h_bufobj->buf_prop == NULL); - h_bufobj->buf_prop = (duk_hobject *) h_bufarg; - DUK_ASSERT(h_bufarg != NULL); - DUK_HBUFOBJ_INCREF(thr, h_bufarg); - - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * ArrayBuffer.isView() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_hthread *thr) { - duk_hobject *h_obj; - duk_bool_t ret = 0; - - if (duk_is_buffer(thr, 0)) { - ret = 1; - } else { - h_obj = duk_get_hobject(thr, 0); - if (h_obj != NULL && DUK_HOBJECT_IS_BUFOBJ(h_obj)) { - /* DataView needs special casing: ArrayBuffer.isView() is - * true, but ->is_typedarray is 0. - */ - ret = ((duk_hbufobj *) h_obj)->is_typedarray || - (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_DATAVIEW); - } - } - duk_push_boolean(thr, ret); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Uint8Array.allocPlain() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_uint8array_allocplain(duk_hthread *thr) { - duk__hbufobj_fixed_from_argvalue(thr); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Uint8Array.plainOf() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_uint8array_plainof(duk_hthread *thr) { - duk_hbufobj *h_bufobj; - -#if !defined(DUK_USE_PREFER_SIZE) - /* Avoid churn if argument is already a plain buffer. */ - if (duk_is_buffer(thr, 0)) { - return 1; - } -#endif - - /* Promotes plain buffers to ArrayBuffers, so for a plain buffer - * argument we'll create a pointless temporary (but still work - * correctly). - */ - h_bufobj = duk__require_bufobj_value(thr, 0); - if (h_bufobj->buf == NULL) { - duk_push_undefined(thr); - } else { - duk_push_hbuffer(thr, h_bufobj->buf); - } - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer: toString([encoding], [start], [end]) - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_hthread *thr) { - duk_hbufobj *h_this; - duk_int_t start_offset, end_offset; - duk_uint8_t *buf_slice; - duk_size_t slice_length; - - h_this = duk__get_bufobj_this(thr); - if (h_this == NULL) { - /* XXX: happens e.g. when evaluating: String(Buffer.prototype). */ - duk_push_string(thr, "[object Object]"); - return 1; - } - DUK_ASSERT_HBUFOBJ_VALID(h_this); - - /* Ignore encoding for now. */ - - duk__clamp_startend_nonegidx_noshift(thr, - (duk_int_t) h_this->length, - 1 /*idx_start*/, - 2 /*idx_end*/, - &start_offset, - &end_offset); - - slice_length = (duk_size_t) (end_offset - start_offset); - buf_slice = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, slice_length); /* all bytes initialized below */ - DUK_ASSERT(buf_slice != NULL); - - /* Neutered or uncovered, TypeError. */ - if (h_this->buf == NULL || - !DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - /* XXX: ideally we wouldn't make a copy but a view into the buffer for the - * decoding process. Or the decoding helper could be changed to accept - * the slice info (a buffer pointer is NOT a good approach because guaranteeing - * its stability is difficult). - */ - - DUK_ASSERT(DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)); - DUK_MEMCPY((void *) buf_slice, - (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset), - (size_t) slice_length); - - /* Use the equivalent of: new TextEncoder().encode(this) to convert the - * string. Result will be valid UTF-8; non-CESU-8 inputs are currently - * interpreted loosely. Value stack convention is a bit odd for now. - */ - duk_replace(thr, 0); - duk_set_top(thr, 1); - return duk_textdecoder_decode_utf8_nodejs(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype: toJSON() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_hthread *thr) { - duk_hbufobj *h_this; - duk_uint8_t *buf; - duk_uint_t i, n; - duk_tval *tv; - - h_this = duk__require_bufobj_this(thr); - DUK_ASSERT(h_this != NULL); - - if (h_this->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_this)) { - /* Serialize uncovered backing buffer as a null; doesn't - * really matter as long we're memory safe. - */ - duk_push_null(thr); - return 1; - } - - duk_push_object(thr); - duk_push_hstring_stridx(thr, DUK_STRIDX_UC_BUFFER); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_TYPE); - - /* XXX: uninitialized would be OK */ - DUK_ASSERT_DISABLE((duk_size_t) h_this->length <= (duk_size_t) DUK_UINT32_MAX); - tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) h_this->length); /* XXX: needs revision with >4G buffers */ - - DUK_ASSERT(h_this->buf != NULL); - buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); - for (i = 0, n = h_this->length; i < n; i++) { - DUK_TVAL_SET_U32(tv + i, (duk_uint32_t) buf[i]); /* no need for decref or incref */ - } - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_DATA); - - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype.equals() - * Node.js Buffer.prototype.compare() - * Node.js Buffer.compare() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_hthread *thr) { - duk_small_uint_t magic; - duk_hbufobj *h_bufarg1; - duk_hbufobj *h_bufarg2; - duk_small_int_t comp_res; - - /* XXX: keep support for plain buffers and non-Node.js buffers? */ - - magic = (duk_small_uint_t) duk_get_current_magic(thr); - if (magic & 0x02U) { - /* Static call style. */ - h_bufarg1 = duk__require_bufobj_value(thr, 0); - h_bufarg2 = duk__require_bufobj_value(thr, 1); - } else { - h_bufarg1 = duk__require_bufobj_this(thr); - h_bufarg2 = duk__require_bufobj_value(thr, 0); - } - DUK_ASSERT(h_bufarg1 != NULL); - DUK_ASSERT(h_bufarg2 != NULL); - - /* We want to compare the slice/view areas of the arguments. - * If either slice/view is invalid (underlying buffer is shorter) - * ensure equals() is false, but otherwise the only thing that - * matters is to be memory safe. - */ - - if (DUK_HBUFOBJ_VALID_SLICE(h_bufarg1) && - DUK_HBUFOBJ_VALID_SLICE(h_bufarg2)) { - comp_res = duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg1->buf) + h_bufarg1->offset, - (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg2->buf) + h_bufarg2->offset, - (duk_size_t) h_bufarg1->length, - (duk_size_t) h_bufarg2->length); - } else { - comp_res = -1; /* either nonzero value is ok */ - } - - if (magic & 0x01U) { - /* compare: similar to string comparison but for buffer data. */ - duk_push_int(thr, comp_res); - } else { - /* equals */ - duk_push_boolean(thr, (comp_res == 0)); - } - - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype.fill() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_hthread *thr) { - duk_hbufobj *h_this; - const duk_uint8_t *fill_str_ptr; - duk_size_t fill_str_len; - duk_uint8_t fill_value; - duk_int_t fill_offset; - duk_int_t fill_end; - duk_size_t fill_length; - duk_uint8_t *p; - - h_this = duk__require_bufobj_this(thr); - DUK_ASSERT(h_this != NULL); - if (h_this->buf == NULL) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - /* [ value offset end ] */ - - if (duk_is_string_notsymbol(thr, 0)) { - fill_str_ptr = (const duk_uint8_t *) duk_get_lstring(thr, 0, &fill_str_len); - DUK_ASSERT(fill_str_ptr != NULL); - } else { - /* Symbols get ToNumber() coerced and cause TypeError. */ - fill_value = (duk_uint8_t) duk_to_uint32(thr, 0); - fill_str_ptr = (const duk_uint8_t *) &fill_value; - fill_str_len = 1; - } - - /* Fill offset handling is more lenient than in Node.js. */ - - duk__clamp_startend_nonegidx_noshift(thr, - (duk_int_t) h_this->length, - 1 /*idx_start*/, - 2 /*idx_end*/, - &fill_offset, - &fill_end); - - DUK_DDD(DUK_DDDPRINT("fill: fill_value=%02x, fill_offset=%ld, fill_end=%ld, view length=%ld", - (unsigned int) fill_value, (long) fill_offset, (long) fill_end, (long) h_this->length)); - - DUK_ASSERT(fill_end - fill_offset >= 0); - DUK_ASSERT(h_this->buf != NULL); - - p = (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + fill_offset); - fill_length = (duk_size_t) (fill_end - fill_offset); - if (fill_str_len == 1) { - /* Handle single character fills as memset() even when - * the fill data comes from a one-char argument. - */ - DUK_MEMSET((void *) p, (int) fill_str_ptr[0], (size_t) fill_length); - } else if (fill_str_len > 1) { - duk_size_t i, n, t; - - for (i = 0, n = (duk_size_t) (fill_end - fill_offset), t = 0; i < n; i++) { - p[i] = fill_str_ptr[t++]; - if (t >= fill_str_len) { - t = 0; - } - } - } else { - DUK_DDD(DUK_DDDPRINT("zero size fill pattern, ignore silently")); - } - - /* Return the Buffer to allow chaining: b.fill(0x11).fill(0x22, 3, 5).toString() */ - duk_push_this(thr); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype.write(string, [offset], [length], [encoding]) - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_hthread *thr) { - duk_hbufobj *h_this; - duk_uint_t offset; - duk_uint_t length; - const duk_uint8_t *str_data; - duk_size_t str_len; - - /* XXX: very inefficient support for plain buffers */ - h_this = duk__require_bufobj_this(thr); - DUK_ASSERT(h_this != NULL); - - /* Argument must be a string, e.g. a buffer is not allowed. */ - str_data = (const duk_uint8_t *) duk_require_lstring_notsymbol(thr, 0, &str_len); - - duk__resolve_offset_opt_length(thr, h_this, 1, 2, &offset, &length, 0 /*throw_flag*/); - DUK_ASSERT(offset <= h_this->length); - DUK_ASSERT(offset + length <= h_this->length); - - /* XXX: encoding is ignored now. */ - - if (length > str_len) { - length = (duk_uint_t) str_len; - } - - if (DUK_HBUFOBJ_VALID_SLICE(h_this)) { - /* Cannot overlap. */ - DUK_MEMCPY((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset), - (const void *) str_data, - (size_t) length); - } else { - DUK_DDD(DUK_DDDPRINT("write() target buffer is not covered, silent ignore")); - } - - duk_push_uint(thr, length); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype.copy() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_hthread *thr) { - duk_hbufobj *h_this; - duk_hbufobj *h_bufarg; - duk_int_t source_length; - duk_int_t target_length; - duk_int_t target_start, source_start, source_end; - duk_uint_t target_ustart, source_ustart, source_uend; - duk_uint_t copy_size = 0; - - /* [ targetBuffer targetStart sourceStart sourceEnd ] */ - - h_this = duk__require_bufobj_this(thr); - h_bufarg = duk__require_bufobj_value(thr, 0); - DUK_ASSERT(h_this != NULL); - DUK_ASSERT(h_bufarg != NULL); - source_length = (duk_int_t) h_this->length; - target_length = (duk_int_t) h_bufarg->length; - - target_start = duk_to_int(thr, 1); - source_start = duk_to_int(thr, 2); - if (duk_is_undefined(thr, 3)) { - source_end = source_length; - } else { - source_end = duk_to_int(thr, 3); - } - - DUK_DDD(DUK_DDDPRINT("checking copy args: target_start=%ld, target_length=%ld, " - "source_start=%ld, source_end=%ld, source_length=%ld", - (long) target_start, (long) h_bufarg->length, - (long) source_start, (long) source_end, (long) source_length)); - - /* This behavior mostly mimics Node.js now. */ - - if (source_start < 0 || source_end < 0 || target_start < 0) { - /* Negative offsets cause a RangeError. */ - goto fail_bounds; - } - source_ustart = (duk_uint_t) source_start; - source_uend = (duk_uint_t) source_end; - target_ustart = (duk_uint_t) target_start; - if (source_ustart >= source_uend || /* crossed offsets or zero size */ - source_ustart >= (duk_uint_t) source_length || /* source out-of-bounds (but positive) */ - target_ustart >= (duk_uint_t) target_length) { /* target out-of-bounds (but positive) */ - goto silent_ignore; - } - if (source_uend >= (duk_uint_t) source_length) { - /* Source end clamped silently to available length. */ - source_uend = (duk_uint_t) source_length; - } - copy_size = source_uend - source_ustart; - if (target_ustart + copy_size > (duk_uint_t) target_length) { - /* Clamp to target's end if too long. - * - * NOTE: there's no overflow possibility in the comparison; - * both target_ustart and copy_size are >= 0 and based on - * values in duk_int_t range. Adding them as duk_uint_t - * values is then guaranteed not to overflow. - */ - DUK_ASSERT(target_ustart + copy_size >= target_ustart); /* no overflow */ - DUK_ASSERT(target_ustart + copy_size >= copy_size); /* no overflow */ - copy_size = (duk_uint_t) target_length - target_ustart; - } - - DUK_DDD(DUK_DDDPRINT("making copy: target_ustart=%lu source_ustart=%lu copy_size=%lu", - (unsigned long) target_ustart, (unsigned long) source_ustart, - (unsigned long) copy_size)); - - DUK_ASSERT(copy_size >= 1); - DUK_ASSERT(source_ustart <= (duk_uint_t) source_length); - DUK_ASSERT(source_ustart + copy_size <= (duk_uint_t) source_length); - DUK_ASSERT(target_ustart <= (duk_uint_t) target_length); - DUK_ASSERT(target_ustart + copy_size <= (duk_uint_t) target_length); - - /* Ensure copy is covered by underlying buffers. */ - DUK_ASSERT(h_bufarg->buf != NULL); /* length check */ - DUK_ASSERT(h_this->buf != NULL); /* length check */ - if (DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufarg, target_ustart + copy_size) && - DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, source_ustart + copy_size)) { - /* Must use memmove() because copy area may overlap (source and target - * buffer may be the same, or from different slices. - */ - DUK_MEMMOVE((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg) + target_ustart), - (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + source_ustart), - (size_t) copy_size); - } else { - DUK_DDD(DUK_DDDPRINT("buffer copy not covered by underlying buffer(s), ignoring")); - } - - silent_ignore: - /* Return value is like write(), number of bytes written. - * The return value matters because of code like: - * "off += buf.copy(...)". - */ - duk_push_uint(thr, copy_size); - return 1; - - fail_bounds: - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * TypedArray.prototype.set() - * - * TypedArray set() is pretty interesting to implement because: - * - * - The source argument may be a plain array or a typedarray. If the - * source is a TypedArray, values are decoded and re-encoded into the - * target (not as a plain byte copy). This may happen even when the - * element byte size is the same, e.g. integer values may be re-encoded - * into floats. - * - * - Source and target may refer to the same underlying buffer, so that - * the set() operation may overlap. The specification requires that this - * must work as if a copy was made before the operation. Note that this - * is NOT a simple memmove() situation because the source and target - * byte sizes may be different -- e.g. a 4-byte source (Int8Array) may - * expand to a 16-byte target (Uint32Array) so that the target overlaps - * the source both from beginning and the end (unlike in typical memmove). - * - * - Even if 'buf' pointers of the source and target differ, there's no - * guarantee that their memory areas don't overlap. This may be the - * case with external buffers. - * - * Even so, it is nice to optimize for the common case: - * - * - Source and target separate buffers or non-overlapping. - * - * - Source and target have a compatible type so that a plain byte copy - * is possible. Note that while e.g. uint8 and int8 are compatible - * (coercion one way or another doesn't change the byte representation), - * e.g. int8 and uint8clamped are NOT compatible when writing int8 - * values into uint8clamped typedarray (-1 would clamp to 0 for instance). - * - * See test-bi-typedarray-proto-set.js. - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_hthread *thr) { - duk_hbufobj *h_this; - duk_hobject *h_obj; - duk_uarridx_t i, n; - duk_int_t offset_signed; - duk_uint_t offset_elems; - duk_uint_t offset_bytes; - - h_this = duk__require_bufobj_this(thr); - DUK_ASSERT(h_this != NULL); - DUK_ASSERT_HBUFOBJ_VALID(h_this); - - if (h_this->buf == NULL) { - DUK_DDD(DUK_DDDPRINT("source neutered, skip copy")); - return 0; - } - - duk_hbufobj_promote_plain(thr, 0); - h_obj = duk_require_hobject(thr, 0); - - /* XXX: V8 throws a TypeError for negative values. Would it - * be more useful to interpret negative offsets here from the - * end of the buffer too? - */ - offset_signed = duk_to_int(thr, 1); - if (offset_signed < 0) { - /* For some reason this is a TypeError (at least in V8). */ - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - offset_elems = (duk_uint_t) offset_signed; - offset_bytes = offset_elems << h_this->shift; - if ((offset_bytes >> h_this->shift) != offset_elems) { - /* Byte length would overflow. */ - /* XXX: easier check with less code? */ - goto fail_args; - } - if (offset_bytes > h_this->length) { - /* Equality may be OK but >length not. Checking - * this explicitly avoids some overflow cases - * below. - */ - goto fail_args; - } - DUK_ASSERT(offset_bytes <= h_this->length); - - /* Fast path: source is a TypedArray (or any bufobj). */ - - if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { - duk_hbufobj *h_bufarg; -#if !defined(DUK_USE_PREFER_SIZE) - duk_uint16_t comp_mask; -#endif - duk_small_int_t no_overlap = 0; - duk_uint_t src_length; - duk_uint_t dst_length; - duk_uint_t dst_length_elems; - duk_uint8_t *p_src_base; - duk_uint8_t *p_src_end; - duk_uint8_t *p_src; - duk_uint8_t *p_dst_base; - duk_uint8_t *p_dst; - duk_small_uint_t src_elem_size; - duk_small_uint_t dst_elem_size; - - h_bufarg = (duk_hbufobj *) h_obj; - DUK_ASSERT_HBUFOBJ_VALID(h_bufarg); - - if (h_bufarg->buf == NULL) { - DUK_DDD(DUK_DDDPRINT("target neutered, skip copy")); - return 0; - } - - /* Nominal size check. */ - src_length = h_bufarg->length; /* bytes in source */ - dst_length_elems = (src_length >> h_bufarg->shift); /* elems in source and dest */ - dst_length = dst_length_elems << h_this->shift; /* bytes in dest */ - if ((dst_length >> h_this->shift) != dst_length_elems) { - /* Byte length would overflow. */ - /* XXX: easier check with less code? */ - goto fail_args; - } - DUK_DDD(DUK_DDDPRINT("nominal size check: src_length=%ld, dst_length=%ld", - (long) src_length, (long) dst_length)); - DUK_ASSERT(offset_bytes <= h_this->length); - if (dst_length > h_this->length - offset_bytes) { - /* Overflow not an issue because subtraction is used on the right - * side and guaranteed to be >= 0. - */ - DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); - goto fail_args; - } - if (!DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, offset_bytes + dst_length)) { - DUK_DDD(DUK_DDDPRINT("copy not covered by underlying target buffer, ignore")); - return 0; - } - - p_src_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg); - p_dst_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset_bytes; - - /* Check actual underlying buffers for validity and that they - * cover the copy. No side effects are allowed after the check - * so that the validity status doesn't change. - */ - if (!DUK_HBUFOBJ_VALID_SLICE(h_this) || - !DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) { - /* The condition could be more narrow and check for the - * copy area only, but there's no need for fine grained - * behavior when the underlying buffer is misconfigured. - */ - DUK_DDD(DUK_DDDPRINT("source and/or target not covered by underlying buffer, skip copy")); - return 0; - } - - /* We want to do a straight memory copy if possible: this is - * an important operation because .set() is the TypedArray - * way to copy chunks of memory. However, because set() - * conceptually works in terms of elements, not all views are - * compatible with direct byte copying. - * - * If we do manage a direct copy, the "overlap issue" handled - * below can just be solved using memmove() because the source - * and destination element sizes are necessarily equal. - */ - -#if !defined(DUK_USE_PREFER_SIZE) - DUK_ASSERT(h_this->elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); - comp_mask = duk__buffer_elemtype_copy_compatible[h_this->elem_type]; - if (comp_mask & (1 << h_bufarg->elem_type)) { - DUK_ASSERT(src_length == dst_length); - - DUK_DDD(DUK_DDDPRINT("fast path: able to use memmove() because views are compatible")); - DUK_MEMMOVE((void *) p_dst_base, (const void *) p_src_base, (size_t) dst_length); - return 0; - } - DUK_DDD(DUK_DDDPRINT("fast path: views are not compatible with a byte copy, copy by item")); -#endif /* !DUK_USE_PREFER_SIZE */ - - /* We want to avoid making a copy to process set() but that's - * not always possible: the source and the target may overlap - * and because element sizes are different, the overlap cannot - * always be handled with a memmove() or choosing the copy - * direction in a certain way. For example, if source type is - * uint8 and target type is uint32, the target area may exceed - * the source area from both ends! - * - * Note that because external buffers may point to the same - * memory areas, we must ultimately make this check using - * pointers. - * - * NOTE: careful with side effects: any side effect may cause - * a buffer resize (or external buffer pointer/length update)! - */ - - DUK_DDD(DUK_DDDPRINT("overlap check: p_src_base=%p, src_length=%ld, " - "p_dst_base=%p, dst_length=%ld", - (void *) p_src_base, (long) src_length, - (void *) p_dst_base, (long) dst_length)); - - if (p_src_base >= p_dst_base + dst_length || /* source starts after dest ends */ - p_src_base + src_length <= p_dst_base) { /* source ends before dest starts */ - no_overlap = 1; - } - - if (!no_overlap) { - /* There's overlap: the desired end result is that - * conceptually a copy is made to avoid "trampling" - * of source data by destination writes. We make - * an actual temporary copy to handle this case. - */ - duk_uint8_t *p_src_copy; - - DUK_DDD(DUK_DDDPRINT("there is overlap, make a copy of the source")); - p_src_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_length); - DUK_ASSERT(p_src_copy != NULL); - DUK_MEMCPY((void *) p_src_copy, (const void *) p_src_base, (size_t) src_length); - - p_src_base = p_src_copy; /* use p_src_base from now on */ - } - /* Value stack intentionally mixed size here. */ - - DUK_DDD(DUK_DDDPRINT("after overlap check: p_src_base=%p, src_length=%ld, " - "p_dst_base=%p, dst_length=%ld, valstack top=%ld", - (void *) p_src_base, (long) src_length, - (void *) p_dst_base, (long) dst_length, - (long) duk_get_top(thr))); - - /* Ready to make the copy. We must proceed element by element - * and must avoid any side effects that might cause the buffer - * validity check above to become invalid. - * - * Although we work through the value stack here, only plain - * numbers are handled which should be side effect safe. - */ - - src_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift); - dst_elem_size = (duk_small_uint_t) (1U << h_this->shift); - p_src = p_src_base; - p_dst = p_dst_base; - p_src_end = p_src_base + src_length; - - while (p_src != p_src_end) { - DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " - "p_src=%p, p_src_end=%p, p_dst=%p", - (void *) p_src, (void *) p_src_end, (void *) p_dst)); - /* A validated read() is always a number, so it's write coercion - * is always side effect free an won't invalidate pointers etc. - */ - duk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size); - duk_hbufobj_validated_write(thr, h_this, p_dst, dst_elem_size); - duk_pop(thr); - p_src += src_elem_size; - p_dst += dst_elem_size; - } - - return 0; - } else { - /* Slow path: quite slow, but we save space by using the property code - * to write coerce target values. We don't need to worry about overlap - * here because the source is not a TypedArray. - * - * We could use the bufobj write coercion helper but since the - * property read may have arbitrary side effects, full validity checks - * would be needed for every element anyway. - */ - - n = (duk_uarridx_t) duk_get_length(thr, 0); - DUK_ASSERT(offset_bytes <= h_this->length); - if ((n << h_this->shift) > h_this->length - offset_bytes) { - /* Overflow not an issue because subtraction is used on the right - * side and guaranteed to be >= 0. - */ - DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); - goto fail_args; - } - - /* There's no need to check for buffer validity status for the - * target here: the property access code will do that for each - * element. Moreover, if we did check the validity here, side - * effects from reading the source argument might invalidate - * the results anyway. - */ - - DUK_ASSERT_TOP(thr, 2); - duk_push_this(thr); - - for (i = 0; i < n; i++) { - duk_get_prop_index(thr, 0, i); - duk_put_prop_index(thr, 2, offset_elems + i); - } - } - - return 0; - - fail_args: - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.prototype.slice([start], [end]) - * ArrayBuffer.prototype.slice(begin, [end]) - * TypedArray.prototype.subarray(begin, [end]) - * - * The API calls are almost identical; negative indices are counted from end - * of buffer, and final indices are clamped (allowing crossed indices). Main - * differences: - * - * - Copy/view behavior; Node.js .slice() and TypedArray .subarray() create - * views, ArrayBuffer .slice() creates a copy - * - * - Resulting object has a different class and prototype depending on the - * call (or 'this' argument) - * - * - TypedArray .subarray() arguments are element indices, not byte offsets - * - * - Plain buffer argument creates a plain buffer slice - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_LOCAL void duk__arraybuffer_plain_slice(duk_hthread *thr, duk_hbuffer *h_val) { - duk_int_t start_offset, end_offset; - duk_uint_t slice_length; - duk_uint8_t *p_copy; - duk_size_t copy_length; - - duk__clamp_startend_negidx_shifted(thr, - (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val), - 0 /*buffer_shift*/, - 0 /*idx_start*/, - 1 /*idx_end*/, - &start_offset, - &end_offset); - DUK_ASSERT(end_offset <= (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val)); - DUK_ASSERT(start_offset >= 0); - DUK_ASSERT(end_offset >= start_offset); - slice_length = (duk_uint_t) (end_offset - start_offset); - - p_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) slice_length); - DUK_ASSERT(p_copy != NULL); - copy_length = slice_length; - - DUK_MEMCPY((void *) p_copy, - (const void *) ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_val) + start_offset), - copy_length); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -/* Shared helper for slice/subarray operation. - * Magic: 0x01=isView, 0x02=copy, 0x04=Node.js Buffer special handling. - */ -DUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_hthread *thr) { - duk_small_int_t magic; - duk_small_uint_t res_class_num; - duk_small_int_t res_proto_bidx; - duk_hbufobj *h_this; - duk_hbufobj *h_bufobj; - duk_hbuffer *h_val; - duk_int_t start_offset, end_offset; - duk_uint_t slice_length; - duk_tval *tv; - - /* [ start end ] */ - - magic = duk_get_current_magic(thr); - - tv = duk_get_borrowed_this_tval(thr); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_BUFFER(tv)) { - /* For plain buffers return a plain buffer slice. */ - h_val = DUK_TVAL_GET_BUFFER(tv); - DUK_ASSERT(h_val != NULL); - - if (magic & 0x02) { - /* Make copy: ArrayBuffer.prototype.slice() uses this. */ - duk__arraybuffer_plain_slice(thr, h_val); - return 1; - } else { - /* View into existing buffer: cannot be done if the - * result is a plain buffer because there's no slice - * info. So return an ArrayBuffer instance; coerce - * the 'this' binding into an object and behave as if - * the original call was for an Object-coerced plain - * buffer (handled automatically by duk__require_bufobj_this()). - */ - - DUK_DDD(DUK_DDDPRINT("slice() doesn't handle view into plain buffer, coerce 'this' to ArrayBuffer object")); - /* fall through */ - } - } - tv = NULL; /* No longer valid nor needed. */ - - h_this = duk__require_bufobj_this(thr); - - /* Slice offsets are element (not byte) offsets, which only matters - * for TypedArray views, Node.js Buffer and ArrayBuffer have shift - * zero so byte and element offsets are the same. Negative indices - * are counted from end of slice, crossed indices are allowed (and - * result in zero length result), and final values are clamped - * against the current slice. There's intentionally no check - * against the underlying buffer here. - */ - - duk__clamp_startend_negidx_shifted(thr, - (duk_int_t) h_this->length, - (duk_uint8_t) h_this->shift, - 0 /*idx_start*/, - 1 /*idx_end*/, - &start_offset, - &end_offset); - DUK_ASSERT(end_offset >= start_offset); - DUK_ASSERT(start_offset >= 0); - DUK_ASSERT(end_offset >= 0); - slice_length = (duk_uint_t) (end_offset - start_offset); - - /* The resulting buffer object gets the same class and prototype as - * the buffer in 'this', e.g. if the input is a Uint8Array the - * result is a Uint8Array; if the input is a Float32Array, the - * result is a Float32Array. The result internal prototype should - * be the default prototype for the class (e.g. initial value of - * Uint8Array.prototype), not copied from the argument (Duktape 1.x - * did that). - * - * Node.js Buffers have special handling: they're Uint8Arrays as far - * as the internal class is concerned, so the new Buffer should also - * be an Uint8Array but inherit from Buffer.prototype. - */ - res_class_num = DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_this); - DUK_ASSERT(res_class_num >= DUK_HOBJECT_CLASS_BUFOBJ_MIN); /* type check guarantees */ - DUK_ASSERT(res_class_num <= DUK_HOBJECT_CLASS_BUFOBJ_MAX); - res_proto_bidx = duk__buffer_proto_from_classnum[res_class_num - DUK_HOBJECT_CLASS_BUFOBJ_MIN]; - if (magic & 0x04) { - res_proto_bidx = DUK_BIDX_NODEJS_BUFFER_PROTOTYPE; - } - h_bufobj = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(res_class_num), - res_proto_bidx); - DUK_ASSERT(h_bufobj != NULL); - - DUK_ASSERT(h_bufobj->length == 0); - h_bufobj->shift = h_this->shift; /* inherit */ - h_bufobj->elem_type = h_this->elem_type; /* inherit */ - h_bufobj->is_typedarray = magic & 0x01; - DUK_ASSERT(h_bufobj->is_typedarray == 0 || h_bufobj->is_typedarray == 1); - - h_val = h_this->buf; - if (h_val == NULL) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - if (magic & 0x02) { - /* non-zero: make copy */ - duk_uint8_t *p_copy; - duk_size_t copy_length; - - p_copy = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, (duk_size_t) slice_length); /* must be zeroed, not all bytes always copied */ - DUK_ASSERT(p_copy != NULL); - - /* Copy slice, respecting underlying buffer limits; remainder - * is left as zero. - */ - copy_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, slice_length); - DUK_MEMCPY((void *) p_copy, - (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset), - copy_length); - - h_val = duk_known_hbuffer(thr, -1); - - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->length = slice_length; - DUK_ASSERT(h_bufobj->offset == 0); - - duk_pop(thr); /* reachable so pop OK */ - } else { - h_bufobj->buf = h_val; - DUK_HBUFFER_INCREF(thr, h_val); - h_bufobj->length = slice_length; - h_bufobj->offset = h_this->offset + (duk_uint_t) start_offset; - - /* Copy the .buffer property, needed for TypedArray.prototype.subarray(). - * - * XXX: limit copy only for TypedArray classes specifically? - */ - - DUK_ASSERT(h_bufobj->buf_prop == NULL); - h_bufobj->buf_prop = h_this->buf_prop; /* may be NULL */ - DUK_HOBJECT_INCREF_ALLOWNULL(thr, (duk_hobject *) h_bufobj->buf_prop); - } - /* unbalanced stack on purpose */ - - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.isEncoding() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_hthread *thr) { - const char *encoding; - - /* only accept lowercase 'utf8' now. */ - - encoding = duk_to_string(thr, 0); - DUK_ASSERT(duk_is_string(thr, 0)); /* guaranteed by duk_to_string() */ - duk_push_boolean(thr, DUK_STRCMP(encoding, "utf8") == 0); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.isBuffer() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_hthread *thr) { - duk_hobject *h; - duk_hobject *h_proto; - duk_bool_t ret = 0; - - DUK_ASSERT(duk_get_top(thr) >= 1); /* nargs */ - h = duk_get_hobject(thr, 0); - if (h != NULL) { - h_proto = thr->builtins[DUK_BIDX_NODEJS_BUFFER_PROTOTYPE]; - DUK_ASSERT(h_proto != NULL); - - h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); - if (h != NULL) { - ret = duk_hobject_prototype_chain_contains(thr, h, h_proto, 0 /*ignore_loop*/); - } - } - - duk_push_boolean(thr, ret); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.byteLength() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_hthread *thr) { - const char *str; - duk_size_t len; - - /* At the moment Buffer() will just use the string bytes as - * is (ignoring encoding), so we return the string length here - * unconditionally. - */ - - /* XXX: to be revised; Old Node.js behavior just coerces any buffer - * values to string: - * $ node - * > Buffer.byteLength(new Uint32Array(10)) - * 20 - * > Buffer.byteLength(new Uint32Array(100)) - * 20 - * (The 20 comes from '[object Uint32Array]'.length - */ - - str = duk_to_lstring(thr, 0, &len); - DUK_UNREF(str); - duk_push_size_t(thr, len); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Node.js Buffer.concat() - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_hthread *thr) { - duk_hobject *h_arg; - duk_uint_t total_length; - duk_hbufobj *h_bufobj; - duk_hbufobj *h_bufres; - duk_hbuffer *h_val; - duk_uint_t i, n; - duk_uint8_t *p; - duk_size_t space_left; - duk_size_t copy_size; - - /* Node.js accepts only actual Arrays. */ - h_arg = duk_require_hobject(thr, 0); - if (DUK_HOBJECT_GET_CLASS_NUMBER(h_arg) != DUK_HOBJECT_CLASS_ARRAY) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - /* Compute result length and validate argument buffers. */ - n = (duk_uint_t) duk_get_length(thr, 0); - total_length = 0; - for (i = 0; i < n; i++) { - /* Neutered checks not necessary here: neutered buffers have - * zero 'length' so we'll effectively skip them. - */ - DUK_ASSERT_TOP(thr, 2); /* [ array totalLength ] */ - duk_get_prop_index(thr, 0, (duk_uarridx_t) i); /* -> [ array totalLength buf ] */ - h_bufobj = duk__require_bufobj_value(thr, 2); - DUK_ASSERT(h_bufobj != NULL); - total_length += h_bufobj->length; - if (DUK_UNLIKELY(total_length < h_bufobj->length)) { - DUK_DCERROR_RANGE_INVALID_ARGS(thr); /* Wrapped. */ - } - duk_pop(thr); - } - /* In Node.js v0.12.1 a 1-element array is special and won't create a - * copy, this was fixed later so an explicit check no longer needed. - */ - - /* User totalLength overrides a computed length, but we'll check - * every copy in the copy loop. Note that duk_to_int() can - * technically have arbitrary side effects so we need to recheck - * the buffers in the copy loop. - */ - if (!duk_is_undefined(thr, 1) && n > 0) { - /* For n == 0, Node.js ignores totalLength argument and - * returns a zero length buffer. - */ - duk_int_t total_length_signed; - total_length_signed = duk_to_int(thr, 1); - if (total_length_signed < 0) { - DUK_DCERROR_RANGE_INVALID_ARGS(thr); - } - total_length = (duk_uint_t) total_length_signed; - } - - h_bufres = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY), - DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); - DUK_ASSERT(h_bufres != NULL); - - p = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, total_length); /* must be zeroed, all bytes not necessarily written over */ - DUK_ASSERT(p != NULL); - space_left = (duk_size_t) total_length; - - for (i = 0; i < n; i++) { - DUK_ASSERT_TOP(thr, 4); /* [ array totalLength bufres buf ] */ - - duk_get_prop_index(thr, 0, (duk_uarridx_t) i); - h_bufobj = duk__require_bufobj_value(thr, 4); - DUK_ASSERT(h_bufobj != NULL); - - copy_size = h_bufobj->length; - if (copy_size > space_left) { - copy_size = space_left; - } - - if (h_bufobj->buf != NULL && - DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { - DUK_MEMCPY((void *) p, - (const void *) DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj), - copy_size); - } else { - /* Just skip, leaving zeroes in the result. */ - ; - } - p += copy_size; - space_left -= copy_size; - - duk_pop(thr); - } - - h_val = duk_known_hbuffer(thr, -1); - - duk__set_bufobj_buffer(thr, h_bufres, h_val); - h_bufres->is_typedarray = 1; - DUK_ASSERT_HBUFOBJ_VALID(h_bufres); - - duk_pop(thr); /* pop plain buffer, now reachable through h_bufres */ - - return 1; /* return h_bufres */ -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Shared readfield and writefield methods - * - * The readfield/writefield methods need support for endianness and field - * types. All offsets are byte based so no offset shifting is needed. - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -/* Format of magic, bits: - * 0...1: field type; 0=uint8, 1=uint16, 2=uint32, 3=float, 4=double, 5=unused, 6=unused, 7=unused - * 3: endianness: 0=little, 1=big - * 4: signed: 1=yes, 0=no - * 5: typedarray: 1=yes, 0=no - */ -#define DUK__FLD_8BIT 0 -#define DUK__FLD_16BIT 1 -#define DUK__FLD_32BIT 2 -#define DUK__FLD_FLOAT 3 -#define DUK__FLD_DOUBLE 4 -#define DUK__FLD_VARINT 5 -#define DUK__FLD_BIGENDIAN (1 << 3) -#define DUK__FLD_SIGNED (1 << 4) -#define DUK__FLD_TYPEDARRAY (1 << 5) - -/* XXX: split into separate functions for each field type? */ -DUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_hthread *thr) { - duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr); - duk_small_int_t magic_ftype; - duk_small_int_t magic_bigendian; - duk_small_int_t magic_signed; - duk_small_int_t magic_typedarray; - duk_small_int_t endswap; - duk_hbufobj *h_this; - duk_bool_t no_assert; - duk_int_t offset_signed; - duk_uint_t offset; - duk_uint_t buffer_length; - duk_uint_t check_length; - duk_uint8_t *buf; - duk_double_union du; - - magic_ftype = magic & 0x0007; - magic_bigendian = magic & 0x0008; - magic_signed = magic & 0x0010; - magic_typedarray = magic & 0x0020; - - h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */ - DUK_ASSERT(h_this != NULL); - buffer_length = h_this->length; - - /* [ offset noAssert ], when ftype != DUK__FLD_VARINT */ - /* [ offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ - /* [ offset littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ - - /* Handle TypedArray vs. Node.js Buffer arg differences */ - if (magic_typedarray) { - no_assert = 0; -#if defined(DUK_USE_INTEGER_LE) - endswap = !duk_to_boolean(thr, 1); /* 1=little endian */ -#else - endswap = duk_to_boolean(thr, 1); /* 1=little endian */ -#endif - } else { - no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 2 : 1); -#if defined(DUK_USE_INTEGER_LE) - endswap = magic_bigendian; -#else - endswap = !magic_bigendian; -#endif - } - - /* Offset is coerced first to signed integer range and then to unsigned. - * This ensures we can add a small byte length (1-8) to the offset in - * bound checks and not wrap. - */ - offset_signed = duk_to_int(thr, 0); - offset = (duk_uint_t) offset_signed; - if (offset_signed < 0) { - goto fail_bounds; - } - - DUK_DDD(DUK_DDDPRINT("readfield, buffer_length=%ld, offset=%ld, no_assert=%d, " - "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " - "endswap=%d", - (long) buffer_length, (long) offset, (int) no_assert, - (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), - (int) (magic_signed >> 4), (int) endswap)); - - /* Update 'buffer_length' to be the effective, safe limit which - * takes into account the underlying buffer. This value will be - * potentially invalidated by any side effect. - */ - check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length); - DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", - (long) buffer_length, (long) check_length)); - - if (h_this->buf) { - buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); - } else { - /* Neutered. We could go into the switch-case safely with - * buf == NULL because check_length == 0. To avoid scanbuild - * warnings, fail directly instead. - */ - DUK_ASSERT(check_length == 0); - goto fail_neutered; - } - DUK_ASSERT(buf != NULL); - - switch (magic_ftype) { - case DUK__FLD_8BIT: { - duk_uint8_t tmp; - if (offset + 1U > check_length) { - goto fail_bounds; - } - tmp = buf[offset]; - if (magic_signed) { - duk_push_int(thr, (duk_int_t) ((duk_int8_t) tmp)); - } else { - duk_push_uint(thr, (duk_uint_t) tmp); - } - break; - } - case DUK__FLD_16BIT: { - duk_uint16_t tmp; - if (offset + 2U > check_length) { - goto fail_bounds; - } - DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 2); - tmp = du.us[0]; - if (endswap) { - tmp = DUK_BSWAP16(tmp); - } - if (magic_signed) { - duk_push_int(thr, (duk_int_t) ((duk_int16_t) tmp)); - } else { - duk_push_uint(thr, (duk_uint_t) tmp); - } - break; - } - case DUK__FLD_32BIT: { - duk_uint32_t tmp; - if (offset + 4U > check_length) { - goto fail_bounds; - } - DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); - tmp = du.ui[0]; - if (endswap) { - tmp = DUK_BSWAP32(tmp); - } - if (magic_signed) { - duk_push_int(thr, (duk_int_t) ((duk_int32_t) tmp)); - } else { - duk_push_uint(thr, (duk_uint_t) tmp); - } - break; - } - case DUK__FLD_FLOAT: { - duk_uint32_t tmp; - if (offset + 4U > check_length) { - goto fail_bounds; - } - DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); - if (endswap) { - tmp = du.ui[0]; - tmp = DUK_BSWAP32(tmp); - du.ui[0] = tmp; - } - duk_push_number(thr, (duk_double_t) du.f[0]); - break; - } - case DUK__FLD_DOUBLE: { - if (offset + 8U > check_length) { - goto fail_bounds; - } - DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 8); - if (endswap) { - DUK_DBLUNION_BSWAP64(&du); - } - duk_push_number(thr, (duk_double_t) du.d); - break; - } - case DUK__FLD_VARINT: { - /* Node.js Buffer variable width integer field. We don't really - * care about speed here, so aim for shortest algorithm. - */ - duk_int_t field_bytelen; - duk_int_t i, i_step, i_end; -#if defined(DUK_USE_64BIT_OPS) - duk_int64_t tmp; - duk_small_uint_t shift_tmp; -#else - duk_double_t tmp; - duk_small_int_t highbyte; -#endif - const duk_uint8_t *p; - - field_bytelen = duk_get_int(thr, 1); /* avoid side effects! */ - if (field_bytelen < 1 || field_bytelen > 6) { - goto fail_field_length; - } - if (offset + (duk_uint_t) field_bytelen > check_length) { - goto fail_bounds; - } - p = (const duk_uint8_t *) (buf + offset); - - /* Slow gathering of value using either 64-bit arithmetic - * or IEEE doubles if 64-bit types not available. Handling - * of negative numbers is a bit non-obvious in both cases. - */ - - if (magic_bigendian) { - /* Gather in big endian */ - i = 0; - i_step = 1; - i_end = field_bytelen; /* one i_step over */ - } else { - /* Gather in little endian */ - i = field_bytelen - 1; - i_step = -1; - i_end = -1; /* one i_step over */ - } - -#if defined(DUK_USE_64BIT_OPS) - tmp = 0; - do { - DUK_ASSERT(i >= 0 && i < field_bytelen); - tmp = (tmp << 8) + (duk_int64_t) p[i]; - i += i_step; - } while (i != i_end); - - if (magic_signed) { - /* Shift to sign extend. */ - shift_tmp = (duk_small_uint_t) (64U - (duk_small_uint_t) field_bytelen * 8U); - tmp = (tmp << shift_tmp) >> shift_tmp; - } - - duk_push_i64(thr, tmp); -#else - highbyte = p[i]; - if (magic_signed && (highbyte & 0x80) != 0) { - /* 0xff => 255 - 256 = -1; 0x80 => 128 - 256 = -128 */ - tmp = (duk_double_t) (highbyte - 256); - } else { - tmp = (duk_double_t) highbyte; - } - for (;;) { - i += i_step; - if (i == i_end) { - break; - } - DUK_ASSERT(i >= 0 && i < field_bytelen); - tmp = (tmp * 256.0) + (duk_double_t) p[i]; - } - - duk_push_number(thr, tmp); -#endif - break; - } - default: { /* should never happen but default here */ - goto fail_bounds; - } - } - - return 1; - - fail_neutered: - fail_field_length: - fail_bounds: - if (no_assert) { - /* Node.js return value for noAssert out-of-bounds reads is - * usually (but not always) NaN. Return NaN consistently. - */ - duk_push_nan(thr); - return 1; - } - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -/* XXX: split into separate functions for each field type? */ -DUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_hthread *thr) { - duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr); - duk_small_int_t magic_ftype; - duk_small_int_t magic_bigendian; - duk_small_int_t magic_signed; - duk_small_int_t magic_typedarray; - duk_small_int_t endswap; - duk_hbufobj *h_this; - duk_bool_t no_assert; - duk_int_t offset_signed; - duk_uint_t offset; - duk_uint_t buffer_length; - duk_uint_t check_length; - duk_uint8_t *buf; - duk_double_union du; - duk_int_t nbytes = 0; - - magic_ftype = magic & 0x0007; - magic_bigendian = magic & 0x0008; - magic_signed = magic & 0x0010; - magic_typedarray = magic & 0x0020; - DUK_UNREF(magic_signed); - - h_this = duk__require_bufobj_this(thr); /* XXX: very inefficient for plain buffers */ - DUK_ASSERT(h_this != NULL); - buffer_length = h_this->length; - - /* [ value offset noAssert ], when ftype != DUK__FLD_VARINT */ - /* [ value offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ - /* [ offset value littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ - - /* Handle TypedArray vs. Node.js Buffer arg differences */ - if (magic_typedarray) { - no_assert = 0; -#if defined(DUK_USE_INTEGER_LE) - endswap = !duk_to_boolean(thr, 2); /* 1=little endian */ -#else - endswap = duk_to_boolean(thr, 2); /* 1=little endian */ -#endif - duk_swap(thr, 0, 1); /* offset/value order different from Node.js */ - } else { - no_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 3 : 2); -#if defined(DUK_USE_INTEGER_LE) - endswap = magic_bigendian; -#else - endswap = !magic_bigendian; -#endif - } - - /* Offset is coerced first to signed integer range and then to unsigned. - * This ensures we can add a small byte length (1-8) to the offset in - * bound checks and not wrap. - */ - offset_signed = duk_to_int(thr, 1); - offset = (duk_uint_t) offset_signed; - - /* We need 'nbytes' even for a failed offset; return value must be - * (offset + nbytes) even when write fails due to invalid offset. - */ - if (magic_ftype != DUK__FLD_VARINT) { - DUK_ASSERT(magic_ftype >= 0 && magic_ftype < (duk_small_int_t) (sizeof(duk__buffer_nbytes_from_fldtype) / sizeof(duk_uint8_t))); - nbytes = duk__buffer_nbytes_from_fldtype[magic_ftype]; - } else { - nbytes = duk_get_int(thr, 2); - if (nbytes < 1 || nbytes > 6) { - goto fail_field_length; - } - } - DUK_ASSERT(nbytes >= 1 && nbytes <= 8); - - /* Now we can check offset validity. */ - if (offset_signed < 0) { - goto fail_bounds; - } - - DUK_DDD(DUK_DDDPRINT("writefield, value=%!T, buffer_length=%ld, offset=%ld, no_assert=%d, " - "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " - "endswap=%d", - duk_get_tval(thr, 0), (long) buffer_length, (long) offset, (int) no_assert, - (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), - (int) (magic_signed >> 4), (int) endswap)); - - /* Coerce value to a number before computing check_length, so that - * the field type specific coercion below can't have side effects - * that would invalidate check_length. - */ - duk_to_number(thr, 0); - - /* Update 'buffer_length' to be the effective, safe limit which - * takes into account the underlying buffer. This value will be - * potentially invalidated by any side effect. - */ - check_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length); - DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", - (long) buffer_length, (long) check_length)); - - if (h_this->buf) { - buf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this); - } else { - /* Neutered. We could go into the switch-case safely with - * buf == NULL because check_length == 0. To avoid scanbuild - * warnings, fail directly instead. - */ - DUK_ASSERT(check_length == 0); - goto fail_neutered; - } - DUK_ASSERT(buf != NULL); - - switch (magic_ftype) { - case DUK__FLD_8BIT: { - if (offset + 1U > check_length) { - goto fail_bounds; - } - /* sign doesn't matter when writing */ - buf[offset] = (duk_uint8_t) duk_to_uint32(thr, 0); - break; - } - case DUK__FLD_16BIT: { - duk_uint16_t tmp; - if (offset + 2U > check_length) { - goto fail_bounds; - } - tmp = (duk_uint16_t) duk_to_uint32(thr, 0); - if (endswap) { - tmp = DUK_BSWAP16(tmp); - } - du.us[0] = tmp; - /* sign doesn't matter when writing */ - DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 2); - break; - } - case DUK__FLD_32BIT: { - duk_uint32_t tmp; - if (offset + 4U > check_length) { - goto fail_bounds; - } - tmp = (duk_uint32_t) duk_to_uint32(thr, 0); - if (endswap) { - tmp = DUK_BSWAP32(tmp); - } - du.ui[0] = tmp; - /* sign doesn't matter when writing */ - DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); - break; - } - case DUK__FLD_FLOAT: { - duk_uint32_t tmp; - if (offset + 4U > check_length) { - goto fail_bounds; - } - du.f[0] = (duk_float_t) duk_to_number(thr, 0); - if (endswap) { - tmp = du.ui[0]; - tmp = DUK_BSWAP32(tmp); - du.ui[0] = tmp; - } - /* sign doesn't matter when writing */ - DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); - break; - } - case DUK__FLD_DOUBLE: { - if (offset + 8U > check_length) { - goto fail_bounds; - } - du.d = (duk_double_t) duk_to_number(thr, 0); - if (endswap) { - DUK_DBLUNION_BSWAP64(&du); - } - /* sign doesn't matter when writing */ - DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 8); - break; - } - case DUK__FLD_VARINT: { - /* Node.js Buffer variable width integer field. We don't really - * care about speed here, so aim for shortest algorithm. - */ - duk_int_t field_bytelen; - duk_int_t i, i_step, i_end; -#if defined(DUK_USE_64BIT_OPS) - duk_int64_t tmp; -#else - duk_double_t tmp; -#endif - duk_uint8_t *p; - - field_bytelen = (duk_int_t) nbytes; - if (offset + (duk_uint_t) field_bytelen > check_length) { - goto fail_bounds; - } - - /* Slow writing of value using either 64-bit arithmetic - * or IEEE doubles if 64-bit types not available. There's - * no special sign handling when writing varints. - */ - - if (magic_bigendian) { - /* Write in big endian */ - i = field_bytelen; /* one i_step added at top of loop */ - i_step = -1; - i_end = 0; - } else { - /* Write in little endian */ - i = -1; /* one i_step added at top of loop */ - i_step = 1; - i_end = field_bytelen - 1; - } - - /* XXX: The duk_to_number() cast followed by integer coercion - * is platform specific so NaN, +/- Infinity, and out-of-bounds - * values result in platform specific output now. - * See: test-bi-nodejs-buffer-proto-varint-special.js - */ - -#if defined(DUK_USE_64BIT_OPS) - tmp = (duk_int64_t) duk_to_number(thr, 0); - p = (duk_uint8_t *) (buf + offset); - do { - i += i_step; - DUK_ASSERT(i >= 0 && i < field_bytelen); - p[i] = (duk_uint8_t) (tmp & 0xff); - tmp = tmp >> 8; /* unnecessary shift for last byte */ - } while (i != i_end); -#else - tmp = duk_to_number(thr, 0); - p = (duk_uint8_t *) (buf + offset); - do { - i += i_step; - tmp = DUK_FLOOR(tmp); - DUK_ASSERT(i >= 0 && i < field_bytelen); - p[i] = (duk_uint8_t) (DUK_FMOD(tmp, 256.0)); - tmp = tmp / 256.0; /* unnecessary div for last byte */ - } while (i != i_end); -#endif - break; - } - default: { /* should never happen but default here */ - goto fail_bounds; - } - } - - /* Node.js Buffer: return offset + #bytes written (i.e. next - * write offset). - */ - if (magic_typedarray) { - /* For TypedArrays 'undefined' return value is specified - * by ES2015 (matches V8). - */ - return 0; - } - duk_push_uint(thr, offset + (duk_uint_t) nbytes); - return 1; - - fail_neutered: - fail_field_length: - fail_bounds: - if (no_assert) { - /* Node.js return value for failed writes is offset + #bytes - * that would have been written. - */ - /* XXX: for negative input offsets, 'offset' will be a large - * positive value so the result here is confusing. - */ - if (magic_typedarray) { - return 0; - } - duk_push_uint(thr, offset + (duk_uint_t) nbytes); - return 1; - } - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * Accessors for .buffer, .byteLength, .byteOffset - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_LOCAL duk_hbufobj *duk__autospawn_arraybuffer(duk_hthread *thr, duk_hbuffer *h_buf) { - duk_hbufobj *h_res; - - h_res = duk_push_bufobj_raw(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_BUFOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), - DUK_BIDX_ARRAYBUFFER_PROTOTYPE); - DUK_ASSERT(h_res != NULL); - DUK_UNREF(h_res); - - duk__set_bufobj_buffer(thr, h_res, h_buf); - DUK_ASSERT_HBUFOBJ_VALID(h_res); - DUK_ASSERT(h_res->buf_prop == NULL); - return h_res; -} - -DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) { - duk_hbufobj *h_bufobj; - - h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); - DUK_ASSERT(h_bufobj != NULL); - if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { - DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for plain buffer")); - (void) duk__autospawn_arraybuffer(thr, (duk_hbuffer *) h_bufobj); - return 1; - } else { - if (h_bufobj->buf_prop == NULL && - DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufobj) != DUK_HOBJECT_CLASS_ARRAYBUFFER && - h_bufobj->buf != NULL) { - duk_hbufobj *h_arrbuf; - - DUK_DD(DUK_DDPRINT("autospawn ArrayBuffer for typed array or DataView")); - h_arrbuf = duk__autospawn_arraybuffer(thr, h_bufobj->buf); - - if (h_bufobj->buf_prop == NULL) { - /* Must recheck buf_prop, in case ArrayBuffer - * alloc had a side effect which already filled - * it! - */ - - /* Set ArrayBuffer's .byteOffset and .byteLength based - * on the view so that Arraybuffer[view.byteOffset] - * matches view[0]. - */ - h_arrbuf->offset = 0; - DUK_ASSERT(h_bufobj->offset + h_bufobj->length >= h_bufobj->offset); /* Wrap check on creation. */ - h_arrbuf->length = h_bufobj->offset + h_bufobj->length; - DUK_ASSERT(h_arrbuf->buf_prop == NULL); - - DUK_ASSERT(h_bufobj->buf_prop == NULL); - h_bufobj->buf_prop = (duk_hobject *) h_arrbuf; - DUK_HBUFOBJ_INCREF(thr, h_arrbuf); /* Now reachable and accounted for. */ - } - - /* Left on stack; pushed for the second time below (OK). */ - } - if (h_bufobj->buf_prop) { - duk_push_hobject(thr, h_bufobj->buf_prop); - return 1; - } - } - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) { - duk_hbufobj *h_bufobj; - - h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); - DUK_ASSERT(h_bufobj != NULL); - if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { - duk_push_uint(thr, 0); - } else { - /* If neutered must return 0; offset is zeroed during - * neutering. - */ - duk_push_uint(thr, h_bufobj->offset); - } - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) { - duk_hbufobj *h_bufobj; - - h_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/); - DUK_ASSERT(h_bufobj != NULL); - if (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) { - duk_hbuffer *h_buf; - - h_buf = (duk_hbuffer *) h_bufobj; - DUK_ASSERT(DUK_HBUFFER_GET_SIZE(h_buf) <= DUK_UINT_MAX); /* Buffer limits. */ - duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf)); - } else { - /* If neutered must return 0; length is zeroed during - * neutering. - */ - duk_push_uint(thr, h_bufobj->length); - } - return 1; -} -#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ -/* No .buffer getter without ArrayBuffer support. */ -#if 0 -DUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) { - return 0; -} -#endif - -DUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) { - duk_push_uint(thr, 0); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) { - duk_hbuffer *h_buf; - - /* XXX: helper? */ - duk_push_this(thr); - h_buf = duk_require_hbuffer(thr, -1); - duk_push_uint(thr, DUK_HBUFFER_GET_SIZE(h_buf)); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* automatic undefs */ -#undef DUK__BUFOBJ_FLAG_PROMOTE -#undef DUK__BUFOBJ_FLAG_THROW -#undef DUK__FLD_16BIT -#undef DUK__FLD_32BIT -#undef DUK__FLD_8BIT -#undef DUK__FLD_BIGENDIAN -#undef DUK__FLD_DOUBLE -#undef DUK__FLD_FLOAT -#undef DUK__FLD_SIGNED -#undef DUK__FLD_TYPEDARRAY -#undef DUK__FLD_VARINT -#line 1 "duk_bi_date.c" -/* - * Date built-ins - * - * Unlike most built-ins, Date has some platform dependencies for getting - * UTC time, converting between UTC and local time, and parsing and - * formatting time values. These are all abstracted behind DUK_USE_xxx - * config options. There are built-in platform specific providers for - * POSIX and Windows, but external providers can also be used. - * - * See doc/datetime.rst. - * - */ - -/* #include duk_internal.h -> already included */ - -/* XXX: currently defines unnecessary symbols when DUK_USE_DATE_BUILTIN is disabled. */ - -/* - * Forward declarations - */ - -DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset); -DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags); -DUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val); -DUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags); - -/* - * Other file level defines - */ - -/* Debug macro to print all parts and dparts (used manually because of debug level). */ -#define DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts) do { \ - DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ - (long) (parts)[0], (long) (parts)[1], \ - (long) (parts)[2], (long) (parts)[3], \ - (long) (parts)[4], (long) (parts)[5], \ - (long) (parts)[6], (long) (parts)[7], \ - (double) (dparts)[0], (double) (dparts)[1], \ - (double) (dparts)[2], (double) (dparts)[3], \ - (double) (dparts)[4], (double) (dparts)[5], \ - (double) (dparts)[6], (double) (dparts)[7])); \ - } while (0) -#define DUK__DPRINT_PARTS(parts) do { \ - DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld", \ - (long) (parts)[0], (long) (parts)[1], \ - (long) (parts)[2], (long) (parts)[3], \ - (long) (parts)[4], (long) (parts)[5], \ - (long) (parts)[6], (long) (parts)[7])); \ - } while (0) -#define DUK__DPRINT_DPARTS(dparts) do { \ - DUK_D(DUK_DPRINT("dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ - (double) (dparts)[0], (double) (dparts)[1], \ - (double) (dparts)[2], (double) (dparts)[3], \ - (double) (dparts)[4], (double) (dparts)[5], \ - (double) (dparts)[6], (double) (dparts)[7])); \ - } while (0) - -/* Equivalent year for DST calculations outside [1970,2038[ range, see - * E5 Section 15.9.1.8. Equivalent year has the same leap-year-ness and - * starts with the same weekday on Jan 1. - * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 - */ -#define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970)) -DUK_LOCAL duk_uint8_t duk__date_equivyear[14] = { -#if 1 - /* This is based on V8 EquivalentYear() algorithm (see util/genequivyear.py): - * http://code.google.com/p/v8/source/browse/trunk/src/date.h#146 - */ - - /* non-leap year: sunday, monday, ... */ - DUK__YEAR(2023), DUK__YEAR(2035), DUK__YEAR(2019), DUK__YEAR(2031), - DUK__YEAR(2015), DUK__YEAR(2027), DUK__YEAR(2011), - - /* leap year: sunday, monday, ... */ - DUK__YEAR(2012), DUK__YEAR(2024), DUK__YEAR(2008), DUK__YEAR(2020), - DUK__YEAR(2032), DUK__YEAR(2016), DUK__YEAR(2028) -#endif - -#if 0 - /* This is based on Rhino EquivalentYear() algorithm: - * https://github.com/mozilla/rhino/blob/f99cc11d616f0cdda2c42bde72b3484df6182947/src/org/mozilla/javascript/NativeDate.java - */ - - /* non-leap year: sunday, monday, ... */ - DUK__YEAR(1978), DUK__YEAR(1973), DUK__YEAR(1985), DUK__YEAR(1986), - DUK__YEAR(1981), DUK__YEAR(1971), DUK__YEAR(1977), - - /* leap year: sunday, monday, ... */ - DUK__YEAR(1984), DUK__YEAR(1996), DUK__YEAR(1980), DUK__YEAR(1992), - DUK__YEAR(1976), DUK__YEAR(1988), DUK__YEAR(1972) -#endif -}; - -/* - * ISO 8601 subset parser. - */ - -/* Parser part count. */ -#define DUK__NUM_ISO8601_PARSER_PARTS 9 - -/* Parser part indices. */ -#define DUK__PI_YEAR 0 -#define DUK__PI_MONTH 1 -#define DUK__PI_DAY 2 -#define DUK__PI_HOUR 3 -#define DUK__PI_MINUTE 4 -#define DUK__PI_SECOND 5 -#define DUK__PI_MILLISECOND 6 -#define DUK__PI_TZHOUR 7 -#define DUK__PI_TZMINUTE 8 - -/* Parser part masks. */ -#define DUK__PM_YEAR (1 << DUK__PI_YEAR) -#define DUK__PM_MONTH (1 << DUK__PI_MONTH) -#define DUK__PM_DAY (1 << DUK__PI_DAY) -#define DUK__PM_HOUR (1 << DUK__PI_HOUR) -#define DUK__PM_MINUTE (1 << DUK__PI_MINUTE) -#define DUK__PM_SECOND (1 << DUK__PI_SECOND) -#define DUK__PM_MILLISECOND (1 << DUK__PI_MILLISECOND) -#define DUK__PM_TZHOUR (1 << DUK__PI_TZHOUR) -#define DUK__PM_TZMINUTE (1 << DUK__PI_TZMINUTE) - -/* Parser separator indices. */ -#define DUK__SI_PLUS 0 -#define DUK__SI_MINUS 1 -#define DUK__SI_T 2 -#define DUK__SI_SPACE 3 -#define DUK__SI_COLON 4 -#define DUK__SI_PERIOD 5 -#define DUK__SI_Z 6 -#define DUK__SI_NUL 7 - -/* Parser separator masks. */ -#define DUK__SM_PLUS (1 << DUK__SI_PLUS) -#define DUK__SM_MINUS (1 << DUK__SI_MINUS) -#define DUK__SM_T (1 << DUK__SI_T) -#define DUK__SM_SPACE (1 << DUK__SI_SPACE) -#define DUK__SM_COLON (1 << DUK__SI_COLON) -#define DUK__SM_PERIOD (1 << DUK__SI_PERIOD) -#define DUK__SM_Z (1 << DUK__SI_Z) -#define DUK__SM_NUL (1 << DUK__SI_NUL) - -/* Rule control flags. */ -#define DUK__CF_NEG (1 << 0) /* continue matching, set neg_tzoffset flag */ -#define DUK__CF_ACCEPT (1 << 1) /* accept string */ -#define DUK__CF_ACCEPT_NUL (1 << 2) /* accept string if next char is NUL (otherwise reject) */ - -#define DUK__PACK_RULE(partmask,sepmask,nextpart,flags) \ - ((duk_uint32_t) (partmask) + \ - (((duk_uint32_t) (sepmask)) << 9) + \ - (((duk_uint32_t) (nextpart)) << 17) + \ - (((duk_uint32_t) (flags)) << 21)) - -#define DUK__UNPACK_RULE(rule,var_nextidx,var_flags) do { \ - (var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \ - (var_flags) = (duk_small_uint_t) ((rule) >> 21); \ - } while (0) - -#define DUK__RULE_MASK_PART_SEP 0x1ffffUL - -/* Matching separator index is used in the control table */ -DUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[] = { - DUK_ASC_PLUS /*0*/, DUK_ASC_MINUS /*1*/, DUK_ASC_UC_T /*2*/, DUK_ASC_SPACE /*3*/, - DUK_ASC_COLON /*4*/, DUK_ASC_PERIOD /*5*/, DUK_ASC_UC_Z /*6*/, DUK_ASC_NUL /*7*/ -}; - -/* Rule table: first matching rule is used to determine what to do next. */ -DUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[] = { - DUK__PACK_RULE(DUK__PM_YEAR, DUK__SM_MINUS, DUK__PI_MONTH, 0), - DUK__PACK_RULE(DUK__PM_MONTH, DUK__SM_MINUS, DUK__PI_DAY, 0), - DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY, DUK__SM_T | DUK__SM_SPACE, DUK__PI_HOUR, 0), - DUK__PACK_RULE(DUK__PM_HOUR, DUK__SM_COLON, DUK__PI_MINUTE, 0), - DUK__PACK_RULE(DUK__PM_MINUTE, DUK__SM_COLON, DUK__PI_SECOND, 0), - DUK__PACK_RULE(DUK__PM_SECOND, DUK__SM_PERIOD, DUK__PI_MILLISECOND, 0), - DUK__PACK_RULE(DUK__PM_TZHOUR, DUK__SM_COLON, DUK__PI_TZMINUTE, 0), - DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_PLUS, DUK__PI_TZHOUR, 0), - DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_MINUS, DUK__PI_TZHOUR, DUK__CF_NEG), - DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_Z, 0, DUK__CF_ACCEPT_NUL), - DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND | DUK__PM_TZHOUR /*Note2*/ | DUK__PM_TZMINUTE, DUK__SM_NUL, 0, DUK__CF_ACCEPT) - - /* Note1: the specification doesn't require matching a time form with - * just hours ("HH"), but we accept it here, e.g. "2012-01-02T12Z". - * - * Note2: the specification doesn't require matching a timezone offset - * with just hours ("HH"), but accept it here, e.g. "2012-01-02T03:04:05+02" - */ -}; - -DUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_hthread *thr, const char *str) { - duk_int_t parts[DUK__NUM_ISO8601_PARSER_PARTS]; - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t d; - const duk_uint8_t *p; - duk_small_uint_t part_idx = 0; - duk_int_t accum = 0; - duk_small_uint_t ndigits = 0; - duk_bool_t neg_year = 0; - duk_bool_t neg_tzoffset = 0; - duk_uint_fast8_t ch; - duk_small_uint_t i; - - /* During parsing, month and day are one-based; set defaults here. */ - DUK_MEMZERO(parts, sizeof(parts)); - DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] == 0); /* don't care value, year is mandatory */ - parts[DUK_DATE_IDX_MONTH] = 1; - parts[DUK_DATE_IDX_DAY] = 1; - - /* Special handling for year sign. */ - p = (const duk_uint8_t *) str; - ch = p[0]; - if (ch == DUK_ASC_PLUS) { - p++; - } else if (ch == DUK_ASC_MINUS) { - neg_year = 1; - p++; - } - - for (;;) { - ch = *p++; - DUK_DDD(DUK_DDDPRINT("parsing, part_idx=%ld, char=%ld ('%c')", - (long) part_idx, (long) ch, - (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : DUK_ASC_QUESTION))); - - if (ch >= DUK_ASC_0 && ch <= DUK_ASC_9) { - if (ndigits >= 9) { - DUK_DDD(DUK_DDDPRINT("too many digits -> reject")); - goto reject; - } - if (part_idx == DUK__PI_MILLISECOND && ndigits >= 3) { - /* ignore millisecond fractions after 3 */ - } else { - accum = accum * 10 + ((duk_int_t) ch) - ((duk_int_t) DUK_ASC_0) + 0x00; - ndigits++; - } - } else { - duk_uint_fast32_t match_val; - duk_small_uint_t sep_idx; - - if (ndigits <= 0) { - goto reject; - } - if (part_idx == DUK__PI_MILLISECOND) { - /* complete the millisecond field */ - while (ndigits < 3) { - accum *= 10; - ndigits++; - } - } - parts[part_idx] = accum; - DUK_DDD(DUK_DDDPRINT("wrote part %ld -> value %ld", (long) part_idx, (long) accum)); - - accum = 0; - ndigits = 0; - - for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t)); i++) { - if (duk__parse_iso8601_seps[i] == ch) { - break; - } - } - if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t))) { - DUK_DDD(DUK_DDDPRINT("separator character doesn't match -> reject")); - goto reject; - } - - sep_idx = i; - match_val = (1UL << part_idx) + (1UL << (sep_idx + 9)); /* match against rule part/sep bits */ - - for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t)); i++) { - duk_uint_fast32_t rule = duk__parse_iso8601_control[i]; - duk_small_uint_t nextpart; - duk_small_uint_t cflags; - - DUK_DDD(DUK_DDDPRINT("part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx", - (long) part_idx, (long) sep_idx, - (unsigned long) match_val, (unsigned long) rule)); - - if ((rule & match_val) != match_val) { - continue; - } - - DUK__UNPACK_RULE(rule, nextpart, cflags); - - DUK_DDD(DUK_DDDPRINT("rule match -> part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, " - "rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx", - (long) part_idx, (long) sep_idx, - (unsigned long) match_val, (unsigned long) rule, - (long) nextpart, (unsigned long) cflags)); - - if (cflags & DUK__CF_NEG) { - neg_tzoffset = 1; - } - - if (cflags & DUK__CF_ACCEPT) { - goto accept; - } - - if (cflags & DUK__CF_ACCEPT_NUL) { - DUK_ASSERT(*(p - 1) != (char) 0); - if (*p == DUK_ASC_NUL) { - goto accept; - } - goto reject; - } - - part_idx = nextpart; - break; - } /* rule match */ - - if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t))) { - DUK_DDD(DUK_DDDPRINT("no rule matches -> reject")); - goto reject; - } - - if (ch == 0) { - /* This shouldn't be necessary, but check just in case - * to avoid any chance of overruns. - */ - DUK_DDD(DUK_DDDPRINT("NUL after rule matching (should not happen) -> reject")); - goto reject; - } - } /* if-digit-else-ctrl */ - } /* char loop */ - - /* We should never exit the loop above. */ - DUK_UNREACHABLE(); - - reject: - DUK_DDD(DUK_DDDPRINT("reject")); - return 0; - - accept: - DUK_DDD(DUK_DDDPRINT("accept")); - - /* Apply timezone offset to get the main parts in UTC */ - if (neg_year) { - parts[DUK__PI_YEAR] = -parts[DUK__PI_YEAR]; - } - if (neg_tzoffset) { - parts[DUK__PI_HOUR] += parts[DUK__PI_TZHOUR]; - parts[DUK__PI_MINUTE] += parts[DUK__PI_TZMINUTE]; - } else { - parts[DUK__PI_HOUR] -= parts[DUK__PI_TZHOUR]; - parts[DUK__PI_MINUTE] -= parts[DUK__PI_TZMINUTE]; - } - parts[DUK__PI_MONTH] -= 1; /* zero-based month */ - parts[DUK__PI_DAY] -= 1; /* zero-based day */ - - /* Use double parts, they tolerate unnormalized time. - * - * Note: DUK_DATE_IDX_WEEKDAY is initialized with a bogus value (DUK__PI_TZHOUR) - * on purpose. It won't be actually used by duk_bi_date_get_timeval_from_dparts(), - * but will make the value initialized just in case, and avoid any - * potential for Valgrind issues. - */ - for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { - DUK_DDD(DUK_DDDPRINT("part[%ld] = %ld", (long) i, (long) parts[i])); - dparts[i] = parts[i]; - } - - d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); - duk_push_number(thr, d); - return 1; -} - -/* - * Date/time parsing helper. - * - * Parse a datetime string into a time value. We must first try to parse - * the input according to the standard format in E5.1 Section 15.9.1.15. - * If that fails, we can try to parse using custom parsing, which can - * either be platform neutral (custom code) or platform specific (using - * existing platform API calls). - * - * Note in particular that we must parse whatever toString(), toUTCString(), - * and toISOString() can produce; see E5.1 Section 15.9.4.2. - * - * Returns 1 to allow tail calling. - * - * There is much room for improvement here with respect to supporting - * alternative datetime formats. For instance, V8 parses '2012-01-01' as - * UTC and '2012/01/01' as local time. - */ - -DUK_LOCAL duk_ret_t duk__parse_string(duk_hthread *thr, const char *str) { - /* XXX: there is a small risk here: because the ISO 8601 parser is - * very loose, it may end up parsing some datetime values which - * would be better parsed with a platform specific parser. - */ - - DUK_ASSERT(str != NULL); - DUK_DDD(DUK_DDDPRINT("parse datetime from string '%s'", (const char *) str)); - - if (duk__parse_string_iso8601_subset(thr, str) != 0) { - return 1; - } - -#if defined(DUK_USE_DATE_PARSE_STRING) - /* Contract, either: - * - Push value on stack and return 1 - * - Don't push anything on stack and return 0 - */ - - if (DUK_USE_DATE_PARSE_STRING(thr, str) != 0) { - return 1; - } -#else - /* No platform-specific parsing, this is not an error. */ -#endif - - duk_push_nan(thr); - return 1; -} - -/* - * Calendar helpers - * - * Some helpers are used for getters and can operate on normalized values - * which can be represented with 32-bit signed integers. Other helpers are - * needed by setters and operate on un-normalized double values, must watch - * out for non-finite numbers etc. - */ - -DUK_LOCAL duk_uint8_t duk__days_in_month[12] = { - (duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30, - (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31, - (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31 -}; - -/* Maximum iteration count for computing UTC-to-local time offset when - * creating an Ecmascript time value from local parts. - */ -#define DUK__LOCAL_TZOFFSET_MAXITER 4 - -/* Because 'day since epoch' can be negative and is used to compute weekday - * using a modulo operation, add this multiple of 7 to avoid negative values - * when year is below 1970 epoch. Ecmascript time values are restricted to - * +/- 100 million days from epoch, so this adder fits nicely into 32 bits. - * Round to a multiple of 7 (= floor(100000000 / 7) * 7) and add margin. - */ -#define DUK__WEEKDAY_MOD_ADDER (20000000 * 7) /* 0x08583b00 */ - -DUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year) { - if ((year % 4) != 0) { - return 0; - } - if ((year % 100) != 0) { - return 1; - } - if ((year % 400) != 0) { - return 0; - } - return 1; -} - -DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x) { - return (x >= -DUK_DATE_MSEC_100M_DAYS && x <= DUK_DATE_MSEC_100M_DAYS); -} - -DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x) { - return (x >= -DUK_DATE_MSEC_100M_DAYS_LEEWAY && x <= DUK_DATE_MSEC_100M_DAYS_LEEWAY); -} - -DUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x) { - return (x >= DUK_DATE_MIN_ECMA_YEAR && x <= DUK_DATE_MAX_ECMA_YEAR); -} - -DUK_LOCAL duk_double_t duk__timeclip(duk_double_t x) { - if (!DUK_ISFINITE(x)) { - return DUK_DOUBLE_NAN; - } - - if (!duk_bi_date_timeval_in_valid_range(x)) { - return DUK_DOUBLE_NAN; - } - - x = duk_js_tointeger_number(x); - - /* Here we'd have the option to normalize -0 to +0. */ - return x; -} - -/* Integer division which floors also negative values correctly. */ -DUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b) { - DUK_ASSERT(b > 0); - if (a >= 0) { - return a / b; - } else { - /* e.g. a = -4, b = 5 --> -4 - 5 + 1 / 5 --> -8 / 5 --> -1 - * a = -5, b = 5 --> -5 - 5 + 1 / 5 --> -9 / 5 --> -1 - * a = -6, b = 5 --> -6 - 5 + 1 / 5 --> -10 / 5 --> -2 - */ - return (a - b + 1) / b; - } -} - -/* Compute day number of the first day of a given year. */ -DUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year) { - /* Note: in integer arithmetic, (x / 4) is same as floor(x / 4) for non-negative - * values, but is incorrect for negative ones. - */ - return 365 * (year - 1970) - + duk__div_floor(year - 1969, 4) - - duk__div_floor(year - 1901, 100) - + duk__div_floor(year - 1601, 400); -} - -/* Given a day number, determine year and day-within-year. */ -DUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year) { - duk_int_t year; - duk_int_t diff_days; - - /* estimate year upwards (towards positive infinity), then back down; - * two iterations should be enough - */ - - if (day >= 0) { - year = 1970 + day / 365; - } else { - year = 1970 + day / 366; - } - - for (;;) { - diff_days = duk__day_from_year(year) - day; - DUK_DDD(DUK_DDDPRINT("year=%ld day=%ld, diff_days=%ld", (long) year, (long) day, (long) diff_days)); - if (diff_days <= 0) { - DUK_ASSERT(-diff_days < 366); /* fits into duk_small_int_t */ - *out_day_within_year = -diff_days; - DUK_DDD(DUK_DDDPRINT("--> year=%ld, day-within-year=%ld", - (long) year, (long) *out_day_within_year)); - DUK_ASSERT(*out_day_within_year >= 0); - DUK_ASSERT(*out_day_within_year < (duk_bi_date_is_leap_year(year) ? 366 : 365)); - return year; - } - - /* Note: this is very tricky; we must never 'overshoot' the - * correction downwards. - */ - year -= 1 + (diff_days - 1) / 366; /* conservative */ - } -} - -/* Given a (year, month, day-within-month) triple, compute day number. - * The input triple is un-normalized and may contain non-finite values. - */ -DUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day) { - duk_int_t day_num; - duk_bool_t is_leap; - duk_small_int_t i, n; - - /* Assume that year, month, day are all coerced to whole numbers. - * They may also be NaN or infinity, in which case this function - * must return NaN or infinity to ensure time value becomes NaN. - * If 'day' is NaN, the final return will end up returning a NaN, - * so it doesn't need to be checked here. - */ - - if (!DUK_ISFINITE(year) || !DUK_ISFINITE(month)) { - return DUK_DOUBLE_NAN; - } - - year += DUK_FLOOR(month / 12.0); - - month = DUK_FMOD(month, 12.0); - if (month < 0.0) { - /* handle negative values */ - month += 12.0; - } - - /* The algorithm in E5.1 Section 15.9.1.12 normalizes month, but - * does not normalize the day-of-month (nor check whether or not - * it is finite) because it's not necessary for finding the day - * number which matches the (year,month) pair. - * - * We assume that duk__day_from_year() is exact here. - * - * Without an explicit infinity / NaN check in the beginning, - * day_num would be a bogus integer here. - * - * It's possible for 'year' to be out of integer range here. - * If so, we need to return NaN without integer overflow. - * This fixes test-bug-setyear-overflow.js. - */ - - if (!duk_bi_date_year_in_valid_range(year)) { - DUK_DD(DUK_DDPRINT("year not in ecmascript valid range, avoid integer overflow: %lf", (double) year)); - return DUK_DOUBLE_NAN; - } - day_num = duk__day_from_year((duk_int_t) year); - is_leap = duk_bi_date_is_leap_year((duk_int_t) year); - - n = (duk_small_int_t) month; - for (i = 0; i < n; i++) { - day_num += duk__days_in_month[i]; - if (i == 1 && is_leap) { - day_num++; - } - } - - /* If 'day' is NaN, returns NaN. */ - return (duk_double_t) day_num + day; -} - -/* Split time value into parts. The time value may contain fractions (it may - * come from duk_time_to_components() API call) which are truncated. Possible - * local time adjustment has already been applied when reading the time value. - */ -DUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags) { - duk_double_t d1, d2; - duk_int_t t1, t2; - duk_int_t day_since_epoch; - duk_int_t year; /* does not fit into 16 bits */ - duk_small_int_t day_in_year; - duk_small_int_t month; - duk_small_int_t day; - duk_small_int_t dim; - duk_int_t jan1_since_epoch; - duk_small_int_t jan1_weekday; - duk_int_t equiv_year; - duk_small_uint_t i; - duk_bool_t is_leap; - duk_small_int_t arridx; - - DUK_ASSERT(DUK_ISFINITE(d)); /* caller checks */ - d = DUK_FLOOR(d); /* remove fractions if present */ - DUK_ASSERT(DUK_FLOOR(d) == d); - - /* The timevalue must be in valid Ecmascript range, but since a local - * time offset can be applied, we need to allow a +/- 24h leeway to - * the value. In other words, although the UTC time is within the - * Ecmascript range, the local part values can be just outside of it. - */ - DUK_UNREF(duk_bi_date_timeval_in_leeway_range); - DUK_ASSERT(duk_bi_date_timeval_in_leeway_range(d)); - - /* These computations are guaranteed to be exact for the valid - * E5 time value range, assuming milliseconds without fractions. - */ - d1 = (duk_double_t) DUK_FMOD(d, (double) DUK_DATE_MSEC_DAY); - if (d1 < 0.0) { - /* deal with negative values */ - d1 += (duk_double_t) DUK_DATE_MSEC_DAY; - } - d2 = DUK_FLOOR((double) (d / (duk_double_t) DUK_DATE_MSEC_DAY)); - DUK_ASSERT(d2 * ((duk_double_t) DUK_DATE_MSEC_DAY) + d1 == d); - /* now expected to fit into a 32-bit integer */ - t1 = (duk_int_t) d1; - t2 = (duk_int_t) d2; - day_since_epoch = t2; - DUK_ASSERT((duk_double_t) t1 == d1); - DUK_ASSERT((duk_double_t) t2 == d2); - - /* t1 = milliseconds within day (fits 32 bit) - * t2 = day number from epoch (fits 32 bit, may be negative) - */ - - parts[DUK_DATE_IDX_MILLISECOND] = t1 % 1000; t1 /= 1000; - parts[DUK_DATE_IDX_SECOND] = t1 % 60; t1 /= 60; - parts[DUK_DATE_IDX_MINUTE] = t1 % 60; t1 /= 60; - parts[DUK_DATE_IDX_HOUR] = t1; - DUK_ASSERT(parts[DUK_DATE_IDX_MILLISECOND] >= 0 && parts[DUK_DATE_IDX_MILLISECOND] <= 999); - DUK_ASSERT(parts[DUK_DATE_IDX_SECOND] >= 0 && parts[DUK_DATE_IDX_SECOND] <= 59); - DUK_ASSERT(parts[DUK_DATE_IDX_MINUTE] >= 0 && parts[DUK_DATE_IDX_MINUTE] <= 59); - DUK_ASSERT(parts[DUK_DATE_IDX_HOUR] >= 0 && parts[DUK_DATE_IDX_HOUR] <= 23); - - DUK_DDD(DUK_DDDPRINT("d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld", - (double) d, (double) d1, (double) d2, (long) t1, (long) t2, - (long) parts[DUK_DATE_IDX_HOUR], - (long) parts[DUK_DATE_IDX_MINUTE], - (long) parts[DUK_DATE_IDX_SECOND], - (long) parts[DUK_DATE_IDX_MILLISECOND])); - - /* This assert depends on the input parts representing time inside - * the Ecmascript range. - */ - DUK_ASSERT(t2 + DUK__WEEKDAY_MOD_ADDER >= 0); - parts[DUK_DATE_IDX_WEEKDAY] = (t2 + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ - DUK_ASSERT(parts[DUK_DATE_IDX_WEEKDAY] >= 0 && parts[DUK_DATE_IDX_WEEKDAY] <= 6); - - year = duk__year_from_day(t2, &day_in_year); - day = day_in_year; - is_leap = duk_bi_date_is_leap_year(year); - for (month = 0; month < 12; month++) { - dim = duk__days_in_month[month]; - if (month == 1 && is_leap) { - dim++; - } - DUK_DDD(DUK_DDDPRINT("month=%ld, dim=%ld, day=%ld", - (long) month, (long) dim, (long) day)); - if (day < dim) { - break; - } - day -= dim; - } - DUK_DDD(DUK_DDDPRINT("final month=%ld", (long) month)); - DUK_ASSERT(month >= 0 && month <= 11); - DUK_ASSERT(day >= 0 && day <= 31); - - /* Equivalent year mapping, used to avoid DST trouble when platform - * may fail to provide reasonable DST answers for dates outside the - * ordinary range (e.g. 1970-2038). An equivalent year has the same - * leap-year-ness as the original year and begins on the same weekday - * (Jan 1). - * - * The year 2038 is avoided because there seem to be problems with it - * on some platforms. The year 1970 is also avoided as there were - * practical problems with it; an equivalent year is used for it too, - * which breaks some DST computations for 1970 right now, see e.g. - * test-bi-date-tzoffset-brute-fi.js. - */ - if ((flags & DUK_DATE_FLAG_EQUIVYEAR) && (year < 1971 || year > 2037)) { - DUK_ASSERT(is_leap == 0 || is_leap == 1); - - jan1_since_epoch = day_since_epoch - day_in_year; /* day number for Jan 1 since epoch */ - DUK_ASSERT(jan1_since_epoch + DUK__WEEKDAY_MOD_ADDER >= 0); - jan1_weekday = (jan1_since_epoch + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ - DUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6); - arridx = jan1_weekday; - if (is_leap) { - arridx += 7; - } - DUK_ASSERT(arridx >= 0 && arridx < (duk_small_int_t) (sizeof(duk__date_equivyear) / sizeof(duk_uint8_t))); - - equiv_year = (duk_int_t) duk__date_equivyear[arridx] + 1970; - year = equiv_year; - DUK_DDD(DUK_DDDPRINT("equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, " - "jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld", - (long) year, (long) day_in_year, (long) day_since_epoch, - (long) jan1_since_epoch, (long) jan1_weekday, (long) equiv_year)); - } - - parts[DUK_DATE_IDX_YEAR] = year; - parts[DUK_DATE_IDX_MONTH] = month; - parts[DUK_DATE_IDX_DAY] = day; - - if (flags & DUK_DATE_FLAG_ONEBASED) { - parts[DUK_DATE_IDX_MONTH]++; /* zero-based -> one-based */ - parts[DUK_DATE_IDX_DAY]++; /* -""- */ - } - - if (dparts != NULL) { - for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { - dparts[i] = (duk_double_t) parts[i]; - } - } -} - -/* Compute time value from (double) parts. The parts can be either UTC - * or local time; if local, they need to be (conceptually) converted into - * UTC time. The parts may represent valid or invalid time, and may be - * wildly out of range (but may cancel each other and still come out in - * the valid Date range). - */ -DUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags) { -#if defined(DUK_USE_PARANOID_DATE_COMPUTATION) - /* See comments below on MakeTime why these are volatile. */ - volatile duk_double_t tmp_time; - volatile duk_double_t tmp_day; - volatile duk_double_t d; -#else - duk_double_t tmp_time; - duk_double_t tmp_day; - duk_double_t d; -#endif - duk_small_uint_t i; - duk_int_t tzoff, tzoffprev1, tzoffprev2; - - /* Expects 'this' at top of stack on entry. */ - - /* Coerce all finite parts with ToInteger(). ToInteger() must not - * be called for NaN/Infinity because it will convert e.g. NaN to - * zero. If ToInteger() has already been called, this has no side - * effects and is idempotent. - * - * Don't read dparts[DUK_DATE_IDX_WEEKDAY]; it will cause Valgrind - * issues if the value is uninitialized. - */ - for (i = 0; i <= DUK_DATE_IDX_MILLISECOND; i++) { - /* SCANBUILD: scan-build complains here about assigned value - * being garbage or undefined. This is correct but operating - * on undefined values has no ill effect and is ignored by the - * caller in the case where this happens. - */ - d = dparts[i]; - if (DUK_ISFINITE(d)) { - dparts[i] = duk_js_tointeger_number(d); - } - } - - /* Use explicit steps in computation to try to ensure that - * computation happens with intermediate results coerced to - * double values (instead of using something more accurate). - * E.g. E5.1 Section 15.9.1.11 requires use of IEEE 754 - * rules (= Ecmascript '+' and '*' operators). - * - * Without 'volatile' even this approach fails on some platform - * and compiler combinations. For instance, gcc 4.8.1 on Ubuntu - * 64-bit, with -m32 and without -std=c99, test-bi-date-canceling.js - * would fail because of some optimizations when computing tmp_time - * (MakeTime below). Adding 'volatile' to tmp_time solved this - * particular problem (annoyingly, also adding debug prints or - * running the executable under valgrind hides it). - */ - - /* MakeTime */ - tmp_time = 0.0; - tmp_time += dparts[DUK_DATE_IDX_HOUR] * ((duk_double_t) DUK_DATE_MSEC_HOUR); - tmp_time += dparts[DUK_DATE_IDX_MINUTE] * ((duk_double_t) DUK_DATE_MSEC_MINUTE); - tmp_time += dparts[DUK_DATE_IDX_SECOND] * ((duk_double_t) DUK_DATE_MSEC_SECOND); - tmp_time += dparts[DUK_DATE_IDX_MILLISECOND]; - - /* MakeDay */ - tmp_day = duk__make_day(dparts[DUK_DATE_IDX_YEAR], dparts[DUK_DATE_IDX_MONTH], dparts[DUK_DATE_IDX_DAY]); - - /* MakeDate */ - d = tmp_day * ((duk_double_t) DUK_DATE_MSEC_DAY) + tmp_time; - - DUK_DDD(DUK_DDDPRINT("time=%lf day=%lf --> timeval=%lf", - (double) tmp_time, (double) tmp_day, (double) d)); - - /* Optional UTC conversion. */ - if (flags & DUK_DATE_FLAG_LOCALTIME) { - /* DUK_USE_DATE_GET_LOCAL_TZOFFSET() needs to be called with a - * time value computed from UTC parts. At this point we only - * have 'd' which is a time value computed from local parts, so - * it is off by the UTC-to-local time offset which we don't know - * yet. The current solution for computing the UTC-to-local - * time offset is to iterate a few times and detect a fixed - * point or a two-cycle loop (or a sanity iteration limit), - * see test-bi-date-local-parts.js and test-bi-date-tzoffset-basic-fi.js. - * - * E5.1 Section 15.9.1.9: - * UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA) - * - * For NaN/inf, DUK_USE_DATE_GET_LOCAL_TZOFFSET() returns 0. - */ - -#if 0 - /* Old solution: don't iterate, incorrect */ - tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); - DUK_DDD(DUK_DDDPRINT("tzoffset w/o iteration, tzoff=%ld", (long) tzoff)); - d -= tzoff * 1000L; - DUK_UNREF(tzoffprev1); - DUK_UNREF(tzoffprev2); -#endif - - /* Iteration solution */ - tzoff = 0; - tzoffprev1 = 999999999L; /* invalid value which never matches */ - for (i = 0; i < DUK__LOCAL_TZOFFSET_MAXITER; i++) { - tzoffprev2 = tzoffprev1; - tzoffprev1 = tzoff; - tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L); - DUK_DDD(DUK_DDDPRINT("tzoffset iteration, i=%d, tzoff=%ld, tzoffprev1=%ld tzoffprev2=%ld", - (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); - if (tzoff == tzoffprev1) { - DUK_DDD(DUK_DDDPRINT("tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", - (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); - break; - } else if (tzoff == tzoffprev2) { - /* Two value cycle, see e.g. test-bi-date-tzoffset-basic-fi.js. - * In these cases, favor a higher tzoffset to get a consistent - * result which is independent of iteration count. Not sure if - * this is a generically correct solution. - */ - DUK_DDD(DUK_DDDPRINT("tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", - (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); - if (tzoffprev1 > tzoff) { - tzoff = tzoffprev1; - } - break; - } - } - DUK_DDD(DUK_DDDPRINT("tzoffset iteration, tzoff=%ld", (long) tzoff)); - d -= tzoff * 1000L; - } - - /* TimeClip(), which also handles Infinity -> NaN conversion */ - d = duk__timeclip(d); - - return d; -} - -/* - * API oriented helpers - */ - -/* Push 'this' binding, check that it is a Date object; then push the - * internal time value. At the end, stack is: [ ... this timeval ]. - * Returns the time value. Local time adjustment is done if requested. - */ -DUK_LOCAL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset) { - duk_hobject *h; - duk_double_t d; - duk_int_t tzoffset = 0; - - duk_push_this(thr); - h = duk_get_hobject(thr, -1); /* XXX: getter with class check, useful in built-ins */ - if (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) { - DUK_ERROR_TYPE(thr, "expected Date"); - } - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - d = duk_to_number_m1(thr); - duk_pop(thr); - - if (DUK_ISNAN(d)) { - if (flags & DUK_DATE_FLAG_NAN_TO_ZERO) { - d = 0.0; - } - if (flags & DUK_DATE_FLAG_NAN_TO_RANGE_ERROR) { - DUK_ERROR_RANGE(thr, "Invalid Date"); - } - } - /* if no NaN handling flag, may still be NaN here, but not Inf */ - DUK_ASSERT(!DUK_ISINF(d)); - - if (flags & DUK_DATE_FLAG_LOCALTIME) { - /* Note: DST adjustment is determined using UTC time. - * If 'd' is NaN, tzoffset will be 0. - */ - tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); /* seconds */ - d += tzoffset * 1000L; - } - if (out_tzoffset) { - *out_tzoffset = tzoffset; - } - - /* [ ... this ] */ - return d; -} - -DUK_LOCAL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags) { - return duk__push_this_get_timeval_tzoffset(thr, flags, NULL); -} - -/* Set timeval to 'this' from dparts, push the new time value onto the - * value stack and return 1 (caller can then tail call us). Expects - * the value stack to contain 'this' on the stack top. - */ -DUK_LOCAL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags) { - duk_double_t d; - - /* [ ... this ] */ - - d = duk_bi_date_get_timeval_from_dparts(dparts, flags); - duk_push_number(thr, d); /* -> [ ... this timeval_new ] */ - duk_dup_top(thr); /* -> [ ... this timeval_new timeval_new ] */ - duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); - - /* stack top: new time value, return 1 to allow tail calls */ - return 1; -} - -/* 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. */ -DUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf) { - char yearstr[8]; /* "-123456\0" */ - char tzstr[8]; /* "+11:22\0" */ - char sep = (flags & DUK_DATE_FLAG_SEP_T) ? DUK_ASC_UC_T : DUK_ASC_SPACE; - - DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); - DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); - DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= -999999 && parts[DUK_DATE_IDX_YEAR] <= 999999); - - /* Note: %06d for positive value, %07d for negative value to include - * sign and 6 digits. - */ - DUK_SNPRINTF(yearstr, - sizeof(yearstr), - (parts[DUK_DATE_IDX_YEAR] >= 0 && parts[DUK_DATE_IDX_YEAR] <= 9999) ? "%04ld" : - ((parts[DUK_DATE_IDX_YEAR] >= 0) ? "+%06ld" : "%07ld"), - (long) parts[DUK_DATE_IDX_YEAR]); - yearstr[sizeof(yearstr) - 1] = (char) 0; - - if (flags & DUK_DATE_FLAG_LOCALTIME) { - /* tzoffset seconds are dropped; 16 bits suffice for - * time offset in minutes - */ - const char *fmt; - duk_small_int_t tmp, arg_hours, arg_minutes; - - if (tzoffset >= 0) { - tmp = tzoffset; - fmt = "+%02d:%02d"; - } else { - tmp = -tzoffset; - fmt = "-%02d:%02d"; - } - tmp = tmp / 60; - arg_hours = tmp / 60; - arg_minutes = tmp % 60; - DUK_ASSERT(arg_hours <= 24); /* Even less is actually guaranteed for a valid tzoffset. */ - arg_hours = arg_hours & 0x3f; /* For [0,24] this is a no-op, but fixes GCC 7 warning, see https://github.com/svaarala/duktape/issues/1602. */ - - DUK_SNPRINTF(tzstr, sizeof(tzstr), fmt, (int) arg_hours, (int) arg_minutes); - tzstr[sizeof(tzstr) - 1] = (char) 0; - } else { - tzstr[0] = DUK_ASC_UC_Z; - tzstr[1] = (char) 0; - } - - /* Unlike year, the other parts fit into 16 bits so %d format - * is portable. - */ - if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { - DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d%c%02d:%02d:%02d.%03d%s", - (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY], (int) sep, - (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], - (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr); - } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { - DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d", - (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY]); - } else { - DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); - DUK_SPRINTF((char *) out_buf, "%02d:%02d:%02d.%03d%s", - (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], - (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], - (const char *) tzstr); - } -} - -/* Helper for string conversion calls: check 'this' binding, get the - * internal time value, and format date and/or time in a few formats. - * Return value allows tail calls. - */ -DUK_LOCAL duk_ret_t duk__to_string_helper(duk_hthread *thr, duk_small_uint_t flags) { - duk_double_t d; - duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; - duk_int_t tzoffset; /* seconds, doesn't fit into 16 bits */ - duk_bool_t rc; - duk_uint8_t buf[DUK_BI_DATE_ISO8601_BUFSIZE]; - - DUK_UNREF(rc); /* unreferenced with some options */ - - d = duk__push_this_get_timeval_tzoffset(thr, flags, &tzoffset); - if (DUK_ISNAN(d)) { - duk_push_hstring_stridx(thr, DUK_STRIDX_INVALID_DATE); - return 1; - } - DUK_ASSERT(DUK_ISFINITE(d)); - - /* formatters always get one-based month/day-of-month */ - duk_bi_date_timeval_to_parts(d, parts, NULL, DUK_DATE_FLAG_ONEBASED); - DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); - DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); - - if (flags & DUK_DATE_FLAG_TOSTRING_LOCALE) { - /* try locale specific formatter; if it refuses to format the - * string, fall back to an ISO 8601 formatted value in local - * time. - */ -#if defined(DUK_USE_DATE_FORMAT_STRING) - /* Contract, either: - * - Push string to value stack and return 1 - * - Don't push anything and return 0 - */ - - rc = DUK_USE_DATE_FORMAT_STRING(thr, parts, tzoffset, flags); - if (rc != 0) { - return 1; - } -#else - /* No locale specific formatter; this is OK, we fall back - * to ISO 8601. - */ -#endif - } - - /* Different calling convention than above used because the helper - * is shared. - */ - duk__format_parts_iso8601(parts, tzoffset, flags, buf); - duk_push_string(thr, (const char *) buf); - return 1; -} - -/* Helper for component getter calls: check 'this' binding, get the - * internal time value, split it into parts (either as UTC time or - * local time), push a specified component as a return value to the - * value stack and return 1 (caller can then tail call us). - */ -DUK_LOCAL duk_ret_t duk__get_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_idx) { - duk_double_t d; - duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; - duk_small_uint_t idx_part = (duk_small_uint_t) (flags_and_idx >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ - - DUK_ASSERT_DISABLE(idx_part >= 0); /* unsigned */ - DUK_ASSERT(idx_part < DUK_DATE_IDX_NUM_PARTS); - - d = duk__push_this_get_timeval(thr, flags_and_idx); - if (DUK_ISNAN(d)) { - duk_push_nan(thr); - return 1; - } - DUK_ASSERT(DUK_ISFINITE(d)); - - duk_bi_date_timeval_to_parts(d, parts, NULL, flags_and_idx); /* no need to mask idx portion */ - - /* Setter APIs detect special year numbers (0...99) and apply a +1900 - * only in certain cases. The legacy getYear() getter applies -1900 - * unconditionally. - */ - duk_push_int(thr, (flags_and_idx & DUK_DATE_FLAG_SUB1900) ? parts[idx_part] - 1900 : parts[idx_part]); - return 1; -} - -/* Helper for component setter calls: check 'this' binding, get the - * internal time value, split it into parts (either as UTC time or - * local time), modify one or more components as specified, recompute - * the time value, set it as the internal value. Finally, push the - * new time value as a return value to the value stack and return 1 - * (caller can then tail call us). - */ -DUK_LOCAL duk_ret_t duk__set_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_maxnargs) { - duk_double_t d; - duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_idx_t nargs; - duk_small_uint_t maxnargs = (duk_small_uint_t) (flags_and_maxnargs >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ - duk_small_uint_t idx_first, idx; - duk_small_uint_t i; - - nargs = duk_get_top(thr); - d = duk__push_this_get_timeval(thr, flags_and_maxnargs); - DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); - - if (DUK_ISFINITE(d)) { - duk_bi_date_timeval_to_parts(d, parts, dparts, flags_and_maxnargs); - } else { - /* NaN timevalue: we need to coerce the arguments, but - * the resulting internal timestamp needs to remain NaN. - * This works but is not pretty: parts and dparts will - * be partially uninitialized, but we only write to them. - */ - } - - /* - * Determining which datetime components to overwrite based on - * stack arguments is a bit complicated, but important to factor - * out from setters themselves for compactness. - * - * If DUK_DATE_FLAG_TIMESETTER, maxnargs indicates setter type: - * - * 1 -> millisecond - * 2 -> second, [millisecond] - * 3 -> minute, [second], [millisecond] - * 4 -> hour, [minute], [second], [millisecond] - * - * Else: - * - * 1 -> date - * 2 -> month, [date] - * 3 -> year, [month], [date] - * - * By comparing nargs and maxnargs (and flags) we know which - * components to override. We rely on part index ordering. - */ - - if (flags_and_maxnargs & DUK_DATE_FLAG_TIMESETTER) { - DUK_ASSERT(maxnargs >= 1 && maxnargs <= 4); - idx_first = DUK_DATE_IDX_MILLISECOND - (maxnargs - 1); - } else { - DUK_ASSERT(maxnargs >= 1 && maxnargs <= 3); - idx_first = DUK_DATE_IDX_DAY - (maxnargs - 1); - } - DUK_ASSERT_DISABLE(idx_first >= 0); /* unsigned */ - DUK_ASSERT(idx_first < DUK_DATE_IDX_NUM_PARTS); - - for (i = 0; i < maxnargs; i++) { - if ((duk_idx_t) i >= nargs) { - /* no argument given -> leave components untouched */ - break; - } - idx = idx_first + i; - DUK_ASSERT_DISABLE(idx >= 0); /* unsigned */ - DUK_ASSERT(idx < DUK_DATE_IDX_NUM_PARTS); - - if (idx == DUK_DATE_IDX_YEAR && (flags_and_maxnargs & DUK_DATE_FLAG_YEAR_FIXUP)) { - duk__twodigit_year_fixup(thr, (duk_idx_t) i); - } - - dparts[idx] = duk_to_number(thr, (duk_idx_t) i); - - if (idx == DUK_DATE_IDX_DAY) { - /* Day-of-month is one-based in the API, but zero-based - * internally, so fix here. Note that month is zero-based - * both in the API and internally. - */ - /* SCANBUILD: complains about use of uninitialized values. - * The complaint is correct, but operating in undefined - * values here is intentional in some cases and the caller - * ignores the results. - */ - dparts[idx] -= 1.0; - } - } - - /* Leaves new timevalue on stack top and returns 1, which is correct - * for part setters. - */ - if (DUK_ISFINITE(d)) { - return duk__set_this_timeval_from_dparts(thr, dparts, flags_and_maxnargs); - } else { - /* Internal timevalue is already NaN, so don't touch it. */ - duk_push_nan(thr); - return 1; - } -} - -/* Apply ToNumber() to specified index; if ToInteger(val) in [0,99], add - * 1900 and replace value at idx_val. - */ -DUK_LOCAL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val) { - duk_double_t d; - - /* XXX: idx_val would fit into 16 bits, but using duk_small_uint_t - * might not generate better code due to casting. - */ - - /* E5 Sections 15.9.3.1, B.2.4, B.2.5 */ - duk_to_number(thr, idx_val); - if (duk_is_nan(thr, idx_val)) { - return; - } - duk_dup(thr, idx_val); - duk_to_int(thr, -1); - d = duk_get_number(thr, -1); /* get as double to handle huge numbers correctly */ - if (d >= 0.0 && d <= 99.0) { - d += 1900.0; - duk_push_number(thr, d); - duk_replace(thr, idx_val); - } - duk_pop(thr); -} - -/* Set datetime parts from stack arguments, defaulting any missing values. - * Day-of-week is not set; it is not required when setting the time value. - */ -DUK_LOCAL void duk__set_parts_from_args(duk_hthread *thr, duk_double_t *dparts, duk_idx_t nargs) { - duk_double_t d; - duk_small_uint_t i; - duk_small_uint_t idx; - - /* Causes a ToNumber() coercion, but doesn't break coercion order since - * year is coerced first anyway. - */ - duk__twodigit_year_fixup(thr, 0); - - /* There are at most 7 args, but we use 8 here so that also - * DUK_DATE_IDX_WEEKDAY gets initialized (to zero) to avoid the potential - * for any Valgrind gripes later. - */ - for (i = 0; i < 8; i++) { - /* Note: rely on index ordering */ - idx = DUK_DATE_IDX_YEAR + i; - if ((duk_idx_t) i < nargs) { - d = duk_to_number(thr, (duk_idx_t) i); - if (idx == DUK_DATE_IDX_DAY) { - /* Convert day from one-based to zero-based (internal). This may - * cause the day part to be negative, which is OK. - */ - d -= 1.0; - } - } else { - /* All components default to 0 except day-of-month which defaults - * to 1. However, because our internal day-of-month is zero-based, - * it also defaults to zero here. - */ - d = 0.0; - } - dparts[idx] = d; - } - - DUK_DDD(DUK_DDDPRINT("parts from args -> %lf %lf %lf %lf %lf %lf %lf %lf", - (double) dparts[0], (double) dparts[1], - (double) dparts[2], (double) dparts[3], - (double) dparts[4], (double) dparts[5], - (double) dparts[6], (double) dparts[7])); -} - -/* - * Indirect magic value lookup for Date methods. - * - * Date methods don't put their control flags into the function magic value - * because they wouldn't fit into a LIGHTFUNC's magic field. Instead, the - * magic value is set to an index pointing to the array of control flags - * below. - * - * This must be kept in strict sync with genbuiltins.py! - */ - -static duk_uint16_t duk__date_magics[] = { - /* 0: toString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, - - /* 1: toDateString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_LOCALTIME, - - /* 2: toTimeString */ - DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, - - /* 3: toLocaleString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, - - /* 4: toLocaleDateString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, - - /* 5: toLocaleTimeString */ - DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, - - /* 6: toUTCString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME, - - /* 7: toISOString */ - DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_NAN_TO_RANGE_ERROR + DUK_DATE_FLAG_SEP_T, - - /* 8: getFullYear */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 9: getUTCFullYear */ - 0 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 10: getMonth */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 11: getUTCMonth */ - 0 + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 12: getDate */ - DUK_DATE_FLAG_ONEBASED + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 13: getUTCDate */ - DUK_DATE_FLAG_ONEBASED + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 14: getDay */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 15: getUTCDay */ - 0 + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 16: getHours */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 17: getUTCHours */ - 0 + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 18: getMinutes */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 19: getUTCMinutes */ - 0 + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 20: getSeconds */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 21: getUTCSeconds */ - 0 + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 22: getMilliseconds */ - DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 23: getUTCMilliseconds */ - 0 + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 24: setMilliseconds */ - DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 25: setUTCMilliseconds */ - DUK_DATE_FLAG_TIMESETTER + (1 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 26: setSeconds */ - DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 27: setUTCSeconds */ - DUK_DATE_FLAG_TIMESETTER + (2 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 28: setMinutes */ - DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 29: setUTCMinutes */ - DUK_DATE_FLAG_TIMESETTER + (3 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 30: setHours */ - DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (4 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 31: setUTCHours */ - DUK_DATE_FLAG_TIMESETTER + (4 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 32: setDate */ - DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 33: setUTCDate */ - 0 + (1 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 34: setMonth */ - DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 35: setUTCMonth */ - 0 + (2 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 36: setFullYear */ - DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 37: setUTCFullYear */ - DUK_DATE_FLAG_NAN_TO_ZERO + (3 << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 38: getYear */ - DUK_DATE_FLAG_LOCALTIME + DUK_DATE_FLAG_SUB1900 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), - - /* 39: setYear */ - DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_YEAR_FIXUP + (3 << DUK_DATE_FLAG_VALUE_SHIFT), -}; - -DUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_hthread *thr) { - duk_small_uint_t magicidx = (duk_small_uint_t) duk_get_current_magic(thr); - DUK_ASSERT(magicidx < (duk_small_int_t) (sizeof(duk__date_magics) / sizeof(duk_uint16_t))); - return (duk_small_uint_t) duk__date_magics[magicidx]; -} - -#if defined(DUK_USE_DATE_BUILTIN) -/* - * Constructor calls - */ - -DUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_hthread *thr) { - duk_idx_t nargs = duk_get_top(thr); - duk_bool_t is_cons = duk_is_constructor_call(thr); - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t d; - - DUK_DDD(DUK_DDDPRINT("Date constructor, nargs=%ld, is_cons=%ld", (long) nargs, (long) is_cons)); - - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATE), - DUK_BIDX_DATE_PROTOTYPE); - - /* Unlike most built-ins, the internal [[PrimitiveValue]] of a Date - * is mutable. - */ - - if (nargs == 0 || !is_cons) { - d = duk__timeclip(duk_time_get_ecmascript_time_nofrac(thr)); - duk_push_number(thr, d); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); - if (!is_cons) { - /* called as a normal function: return new Date().toString() */ - duk_to_string(thr, -1); - } - return 1; - } else if (nargs == 1) { - const char *str; - duk_to_primitive(thr, 0, DUK_HINT_NONE); - str = duk_get_string_notsymbol(thr, 0); - if (str) { - duk__parse_string(thr, str); - duk_replace(thr, 0); /* may be NaN */ - } - d = duk__timeclip(duk_to_number(thr, 0)); /* symbols fail here */ - duk_push_number(thr, d); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); - return 1; - } - - duk__set_parts_from_args(thr, dparts, nargs); - - /* Parts are in local time, convert when setting. */ - - (void) duk__set_this_timeval_from_dparts(thr, dparts, DUK_DATE_FLAG_LOCALTIME /*flags*/); /* -> [ ... this timeval ] */ - duk_pop(thr); /* -> [ ... this ] */ - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_hthread *thr) { - return duk__parse_string(thr, duk_to_string(thr, 0)); -} - -DUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_hthread *thr) { - duk_idx_t nargs = duk_get_top(thr); - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t d; - - /* Behavior for nargs < 2 is implementation dependent: currently we'll - * set a NaN time value (matching V8 behavior) in this case. - */ - - if (nargs < 2) { - duk_push_nan(thr); - } else { - duk__set_parts_from_args(thr, dparts, nargs); - d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); - duk_push_number(thr, d); - } - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_hthread *thr) { - duk_double_t d; - - d = duk_time_get_ecmascript_time_nofrac(thr); - DUK_ASSERT(duk__timeclip(d) == d); /* TimeClip() should never be necessary */ - duk_push_number(thr, d); - return 1; -} - -/* - * String/JSON conversions - * - * Human readable conversions are now basically ISO 8601 with a space - * (instead of 'T') as the date/time separator. This is a good baseline - * and is platform independent. - * - * A shared native helper to provide many conversions. Magic value contains - * a set of flags. The helper provides: - * - * toString() - * toDateString() - * toTimeString() - * toLocaleString() - * toLocaleDateString() - * toLocaleTimeString() - * toUTCString() - * toISOString() - * - * Notes: - * - * - Date.prototype.toGMTString() and Date.prototype.toUTCString() are - * required to be the same Ecmascript function object (!), so it is - * omitted from here. - * - * - Date.prototype.toUTCString(): E5.1 specification does not require a - * specific format, but result should be human readable. The - * specification suggests using ISO 8601 format with a space (instead - * of 'T') separator if a more human readable format is not available. - * - * - Date.prototype.toISOString(): unlike other conversion functions, - * toISOString() requires a RangeError for invalid date values. - */ - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_hthread *thr) { - duk_small_uint_t flags = duk__date_get_indirect_magic(thr); - return duk__to_string_helper(thr, flags); -} - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_hthread *thr) { - /* This native function is also used for Date.prototype.getTime() - * as their behavior is identical. - */ - - duk_double_t d = duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ this ] */ - DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); - duk_push_number(thr, d); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_hthread *thr) { - /* Note: toJSON() is a generic function which works even if 'this' - * is not a Date. The sole argument is ignored. - */ - - duk_push_this(thr); - duk_to_object(thr, -1); - - duk_dup_top(thr); - duk_to_primitive(thr, -1, DUK_HINT_NUMBER); - if (duk_is_number(thr, -1)) { - duk_double_t d = duk_get_number(thr, -1); - if (!DUK_ISFINITE(d)) { - duk_push_null(thr); - return 1; - } - } - duk_pop(thr); - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_ISO_STRING); - duk_dup_m2(thr); /* -> [ O toIsoString O ] */ - duk_call_method(thr, 0); - return 1; -} - -/* - * Getters. - * - * Implementing getters is quite easy. The internal time value is either - * NaN, or represents milliseconds (without fractions) from Jan 1, 1970. - * The internal time value can be converted to integer parts, and each - * part will be normalized and will fit into a 32-bit signed integer. - * - * A shared native helper to provide all getters. Magic value contains - * a set of flags and also packs the date component index argument. The - * helper provides: - * - * getFullYear() - * getUTCFullYear() - * getMonth() - * getUTCMonth() - * getDate() - * getUTCDate() - * getDay() - * getUTCDay() - * getHours() - * getUTCHours() - * getMinutes() - * getUTCMinutes() - * getSeconds() - * getUTCSeconds() - * getMilliseconds() - * getUTCMilliseconds() - * getYear() - * - * Notes: - * - * - Date.prototype.getDate(): 'date' means day-of-month, and is - * zero-based in internal calculations but public API expects it to - * be one-based. - * - * - Date.prototype.getTime() and Date.prototype.valueOf() have identical - * behavior. They have separate function objects, but share the same C - * function (duk_bi_date_prototype_value_of). - */ - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_hthread *thr) { - duk_small_uint_t flags_and_idx = duk__date_get_indirect_magic(thr); - return duk__get_part_helper(thr, flags_and_idx); -} - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_hthread *thr) { - /* - * Return (t - LocalTime(t)) in minutes: - * - * t - LocalTime(t) = t - (t + LocalTZA + DaylightSavingTA(t)) - * = -(LocalTZA + DaylightSavingTA(t)) - * - * where DaylightSavingTA() is checked for time 't'. - * - * Note that the sign of the result is opposite to common usage, - * e.g. for EE(S)T which normally is +2h or +3h from UTC, this - * function returns -120 or -180. - * - */ - - duk_double_t d; - duk_int_t tzoffset; - - /* Note: DST adjustment is determined using UTC time. */ - d = duk__push_this_get_timeval(thr, 0 /*flags*/); - DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); - if (DUK_ISNAN(d)) { - duk_push_nan(thr); - } else { - DUK_ASSERT(DUK_ISFINITE(d)); - tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); - duk_push_int(thr, -tzoffset / 60); - } - return 1; -} - -/* - * Setters. - * - * Setters are a bit more complicated than getters. Component setters - * break down the current time value into its (normalized) component - * parts, replace one or more components with -unnormalized- new values, - * and the components are then converted back into a time value. As an - * example of using unnormalized values: - * - * var d = new Date(1234567890); - * - * is equivalent to: - * - * var d = new Date(0); - * d.setUTCMilliseconds(1234567890); - * - * A shared native helper to provide almost all setters. Magic value - * contains a set of flags and also packs the "maxnargs" argument. The - * helper provides: - * - * setMilliseconds() - * setUTCMilliseconds() - * setSeconds() - * setUTCSeconds() - * setMinutes() - * setUTCMinutes() - * setHours() - * setUTCHours() - * setDate() - * setUTCDate() - * setMonth() - * setUTCMonth() - * setFullYear() - * setUTCFullYear() - * setYear() - * - * Notes: - * - * - Date.prototype.setYear() (Section B addition): special year check - * is omitted. NaN / Infinity will just flow through and ultimately - * result in a NaN internal time value. - * - * - Date.prototype.setYear() does not have optional arguments for - * setting month and day-in-month (like setFullYear()), but we indicate - * 'maxnargs' to be 3 to get the year written to the correct component - * index in duk__set_part_helper(). The function has nargs == 1, so only - * the year will be set regardless of actual argument count. - */ - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_hthread *thr) { - duk_small_uint_t flags_and_maxnargs = duk__date_get_indirect_magic(thr); - return duk__set_part_helper(thr, flags_and_maxnargs); -} - -DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_hthread *thr) { - duk_double_t d; - - (void) duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ timeval this ] */ - d = duk__timeclip(duk_to_number(thr, 0)); - duk_push_number(thr, d); - duk_dup_top(thr); - duk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); /* -> [ timeval this timeval ] */ - - return 1; -} - -#endif /* DUK_USE_DATE_BUILTIN */ - -/* automatic undefs */ -#undef DUK__CF_ACCEPT -#undef DUK__CF_ACCEPT_NUL -#undef DUK__CF_NEG -#undef DUK__DPRINT_DPARTS -#undef DUK__DPRINT_PARTS -#undef DUK__DPRINT_PARTS_AND_DPARTS -#undef DUK__LOCAL_TZOFFSET_MAXITER -#undef DUK__NUM_ISO8601_PARSER_PARTS -#undef DUK__PACK_RULE -#undef DUK__PI_DAY -#undef DUK__PI_HOUR -#undef DUK__PI_MILLISECOND -#undef DUK__PI_MINUTE -#undef DUK__PI_MONTH -#undef DUK__PI_SECOND -#undef DUK__PI_TZHOUR -#undef DUK__PI_TZMINUTE -#undef DUK__PI_YEAR -#undef DUK__PM_DAY -#undef DUK__PM_HOUR -#undef DUK__PM_MILLISECOND -#undef DUK__PM_MINUTE -#undef DUK__PM_MONTH -#undef DUK__PM_SECOND -#undef DUK__PM_TZHOUR -#undef DUK__PM_TZMINUTE -#undef DUK__PM_YEAR -#undef DUK__RULE_MASK_PART_SEP -#undef DUK__SI_COLON -#undef DUK__SI_MINUS -#undef DUK__SI_NUL -#undef DUK__SI_PERIOD -#undef DUK__SI_PLUS -#undef DUK__SI_SPACE -#undef DUK__SI_T -#undef DUK__SI_Z -#undef DUK__SM_COLON -#undef DUK__SM_MINUS -#undef DUK__SM_NUL -#undef DUK__SM_PERIOD -#undef DUK__SM_PLUS -#undef DUK__SM_SPACE -#undef DUK__SM_T -#undef DUK__SM_Z -#undef DUK__UNPACK_RULE -#undef DUK__WEEKDAY_MOD_ADDER -#undef DUK__YEAR -#line 1 "duk_bi_date_unix.c" -/* - * Unix-like Date providers - * - * Generally useful Unix / POSIX / ANSI Date providers. - */ - -/* #include duk_internal.h -> already included */ - -/* The necessary #includes are in place in duk_config.h. */ - -/* Buffer sizes for some UNIX calls. Larger than strictly necessary - * to avoid Valgrind errors. - */ -#define DUK__STRPTIME_BUF_SIZE 64 -#define DUK__STRFTIME_BUF_SIZE 64 - -#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) -/* Get current Ecmascript time (= UNIX/Posix time, but in milliseconds). */ -DUK_INTERNAL duk_double_t duk_bi_date_get_now_gettimeofday(void) { - struct timeval tv; - duk_double_t d; - - if (gettimeofday(&tv, NULL) != 0) { - DUK_D(DUK_DPRINT("gettimeofday() failed")); - return 0.0; - } - - /* As of Duktape 2.2.0 allow fractions. */ - d = ((duk_double_t) tv.tv_sec) * 1000.0 + - ((duk_double_t) tv.tv_usec) / 1000.0; - - return d; -} -#endif /* DUK_USE_DATE_NOW_GETTIMEOFDAY */ - -#if defined(DUK_USE_DATE_NOW_TIME) -/* Not a very good provider: only full seconds are available. */ -DUK_INTERNAL duk_double_t duk_bi_date_get_now_time(void) { - time_t t; - - t = time(NULL); - if (t == (time_t) -1) { - DUK_D(DUK_DPRINT("time() failed")); - return 0.0; - } - return ((duk_double_t) t) * 1000.0; -} -#endif /* DUK_USE_DATE_NOW_TIME */ - -#if defined(DUK_USE_DATE_TZO_GMTIME) || defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) -/* Get local time offset (in seconds) for a certain (UTC) instant 'd'. */ -DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d) { - time_t t, t1, t2; - duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; - duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; - struct tm tms[2]; -#if defined(DUK_USE_DATE_TZO_GMTIME) - struct tm *tm_ptr; -#endif - - /* For NaN/inf, the return value doesn't matter. */ - if (!DUK_ISFINITE(d)) { - return 0; - } - - /* If not within Ecmascript range, some integer time calculations - * won't work correctly (and some asserts will fail), so bail out - * if so. This fixes test-bug-date-insane-setyear.js. There is - * a +/- 24h leeway in this range check to avoid a test262 corner - * case documented in test-bug-date-timeval-edges.js. - */ - if (!duk_bi_date_timeval_in_leeway_range(d)) { - DUK_DD(DUK_DDPRINT("timeval not within valid range, skip tzoffset computation to avoid integer overflows")); - return 0; - } - - /* - * This is a bit tricky to implement portably. The result depends - * on the timestamp (specifically, DST depends on the timestamp). - * If e.g. UNIX APIs are used, they'll have portability issues with - * very small and very large years. - * - * Current approach: - * - * - Stay within portable UNIX limits by using equivalent year mapping. - * Avoid year 1970 and 2038 as some conversions start to fail, at - * least on some platforms. Avoiding 1970 means that there are - * currently DST discrepancies for 1970. - * - * - Create a UTC and local time breakdowns from 't'. Then create - * a time_t using gmtime() and localtime() and compute the time - * difference between the two. - * - * Equivalent year mapping (E5 Section 15.9.1.8): - * - * If the host environment provides functionality for determining - * daylight saving time, the implementation of ECMAScript is free - * to map the year in question to an equivalent year (same - * leap-year-ness and same starting week day for the year) for which - * the host environment provides daylight saving time information. - * The only restriction is that all equivalent years should produce - * the same result. - * - * This approach is quite reasonable but not entirely correct, e.g. - * the specification also states (E5 Section 15.9.1.8): - * - * The implementation of ECMAScript should not try to determine - * whether the exact time was subject to daylight saving time, but - * just whether daylight saving time would have been in effect if - * the _current daylight saving time algorithm_ had been used at the - * time. This avoids complications such as taking into account the - * years that the locale observed daylight saving time year round. - * - * Since we rely on the platform APIs for conversions between local - * time and UTC, we can't guarantee the above. Rather, if the platform - * has historical DST rules they will be applied. This seems to be the - * general preferred direction in Ecmascript standardization (or at least - * implementations) anyway, and even the equivalent year mapping should - * be disabled if the platform is known to handle DST properly for the - * full Ecmascript range. - * - * The following has useful discussion and links: - * - * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 - */ - - duk_bi_date_timeval_to_parts(d, parts, dparts, DUK_DATE_FLAG_EQUIVYEAR /*flags*/); - DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= 1970 && parts[DUK_DATE_IDX_YEAR] <= 2038); - - d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); - DUK_ASSERT(d >= 0 && d < 2147483648.0 * 1000.0); /* unsigned 31-bit range */ - t = (time_t) (d / 1000.0); - DUK_DDD(DUK_DDDPRINT("timeval: %lf -> time_t %ld", (double) d, (long) t)); - - DUK_MEMZERO((void *) tms, sizeof(struct tm) * 2); - -#if defined(DUK_USE_DATE_TZO_GMTIME_R) - (void) gmtime_r(&t, &tms[0]); - (void) localtime_r(&t, &tms[1]); -#elif defined(DUK_USE_DATE_TZO_GMTIME_S) - (void) gmtime_s(&t, &tms[0]); - (void) localtime_s(&t, &tms[1]); -#elif defined(DUK_USE_DATE_TZO_GMTIME) - tm_ptr = gmtime(&t); - DUK_MEMCPY((void *) &tms[0], tm_ptr, sizeof(struct tm)); - tm_ptr = localtime(&t); - DUK_MEMCPY((void *) &tms[1], tm_ptr, sizeof(struct tm)); -#else -#error internal error -#endif - DUK_DDD(DUK_DDDPRINT("gmtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," - "wday:%ld,yday:%ld,isdst:%ld}", - (long) tms[0].tm_sec, (long) tms[0].tm_min, (long) tms[0].tm_hour, - (long) tms[0].tm_mday, (long) tms[0].tm_mon, (long) tms[0].tm_year, - (long) tms[0].tm_wday, (long) tms[0].tm_yday, (long) tms[0].tm_isdst)); - DUK_DDD(DUK_DDDPRINT("localtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," - "wday:%ld,yday:%ld,isdst:%ld}", - (long) tms[1].tm_sec, (long) tms[1].tm_min, (long) tms[1].tm_hour, - (long) tms[1].tm_mday, (long) tms[1].tm_mon, (long) tms[1].tm_year, - (long) tms[1].tm_wday, (long) tms[1].tm_yday, (long) tms[1].tm_isdst)); - - /* tm_isdst is both an input and an output to mktime(), use 0 to - * avoid DST handling in mktime(): - * - https://github.com/svaarala/duktape/issues/406 - * - http://stackoverflow.com/questions/8558919/mktime-and-tm-isdst - */ - tms[0].tm_isdst = 0; - tms[1].tm_isdst = 0; - t1 = mktime(&tms[0]); /* UTC */ - t2 = mktime(&tms[1]); /* local */ - if (t1 == (time_t) -1 || t2 == (time_t) -1) { - /* This check used to be for (t < 0) but on some platforms - * time_t is unsigned and apparently the proper way to detect - * an mktime() error return is the cast above. See e.g.: - * http://pubs.opengroup.org/onlinepubs/009695299/functions/mktime.html - */ - goto mktime_error; - } - DUK_DDD(DUK_DDDPRINT("t1=%ld (utc), t2=%ld (local)", (long) t1, (long) t2)); - - /* Compute final offset in seconds, positive if local time ahead of - * UTC (returned value is UTC-to-local offset). - * - * difftime() returns a double, so coercion to int generates quite - * a lot of code. Direct subtraction is not portable, however. - * XXX: allow direct subtraction on known platforms. - */ -#if 0 - return (duk_int_t) (t2 - t1); -#endif - return (duk_int_t) difftime(t2, t1); - - mktime_error: - /* XXX: return something more useful, so that caller can throw? */ - DUK_D(DUK_DPRINT("mktime() failed, d=%lf", (double) d)); - return 0; -} -#endif /* DUK_USE_DATE_TZO_GMTIME */ - -#if defined(DUK_USE_DATE_PRS_STRPTIME) -DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str) { - struct tm tm; - time_t t; - char buf[DUK__STRPTIME_BUF_SIZE]; - - /* Copy to buffer with slack to avoid Valgrind gripes from strptime. */ - DUK_ASSERT(str != NULL); - DUK_MEMZERO(buf, sizeof(buf)); /* valgrind whine without this */ - DUK_SNPRINTF(buf, sizeof(buf), "%s", (const char *) str); - buf[sizeof(buf) - 1] = (char) 0; - - DUK_DDD(DUK_DDDPRINT("parsing: '%s'", (const char *) buf)); - - DUK_MEMZERO(&tm, sizeof(tm)); - if (strptime((const char *) buf, "%c", &tm) != NULL) { - DUK_DDD(DUK_DDDPRINT("before mktime: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," - "wday:%ld,yday:%ld,isdst:%ld}", - (long) tm.tm_sec, (long) tm.tm_min, (long) tm.tm_hour, - (long) tm.tm_mday, (long) tm.tm_mon, (long) tm.tm_year, - (long) tm.tm_wday, (long) tm.tm_yday, (long) tm.tm_isdst)); - tm.tm_isdst = -1; /* negative: dst info not available */ - - t = mktime(&tm); - DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); - if (t >= 0) { - duk_push_number(thr, ((duk_double_t) t) * 1000.0); - return 1; - } - } - - return 0; -} -#endif /* DUK_USE_DATE_PRS_STRPTIME */ - -#if defined(DUK_USE_DATE_PRS_GETDATE) -DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str) { - struct tm tm; - duk_small_int_t rc; - time_t t; - - /* For this to work, DATEMSK must be set, so this is not very - * convenient for an embeddable interpreter. - */ - - DUK_MEMZERO(&tm, sizeof(struct tm)); - rc = (duk_small_int_t) getdate_r(str, &tm); - DUK_DDD(DUK_DDDPRINT("getdate_r() -> %ld", (long) rc)); - - if (rc == 0) { - t = mktime(&tm); - DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); - if (t >= 0) { - duk_push_number(thr, (duk_double_t) t); - return 1; - } - } - - return 0; -} -#endif /* DUK_USE_DATE_PRS_GETDATE */ - -#if defined(DUK_USE_DATE_FMT_STRFTIME) -DUK_INTERNAL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags) { - char buf[DUK__STRFTIME_BUF_SIZE]; - struct tm tm; - const char *fmt; - - DUK_UNREF(tzoffset); - - /* If the platform doesn't support the entire Ecmascript range, we need - * to return 0 so that the caller can fall back to the default formatter. - * - * For now, assume that if time_t is 8 bytes or more, the whole Ecmascript - * range is supported. For smaller time_t values (4 bytes in practice), - * assumes that the signed 32-bit range is supported. - * - * XXX: detect this more correctly per platform. The size of time_t is - * probably not an accurate guarantee of strftime() supporting or not - * supporting a large time range (the full Ecmascript range). - */ - if (sizeof(time_t) < 8 && - (parts[DUK_DATE_IDX_YEAR] < 1970 || parts[DUK_DATE_IDX_YEAR] > 2037)) { - /* be paranoid for 32-bit time values (even avoiding negative ones) */ - return 0; - } - - DUK_MEMZERO(&tm, sizeof(tm)); - tm.tm_sec = parts[DUK_DATE_IDX_SECOND]; - tm.tm_min = parts[DUK_DATE_IDX_MINUTE]; - tm.tm_hour = parts[DUK_DATE_IDX_HOUR]; - tm.tm_mday = parts[DUK_DATE_IDX_DAY]; /* already one-based */ - tm.tm_mon = parts[DUK_DATE_IDX_MONTH] - 1; /* one-based -> zero-based */ - tm.tm_year = parts[DUK_DATE_IDX_YEAR] - 1900; - tm.tm_wday = parts[DUK_DATE_IDX_WEEKDAY]; - tm.tm_isdst = 0; - - DUK_MEMZERO(buf, sizeof(buf)); - if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { - fmt = "%c"; - } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { - fmt = "%x"; - } else { - DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); - fmt = "%X"; - } - (void) strftime(buf, sizeof(buf) - 1, fmt, &tm); - DUK_ASSERT(buf[sizeof(buf) - 1] == 0); - - duk_push_string(thr, buf); - return 1; -} -#endif /* DUK_USE_DATE_FMT_STRFTIME */ - -#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME) -DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void) { - struct timespec ts; - - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { - return (duk_double_t) ts.tv_sec * 1000.0 + (duk_double_t) ts.tv_nsec / 1000000.0; - } else { - DUK_D(DUK_DPRINT("clock_gettime(CLOCK_MONOTONIC) failed")); - return 0.0; - } -} -#endif - -/* automatic undefs */ -#undef DUK__STRFTIME_BUF_SIZE -#undef DUK__STRPTIME_BUF_SIZE -#line 1 "duk_bi_date_windows.c" -/* - * Windows Date providers - * - * Platform specific links: - * - * - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx - */ - -/* #include duk_internal.h -> already included */ - -/* The necessary #includes are in place in duk_config.h. */ - -#if defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) -/* Shared Windows helpers. */ -DUK_LOCAL void duk__convert_systime_to_ularge(const SYSTEMTIME *st, ULARGE_INTEGER *res) { - FILETIME ft; - if (SystemTimeToFileTime(st, &ft) == 0) { - DUK_D(DUK_DPRINT("SystemTimeToFileTime() failed, returning 0")); - res->QuadPart = 0; - } else { - res->LowPart = ft.dwLowDateTime; - res->HighPart = ft.dwHighDateTime; - } -} - -DUK_LOCAL void duk__convert_filetime_to_ularge(const FILETIME *ft, ULARGE_INTEGER *res) { - res->LowPart = ft->dwLowDateTime; - res->HighPart = ft->dwHighDateTime; -} - -DUK_LOCAL void duk__set_systime_jan1970(SYSTEMTIME *st) { - DUK_MEMZERO((void *) st, sizeof(*st)); - st->wYear = 1970; - st->wMonth = 1; - st->wDayOfWeek = 4; /* not sure whether or not needed; Thursday */ - st->wDay = 1; - DUK_ASSERT(st->wHour == 0); - DUK_ASSERT(st->wMinute == 0); - DUK_ASSERT(st->wSecond == 0); - DUK_ASSERT(st->wMilliseconds == 0); -} -#endif /* defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) */ - -#if defined(DUK_USE_DATE_NOW_WINDOWS) -DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows(void) { - /* Suggested step-by-step method from documentation of RtlTimeToSecondsSince1970: - * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724928(v=vs.85).aspx - */ - SYSTEMTIME st1, st2; - ULARGE_INTEGER tmp1, tmp2; - - GetSystemTime(&st1); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); - - duk__set_systime_jan1970(&st2); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); - - /* Difference is in 100ns units, convert to milliseconds, keeping - * fractions since Duktape 2.2.0. This is only theoretical because - * SYSTEMTIME is limited to milliseconds. - */ - return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0; -} -#endif /* DUK_USE_DATE_NOW_WINDOWS */ - -#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) -DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows_subms(void) { - /* Variant of the basic algorithm using GetSystemTimePreciseAsFileTime() - * for more accuracy. - */ - FILETIME ft1; - SYSTEMTIME st2; - ULARGE_INTEGER tmp1, tmp2; - - GetSystemTimePreciseAsFileTime(&ft1); - duk__convert_filetime_to_ularge((const FILETIME *) &ft1, &tmp1); - - duk__set_systime_jan1970(&st2); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); - - /* Difference is in 100ns units, convert to milliseconds, keeping - * fractions since Duktape 2.2.0. - */ - return (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0; -} -#endif /* DUK_USE_DATE_NOW_WINDOWS */ - -#if defined(DUK_USE_DATE_TZO_WINDOWS) -DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d) { - SYSTEMTIME st1; - SYSTEMTIME st2; - SYSTEMTIME st3; - ULARGE_INTEGER tmp1; - ULARGE_INTEGER tmp2; - ULARGE_INTEGER tmp3; - FILETIME ft1; - - /* XXX: handling of timestamps outside Windows supported range. - * How does Windows deal with dates before 1600? Does windows - * support all Ecmascript years (like -200000 and +200000)? - * Should equivalent year mapping be used here too? If so, use - * a shared helper (currently integrated into timeval-to-parts). - */ - - /* Use the approach described in "Remarks" of FileTimeToLocalFileTime: - * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724277(v=vs.85).aspx - */ - - duk__set_systime_jan1970(&st1); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); - tmp2.QuadPart = (ULONGLONG) (d * 10000.0); /* millisec -> 100ns units since jan 1, 1970 */ - tmp2.QuadPart += tmp1.QuadPart; /* input 'd' in Windows UTC, 100ns units */ - - ft1.dwLowDateTime = tmp2.LowPart; - ft1.dwHighDateTime = tmp2.HighPart; - FileTimeToSystemTime((const FILETIME *) &ft1, &st2); - if (SystemTimeToTzSpecificLocalTime((LPTIME_ZONE_INFORMATION) NULL, &st2, &st3) == 0) { - DUK_D(DUK_DPRINT("SystemTimeToTzSpecificLocalTime() failed, return tzoffset 0")); - return 0; - } - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st3, &tmp3); - - /* Positive if local time ahead of UTC. */ - return (duk_int_t) (((LONGLONG) tmp3.QuadPart - (LONGLONG) tmp2.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */ -} -#endif /* DUK_USE_DATE_TZO_WINDOWS */ - -#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST) -DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d) { - SYSTEMTIME st1; - SYSTEMTIME st2; - FILETIME ft1; - FILETIME ft2; - ULARGE_INTEGER tmp1; - ULARGE_INTEGER tmp2; - - /* Do a similar computation to duk_bi_date_get_local_tzoffset_windows - * but without accounting for daylight savings time. Use this on - * Windows platforms (like Durango) that don't support the - * SystemTimeToTzSpecificLocalTime() call. - */ - - /* current time not needed for this computation */ - DUK_UNREF(d); - - duk__set_systime_jan1970(&st1); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); - - ft1.dwLowDateTime = tmp1.LowPart; - ft1.dwHighDateTime = tmp1.HighPart; - FileTimeToLocalFileTime((const FILETIME *) &ft1, &ft2); - - FileTimeToSystemTime((const FILETIME *) &ft2, &st2); - duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); - - return (duk_int_t) (((LONGLONG) tmp2.QuadPart - (LONGLONG) tmp1.QuadPart) / DUK_I64_CONSTANT(10000000)); /* seconds */ -} -#endif /* DUK_USE_DATE_TZO_WINDOWS_NO_DST */ - -#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) -DUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void) { - LARGE_INTEGER count, freq; - - /* There are legacy issues with QueryPerformanceCounter(): - * - Potential jumps: https://support.microsoft.com/en-us/help/274323/performance-counter-value-may-unexpectedly-leap-forward - * - Differences between cores (XP): https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions - * - * We avoid these by enabling QPC by default only for Vista or later. - */ - - if (QueryPerformanceCounter(&count) && QueryPerformanceFrequency(&freq)) { - /* XXX: QueryPerformanceFrequency() can be cached */ - return (duk_double_t) count.QuadPart / (duk_double_t) freq.QuadPart * 1000.0; - } else { - /* MSDN: "On systems that run Windows XP or later, the function - * will always succeed and will thus never return zero." - * Provide minimal error path just in case user enables this - * feature in pre-XP Windows. - */ - return 0.0; - } -} -#endif /* DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC */ -#line 1 "duk_bi_duktape.c" -/* - * Duktape built-ins - * - * Size optimization note: it might seem that vararg multipurpose functions - * like fin(), enc(), and dec() are not very size optimal, but using a single - * user-visible Ecmascript function saves a lot of run-time footprint; each - * Function instance takes >100 bytes. Using a shared native helper and a - * 'magic' value won't save much if there are multiple Function instances - * anyway. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_DUKTAPE_BUILTIN) - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_info(duk_hthread *thr) { - duk_inspect_value(thr, -1); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_act(duk_hthread *thr) { - duk_int_t level; - - level = duk_to_int(thr, 0); - duk_inspect_callstack_entry(thr, level); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_gc(duk_hthread *thr) { - duk_small_uint_t flags; - - flags = (duk_small_uint_t) duk_get_uint(thr, 0); - duk_heap_mark_and_sweep(thr->heap, flags); - - /* XXX: Not sure what the best return value would be in the API. - * Return true for now. - */ - duk_push_true(thr); - return 1; -} - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_fin(duk_hthread *thr) { - (void) duk_require_hobject(thr, 0); - if (duk_get_top(thr) >= 2) { - /* Set: currently a finalizer is disabled by setting it to - * undefined; this does not remove the property at the moment. - * The value could be type checked to be either a function - * or something else; if something else, the property could - * be deleted. Must use duk_set_finalizer() to keep - * DUK_HOBJECT_FLAG_HAVE_FINALIZER in sync. - */ - duk_set_top(thr, 2); - duk_set_finalizer(thr, 0); - return 0; - } else { - /* Get. */ - DUK_ASSERT(duk_get_top(thr) == 1); - duk_get_finalizer(thr, 0); - return 1; - } -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_enc(duk_hthread *thr) { - duk_hstring *h_str; - - /* Vararg function: must be careful to check/require arguments. - * The JSON helpers accept invalid indices and treat them like - * non-existent optional parameters. - */ - - h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons. */ - duk_require_valid_index(thr, 1); - - if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { - duk_set_top(thr, 2); - duk_hex_encode(thr, 1); - DUK_ASSERT_TOP(thr, 2); - } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { - duk_set_top(thr, 2); - duk_base64_encode(thr, 1); - DUK_ASSERT_TOP(thr, 2); -#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX) - } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { - duk_bi_json_stringify_helper(thr, - 1 /*idx_value*/, - 2 /*idx_replacer*/, - 3 /*idx_space*/, - DUK_JSON_FLAG_EXT_CUSTOM | - DUK_JSON_FLAG_ASCII_ONLY | - DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); -#endif -#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC) - } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { - duk_bi_json_stringify_helper(thr, - 1 /*idx_value*/, - 2 /*idx_replacer*/, - 3 /*idx_space*/, - DUK_JSON_FLAG_EXT_COMPATIBLE | - DUK_JSON_FLAG_ASCII_ONLY /*flags*/); -#endif - } else { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_dec(duk_hthread *thr) { - duk_hstring *h_str; - - /* Vararg function: must be careful to check/require arguments. - * The JSON helpers accept invalid indices and treat them like - * non-existent optional parameters. - */ - - h_str = duk_require_hstring(thr, 0); /* Could reject symbols, but no point: won't match comparisons */ - duk_require_valid_index(thr, 1); - - if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { - duk_set_top(thr, 2); - duk_hex_decode(thr, 1); - DUK_ASSERT_TOP(thr, 2); - } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { - duk_set_top(thr, 2); - duk_base64_decode(thr, 1); - DUK_ASSERT_TOP(thr, 2); -#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX) - } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { - duk_bi_json_parse_helper(thr, - 1 /*idx_value*/, - 2 /*idx_replacer*/, - DUK_JSON_FLAG_EXT_CUSTOM /*flags*/); -#endif -#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC) - } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { - duk_bi_json_parse_helper(thr, - 1 /*idx_value*/, - 2 /*idx_replacer*/, - DUK_JSON_FLAG_EXT_COMPATIBLE /*flags*/); -#endif - } else { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - return 1; -} - -/* - * Compact an object - */ - -DUK_INTERNAL duk_ret_t duk_bi_duktape_object_compact(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 1); - duk_compact(thr, 0); - return 1; /* return the argument object */ -} - -#endif /* DUK_USE_DUKTAPE_BUILTIN */ -#line 1 "duk_bi_encoding.c" -/* - * WHATWG Encoding API built-ins - * - * API specification: https://encoding.spec.whatwg.org/#api - * Web IDL: https://www.w3.org/TR/WebIDL/ - */ - -/* #include duk_internal.h -> already included */ - -/* - * Data structures for encoding/decoding - */ - -typedef struct { - duk_uint8_t *out; /* where to write next byte(s) */ - duk_codepoint_t lead; /* lead surrogate */ -} duk__encode_context; - -typedef struct { - /* UTF-8 decoding state */ - duk_codepoint_t codepoint; /* built up incrementally */ - duk_uint8_t upper; /* max value of next byte (decode error otherwise) */ - duk_uint8_t lower; /* min value of next byte (ditto) */ - duk_uint8_t needed; /* how many more bytes we need */ - duk_uint8_t bom_handled; /* BOM seen or no longer expected */ - - /* Decoder configuration */ - duk_uint8_t fatal; - duk_uint8_t ignore_bom; -} duk__decode_context; - -/* The signed duk_codepoint_t type is used to signal a decoded codepoint - * (>= 0) or various other states using negative values. - */ -#define DUK__CP_CONTINUE (-1) /* continue to next byte, no completed codepoint */ -#define DUK__CP_ERROR (-2) /* decoding error */ -#define DUK__CP_RETRY (-3) /* decoding error; retry last byte */ - -/* - * Raw helpers for encoding/decoding - */ - -/* Emit UTF-8 (= CESU-8) encoded U+FFFD (replacement char), i.e. ef bf bd. */ -DUK_LOCAL duk_uint8_t *duk__utf8_emit_repl(duk_uint8_t *ptr) { - *ptr++ = 0xef; - *ptr++ = 0xbf; - *ptr++ = 0xbd; - return ptr; -} - -DUK_LOCAL void duk__utf8_decode_init(duk__decode_context *dec_ctx) { - /* (Re)init the decoding state of 'dec_ctx' but leave decoder - * configuration fields untouched. - */ - dec_ctx->codepoint = 0x0000L; - dec_ctx->upper = 0xbf; - dec_ctx->lower = 0x80; - dec_ctx->needed = 0; - dec_ctx->bom_handled = 0; -} - -DUK_LOCAL duk_codepoint_t duk__utf8_decode_next(duk__decode_context *dec_ctx, duk_uint8_t x) { - /* - * UTF-8 algorithm based on the Encoding specification: - * https://encoding.spec.whatwg.org/#utf-8-decoder - * - * Two main states: decoding initial byte vs. decoding continuation - * bytes. Shortest length encoding is validated by restricting the - * allowed range of first continuation byte using 'lower' and 'upper'. - */ - - if (dec_ctx->needed == 0) { - /* process initial byte */ - if (x <= 0x7f) { - /* U+0000-U+007F, 1 byte (ASCII) */ - return (duk_codepoint_t) x; - } else if (x >= 0xc2 && x <= 0xdf) { - /* U+0080-U+07FF, 2 bytes */ - dec_ctx->needed = 1; - dec_ctx->codepoint = x & 0x1f; - DUK_ASSERT(dec_ctx->lower == 0x80); - DUK_ASSERT(dec_ctx->upper == 0xbf); - return DUK__CP_CONTINUE; - } else if (x >= 0xe0 && x <= 0xef) { - /* U+0800-U+FFFF, 3 bytes */ - if (x == 0xe0) { - dec_ctx->lower = 0xa0; - DUK_ASSERT(dec_ctx->upper == 0xbf); - } else if (x == 0xed) { - DUK_ASSERT(dec_ctx->lower == 0x80); - dec_ctx->upper = 0x9f; - } - dec_ctx->needed = 2; - dec_ctx->codepoint = x & 0x0f; - return DUK__CP_CONTINUE; - } else if (x >= 0xf0 && x <= 0xf4) { - /* U+010000-U+10FFFF, 4 bytes */ - if (x == 0xf0) { - dec_ctx->lower = 0x90; - DUK_ASSERT(dec_ctx->upper == 0xbf); - } else if (x == 0xf4) { - DUK_ASSERT(dec_ctx->lower == 0x80); - dec_ctx->upper = 0x8f; - } - dec_ctx->needed = 3; - dec_ctx->codepoint = x & 0x07; - return DUK__CP_CONTINUE; - } else { - /* not a legal initial byte */ - return DUK__CP_ERROR; - } - } else { - /* process continuation byte */ - if (x >= dec_ctx->lower && x <= dec_ctx->upper) { - dec_ctx->lower = 0x80; - dec_ctx->upper = 0xbf; - dec_ctx->codepoint = (dec_ctx->codepoint << 6) | (x & 0x3f); - if (--dec_ctx->needed > 0) { - /* need more bytes */ - return DUK__CP_CONTINUE; - } else { - /* got a codepoint */ - duk_codepoint_t ret; - DUK_ASSERT(dec_ctx->codepoint <= 0x10ffffL); /* Decoding rules guarantee. */ - ret = dec_ctx->codepoint; - dec_ctx->codepoint = 0x0000L; - dec_ctx->needed = 0; - return ret; - } - } else { - /* We just encountered an illegal UTF-8 continuation byte. This might - * be the initial byte of the next character; if we return a plain - * error status and the decoder is in replacement mode, the character - * will be masked. We still need to alert the caller to the error - * though. - */ - dec_ctx->codepoint = 0x0000L; - dec_ctx->needed = 0; - dec_ctx->lower = 0x80; - dec_ctx->upper = 0xbf; - return DUK__CP_RETRY; - } - } -} - -#if defined(DUK_USE_ENCODING_BUILTINS) -DUK_LOCAL void duk__utf8_encode_char(void *udata, duk_codepoint_t codepoint) { - duk__encode_context *enc_ctx; - - DUK_ASSERT(codepoint >= 0); - enc_ctx = (duk__encode_context *) udata; - DUK_ASSERT(enc_ctx != NULL); - -#if !defined(DUK_USE_PREFER_SIZE) - if (codepoint <= 0x7f && enc_ctx->lead == 0x0000L) { - /* Fast path for ASCII. */ - *enc_ctx->out++ = (duk_uint8_t) codepoint; - return; - } -#endif - - if (DUK_UNLIKELY(codepoint > 0x10ffffL)) { - /* cannot legally encode in UTF-8 */ - codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - } else if (codepoint >= 0xd800L && codepoint <= 0xdfffL) { - if (codepoint <= 0xdbffL) { - /* high surrogate */ - duk_codepoint_t prev_lead = enc_ctx->lead; - enc_ctx->lead = codepoint; - if (prev_lead == 0x0000L) { - /* high surrogate, no output */ - return; - } else { - /* consecutive high surrogates, consider first one unpaired */ - codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - } - } else { - /* low surrogate */ - if (enc_ctx->lead != 0x0000L) { - codepoint = (duk_codepoint_t) (0x010000L + ((enc_ctx->lead - 0xd800L) << 10) + (codepoint - 0xdc00L)); - enc_ctx->lead = 0x0000L; - } else { - /* unpaired low surrogate */ - DUK_ASSERT(enc_ctx->lead == 0x0000L); - codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - } - } - } else { - if (enc_ctx->lead != 0x0000L) { - /* unpaired high surrogate: emit replacement character and the input codepoint */ - enc_ctx->lead = 0x0000L; - enc_ctx->out = duk__utf8_emit_repl(enc_ctx->out); - } - } - - /* Codepoint may be original input, a decoded surrogate pair, or may - * have been replaced with U+FFFD. - */ - enc_ctx->out += duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, enc_ctx->out); -} -#endif /* DUK_USE_ENCODING_BUILTINS */ - -/* Shared helper for buffer-to-string using a TextDecoder() compatible UTF-8 - * decoder. - */ -DUK_LOCAL duk_ret_t duk__decode_helper(duk_hthread *thr, duk__decode_context *dec_ctx) { - const duk_uint8_t *input; - duk_size_t len = 0; - duk_size_t len_tmp; - duk_bool_t stream = 0; - duk_codepoint_t codepoint; - duk_uint8_t *output; - const duk_uint8_t *in; - duk_uint8_t *out; - - DUK_ASSERT(dec_ctx != NULL); - - /* Careful with input buffer pointer: any side effects involving - * code execution (e.g. getters, coercion calls, and finalizers) - * may cause a resize and invalidate a pointer we've read. This - * is why the pointer is actually looked up at the last minute. - * Argument validation must still happen first to match WHATWG - * required side effect order. - */ - - if (duk_is_undefined(thr, 0)) { - duk_push_fixed_buffer_nozero(thr, 0); - duk_replace(thr, 0); - } - (void) duk_require_buffer_data(thr, 0, &len); /* Need 'len', avoid pointer. */ - - if (duk_check_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_NULL | - DUK_TYPE_MASK_NONE)) { - /* Use defaults, treat missing value like undefined. */ - } else { - duk_require_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_NULL | - DUK_TYPE_MASK_LIGHTFUNC | - DUK_TYPE_MASK_BUFFER | - DUK_TYPE_MASK_OBJECT); - if (duk_get_prop_string(thr, 1, "stream")) { - stream = duk_to_boolean(thr, -1); - } - } - - /* Allowance is 3*len in the general case because all bytes may potentially - * become U+FFFD. If the first byte completes a non-BMP codepoint it will - * decode to a CESU-8 surrogate pair (6 bytes) so we allow 3 extra bytes to - * compensate: (1*3)+3 = 6. Non-BMP codepoints are safe otherwise because - * the 4->6 expansion is well under the 3x allowance. - * - * XXX: As with TextEncoder, need a better buffer allocation strategy here. - */ - if (len >= (DUK_HBUFFER_MAX_BYTELEN / 3) - 3) { - DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG); - } - output = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, 3 + (3 * len)); /* used parts will be always manually written over */ - - input = (const duk_uint8_t *) duk_get_buffer_data(thr, 0, &len_tmp); - DUK_ASSERT(input != NULL || len == 0); - if (DUK_UNLIKELY(len != len_tmp)) { - /* Very unlikely but possible: source buffer was resized by - * a side effect when fixed buffer was pushed. Output buffer - * may not be large enough to hold output, so just fail if - * length has changed. - */ - DUK_D(DUK_DPRINT("input buffer resized by side effect, fail")); - goto fail_type; - } - - /* From this point onwards it's critical that no side effect occur - * which may disturb 'input': finalizer execution, property accesses, - * active coercions, etc. Even an allocation related mark-and-sweep - * may affect the pointer because it may trigger a pending finalizer. - */ - - in = input; - out = output; - while (in < input + len) { - codepoint = duk__utf8_decode_next(dec_ctx, *in++); - if (codepoint < 0) { - if (codepoint == DUK__CP_CONTINUE) { - continue; - } - - /* Decoding error with or without retry. */ - DUK_ASSERT(codepoint == DUK__CP_ERROR || codepoint == DUK__CP_RETRY); - if (codepoint == DUK__CP_RETRY) { - --in; /* retry last byte */ - } - /* replacement mode: replace with U+FFFD */ - codepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - if (dec_ctx->fatal) { - /* fatal mode: throw a TypeError */ - goto fail_type; - } - /* Continue with 'codepoint', Unicode replacement. */ - } - DUK_ASSERT(codepoint >= 0x0000L && codepoint <= 0x10ffffL); - - if (!dec_ctx->bom_handled) { - dec_ctx->bom_handled = 1; - if (codepoint == 0xfeffL && !dec_ctx->ignore_bom) { - continue; - } - } - - out += duk_unicode_encode_cesu8((duk_ucodepoint_t) codepoint, out); - DUK_ASSERT(out <= output + (3 + (3 * len))); - } - - if (!stream) { - if (dec_ctx->needed != 0) { - /* truncated sequence at end of buffer */ - if (dec_ctx->fatal) { - goto fail_type; - } else { - out += duk_unicode_encode_cesu8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, out); - DUK_ASSERT(out <= output + (3 + (3 * len))); - } - } - duk__utf8_decode_init(dec_ctx); /* Initialize decoding state for potential reuse. */ - } - - /* Output buffer is fixed and thus stable even if there had been - * side effects (which there shouldn't be). - */ - duk_push_lstring(thr, (const char *) output, (duk_size_t) (out - output)); - return 1; - - fail_type: - DUK_ERROR_TYPE(thr, DUK_STR_UTF8_DECODE_FAILED); - DUK_UNREACHABLE(); -} - -/* - * Built-in bindings - */ - -#if defined(DUK_USE_ENCODING_BUILTINS) -DUK_INTERNAL duk_ret_t duk_bi_textencoder_constructor(duk_hthread *thr) { - /* TextEncoder currently requires no persistent state, so the constructor - * does nothing on purpose. - */ - - duk_require_constructor_call(thr); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_hthread *thr) { - duk_push_string(thr, "utf-8"); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encode(duk_hthread *thr) { - duk__encode_context enc_ctx; - duk_size_t len; - duk_size_t final_len; - duk_uint8_t *output; - - DUK_ASSERT_TOP(thr, 1); - if (duk_is_undefined(thr, 0)) { - len = 0; - } else { - duk_hstring *h_input; - - h_input = duk_to_hstring(thr, 0); - DUK_ASSERT(h_input != NULL); - - len = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_input); - if (len >= DUK_HBUFFER_MAX_BYTELEN / 3) { - DUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG); - } - } - - /* Allowance is 3*len because all bytes can potentially be replaced with - * U+FFFD -- which rather inconveniently encodes to 3 bytes in UTF-8. - * Rely on dynamic buffer data pointer stability: no other code has - * access to the data pointer. - * - * XXX: The buffer allocation strategy used here is rather inefficient. - * Maybe switch to a chunk-based strategy, or preprocess the string to - * figure out the space needed ahead of time? - */ - DUK_ASSERT(3 * len >= len); - output = (duk_uint8_t *) duk_push_dynamic_buffer(thr, 3 * len); - - if (len > 0) { - DUK_ASSERT(duk_is_string(thr, 0)); /* True if len > 0. */ - - /* XXX: duk_decode_string() is used to process the input - * string. For standard Ecmascript strings, represented - * internally as CESU-8, this is fine. However, behavior - * beyond CESU-8 is not very strict: codepoints using an - * extended form of UTF-8 are also accepted, and invalid - * codepoint sequences (which are allowed in Duktape strings) - * are not handled as well as they could (e.g. invalid - * continuation bytes may mask following codepoints). - * This is how Ecmascript code would also see such strings. - * Maybe replace duk_decode_string() with an explicit strict - * CESU-8 decoder here? - */ - enc_ctx.lead = 0x0000L; - enc_ctx.out = output; - duk_decode_string(thr, 0, duk__utf8_encode_char, (void *) &enc_ctx); - if (enc_ctx.lead != 0x0000L) { - /* unpaired high surrogate at end of string */ - enc_ctx.out = duk__utf8_emit_repl(enc_ctx.out); - DUK_ASSERT(enc_ctx.out <= output + (3 * len)); - } - - /* The output buffer is usually very much oversized, so shrink it to - * actually needed size. Pointer stability assumed up to this point. - */ - DUK_ASSERT_TOP(thr, 2); - DUK_ASSERT(output == (duk_uint8_t *) duk_get_buffer_data(thr, -1, NULL)); - - final_len = (duk_size_t) (enc_ctx.out - output); - duk_resize_buffer(thr, -1, final_len); - /* 'output' and 'enc_ctx.out' are potentially invalidated by the resize. */ - } else { - final_len = 0; - } - - /* Standard WHATWG output is a Uint8Array. Here the Uint8Array will - * be backed by a dynamic buffer which differs from e.g. Uint8Arrays - * created as 'new Uint8Array(N)'. Ecmascript code won't see the - * difference but C code will. When bufferobjects are not supported, - * returns a plain dynamic buffer. - */ -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - duk_push_buffer_object(thr, -1, 0, final_len, DUK_BUFOBJ_UINT8ARRAY); -#endif - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_textdecoder_constructor(duk_hthread *thr) { - duk__decode_context *dec_ctx; - duk_bool_t fatal = 0; - duk_bool_t ignore_bom = 0; - - DUK_ASSERT_TOP(thr, 2); - duk_require_constructor_call(thr); - if (!duk_is_undefined(thr, 0)) { - /* XXX: For now ignore 'label' (encoding identifier). */ - duk_to_string(thr, 0); - } - if (!duk_is_null_or_undefined(thr, 1)) { - if (duk_get_prop_string(thr, 1, "fatal")) { - fatal = duk_to_boolean(thr, -1); - } - if (duk_get_prop_string(thr, 1, "ignoreBOM")) { - ignore_bom = duk_to_boolean(thr, -1); - } - } - - duk_push_this(thr); - - /* The decode context is not assumed to be zeroed; all fields are - * initialized explicitly. - */ - dec_ctx = (duk__decode_context *) duk_push_fixed_buffer(thr, sizeof(duk__decode_context)); - dec_ctx->fatal = (duk_uint8_t) fatal; - dec_ctx->ignore_bom = (duk_uint8_t) ignore_bom; - duk__utf8_decode_init(dec_ctx); /* Initializes remaining fields. */ - - duk_put_prop_string(thr, -2, DUK_INTERNAL_SYMBOL("Context")); - return 0; -} - -/* Get TextDecoder context from 'this'; leaves garbage on stack. */ -DUK_LOCAL duk__decode_context *duk__get_textdecoder_context(duk_hthread *thr) { - duk__decode_context *dec_ctx; - duk_push_this(thr); - duk_get_prop_string(thr, -1, DUK_INTERNAL_SYMBOL("Context")); - dec_ctx = (duk__decode_context *) duk_require_buffer(thr, -1, NULL); - DUK_ASSERT(dec_ctx != NULL); - return dec_ctx; -} - -DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_hthread *thr) { - duk__decode_context *dec_ctx; - duk_int_t magic; - - dec_ctx = duk__get_textdecoder_context(thr); - magic = duk_get_current_magic(thr); - switch (magic) { - case 0: - /* Encoding is now fixed, so _Context lookup is only needed to - * validate the 'this' binding (TypeError if not TextDecoder-like). - */ - duk_push_string(thr, "utf-8"); - break; - case 1: - duk_push_boolean(thr, dec_ctx->fatal); - break; - default: - duk_push_boolean(thr, dec_ctx->ignore_bom); - break; - } - - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_hthread *thr) { - duk__decode_context *dec_ctx; - - dec_ctx = duk__get_textdecoder_context(thr); - return duk__decode_helper(thr, dec_ctx); -} -#endif /* DUK_USE_ENCODING_BUILTINS */ - -/* - * Internal helper for Node.js Buffer - */ - -/* Internal helper used for Node.js Buffer .toString(). Value stack convention - * is currently odd: it mimics TextDecoder .decode() so that argument must be at - * index 0, and decode options (not present for Buffer) at index 1. Return value - * is a Duktape/C function return value. - */ -DUK_INTERNAL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr) { - duk__decode_context dec_ctx; - - dec_ctx.fatal = 0; /* use replacement chars */ - dec_ctx.ignore_bom = 1; /* ignore BOMs (matches Node.js Buffer .toString()) */ - duk__utf8_decode_init(&dec_ctx); - - return duk__decode_helper(thr, &dec_ctx); -} - -/* automatic undefs */ -#undef DUK__CP_CONTINUE -#undef DUK__CP_ERROR -#undef DUK__CP_RETRY -#line 1 "duk_bi_error.c" -/* - * Error built-ins - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL duk_ret_t duk_bi_error_constructor_shared(duk_hthread *thr) { - /* Behavior for constructor and non-constructor call is - * the same except for augmenting the created error. When - * called as a constructor, the caller (duk_new()) will handle - * augmentation; when called as normal function, we need to do - * it here. - */ - - duk_small_int_t bidx_prototype = duk_get_current_magic(thr); - - /* same for both error and each subclass like TypeError */ - duk_uint_t flags_and_class = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR); - - (void) duk_push_object_helper(thr, flags_and_class, bidx_prototype); - - /* If message is undefined, the own property 'message' is not set at - * all to save property space. An empty message is inherited anyway. - */ - if (!duk_is_undefined(thr, 0)) { - duk_to_string(thr, 0); - duk_dup_0(thr); /* [ message error message ] */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); - } - - /* Augment the error if called as a normal function. __FILE__ and __LINE__ - * are not desirable in this case. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) - if (!duk_is_constructor_call(thr)) { - duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE); - } -#endif - - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_to_string(duk_hthread *thr) { - /* XXX: optimize with more direct internal access */ - - duk_push_this(thr); - (void) duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - - /* [ ... this ] */ - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME); - if (duk_is_undefined(thr, -1)) { - duk_pop(thr); - duk_push_string(thr, "Error"); - } else { - duk_to_string(thr, -1); - } - - /* [ ... this name ] */ - - /* XXX: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by - * accident or are they actually needed? The first ToString() - * could conceivably return 'undefined'. - */ - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE); - if (duk_is_undefined(thr, -1)) { - duk_pop(thr); - duk_push_hstring_empty(thr); - } else { - duk_to_string(thr, -1); - } - - /* [ ... this name message ] */ - - if (duk_get_length(thr, -2) == 0) { - /* name is empty -> return message */ - return 1; - } - if (duk_get_length(thr, -1) == 0) { - /* message is empty -> return name */ - duk_pop(thr); - return 1; - } - duk_push_string(thr, ": "); - duk_insert(thr, -2); /* ... name ': ' message */ - duk_concat(thr, 3); - - return 1; -} - -#if defined(DUK_USE_TRACEBACKS) - -/* - * Traceback handling - * - * The unified helper decodes the traceback and produces various requested - * outputs. It should be optimized for size, and may leave garbage on stack, - * only the topmost return value matters. For instance, traceback separator - * and decoded strings are pushed even when looking for filename only. - * - * NOTE: although _Tracedata is an internal property, user code can currently - * write to the array (or replace it with something other than an array). - * The code below must tolerate arbitrary _Tracedata. It can throw errors - * etc, but cannot cause a segfault or memory unsafe behavior. - */ - -/* constants arbitrary, chosen for small loads */ -#define DUK__OUTPUT_TYPE_TRACEBACK (-1) -#define DUK__OUTPUT_TYPE_FILENAME 0 -#define DUK__OUTPUT_TYPE_LINENUMBER 1 - -DUK_LOCAL duk_ret_t duk__error_getter_helper(duk_hthread *thr, duk_small_int_t output_type) { - duk_idx_t idx_td; - duk_small_int_t i; /* traceback depth fits into 16 bits */ - duk_small_int_t t; /* stack type fits into 16 bits */ - duk_small_int_t count_func = 0; /* traceback depth ensures fits into 16 bits */ - const char *str_tailcall = " tailcall"; - const char *str_strict = " strict"; - const char *str_construct = " construct"; - const char *str_prevyield = " preventsyield"; - const char *str_directeval = " directeval"; - const char *str_empty = ""; - - DUK_ASSERT_TOP(thr, 0); /* fixed arg count */ - - duk_push_this(thr); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TRACEDATA); - idx_td = duk_get_top_index(thr); - - duk_push_hstring_stridx(thr, DUK_STRIDX_NEWLINE_4SPACE); - duk_push_this(thr); - - /* [ ... this tracedata sep this ] */ - - /* XXX: skip null filename? */ - - if (duk_check_type(thr, idx_td, DUK_TYPE_OBJECT)) { - /* Current tracedata contains 2 entries per callstack entry. */ - for (i = 0; ; i += 2) { - duk_int_t pc; - duk_uint_t line; - duk_uint_t flags; - duk_double_t d; - const char *funcname; - const char *filename; - duk_hobject *h_func; - duk_hstring *h_name; - - duk_require_stack(thr, 5); - duk_get_prop_index(thr, idx_td, (duk_uarridx_t) i); - duk_get_prop_index(thr, idx_td, (duk_uarridx_t) (i + 1)); - d = duk_to_number_m1(thr); - pc = (duk_int_t) DUK_FMOD(d, DUK_DOUBLE_2TO32); - flags = (duk_uint_t) DUK_FLOOR(d / DUK_DOUBLE_2TO32); - t = (duk_small_int_t) duk_get_type(thr, -2); - - if (t == DUK_TYPE_OBJECT || t == DUK_TYPE_LIGHTFUNC) { - /* - * Ecmascript/native function call or lightfunc call - */ - - count_func++; - - /* [ ... v1(func) v2(pc+flags) ] */ - - /* These may be systematically omitted by Duktape - * with certain config options, but allow user to - * set them on a case-by-case basis. - */ - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); - duk_get_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME); - -#if defined(DUK_USE_PC2LINE) - line = (duk_uint_t) duk_hobject_pc2line_query(thr, -4, (duk_uint_fast32_t) pc); -#else - line = 0; -#endif - - /* [ ... v1 v2 name filename ] */ - - /* When looking for .fileName/.lineNumber, blame first - * function which has a .fileName. - */ - if (duk_is_string_notsymbol(thr, -1)) { - if (output_type == DUK__OUTPUT_TYPE_FILENAME) { - return 1; - } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { - duk_push_uint(thr, line); - return 1; - } - } - - /* XXX: Change 'anon' handling here too, to use empty string for anonymous functions? */ - /* XXX: Could be improved by coercing to a readable duk_tval (especially string escaping) */ - h_name = duk_get_hstring_notsymbol(thr, -2); /* may be NULL */ - funcname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ? - "[anon]" : (const char *) DUK_HSTRING_GET_DATA(h_name); - filename = duk_get_string_notsymbol(thr, -1); - filename = filename ? filename : ""; - DUK_ASSERT(funcname != NULL); - DUK_ASSERT(filename != NULL); - - h_func = duk_get_hobject(thr, -4); /* NULL for lightfunc */ - - if (h_func == NULL) { - duk_push_sprintf(thr, "at %s light%s%s%s%s%s", - (const char *) funcname, - (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); - } else if (DUK_HOBJECT_HAS_NATFUNC(h_func)) { - duk_push_sprintf(thr, "at %s (%s) native%s%s%s%s%s", - (const char *) funcname, - (const char *) filename, - (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); - } else { - duk_push_sprintf(thr, "at %s (%s:%lu)%s%s%s%s%s", - (const char *) funcname, - (const char *) filename, - (unsigned long) line, - (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), - (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); - } - duk_replace(thr, -5); /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */ - duk_pop_3(thr); /* -> [ ... str ] */ - } else if (t == DUK_TYPE_STRING) { - const char *str_file; - - /* - * __FILE__ / __LINE__ entry, here 'pc' is line number directly. - * Sometimes __FILE__ / __LINE__ is reported as the source for - * the error (fileName, lineNumber), sometimes not. - */ - - /* [ ... v1(filename) v2(line+flags) ] */ - - /* When looking for .fileName/.lineNumber, blame compilation - * or C call site unless flagged not to do so. - */ - if (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) { - if (output_type == DUK__OUTPUT_TYPE_FILENAME) { - duk_pop(thr); - return 1; - } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { - duk_push_int(thr, pc); - return 1; - } - } - - /* Tracedata is trusted but avoid any risk of using a NULL - * for %s format because it has undefined behavior. Symbols - * don't need to be explicitly rejected as they pose no memory - * safety issues. - */ - str_file = (const char *) duk_get_string(thr, -2); - duk_push_sprintf(thr, "at [anon] (%s:%ld) internal", - (const char *) (str_file ? str_file : "null"), (long) pc); - duk_replace(thr, -3); /* [ ... v1 v2 str ] -> [ ... str v2 ] */ - duk_pop(thr); /* -> [ ... str ] */ - } else { - /* unknown, ignore */ - duk_pop_2(thr); - break; - } - } - - if (count_func >= DUK_USE_TRACEBACK_DEPTH) { - /* Possibly truncated; there is no explicit truncation - * marker so this is the best we can do. - */ - - duk_push_hstring_stridx(thr, DUK_STRIDX_BRACKETED_ELLIPSIS); - } - } - - /* [ ... this tracedata sep this str1 ... strN ] */ - - if (output_type != DUK__OUTPUT_TYPE_TRACEBACK) { - return 0; - } else { - /* The 'this' after 'sep' will get ToString() coerced by - * duk_join() automatically. We don't want to do that - * coercion when providing .fileName or .lineNumber (GH-254). - */ - duk_join(thr, duk_get_top(thr) - (idx_td + 2) /*count, not including sep*/); - return 1; - } -} - -/* XXX: Output type could be encoded into native function 'magic' value to - * save space. For setters the stridx could be encoded into 'magic'. - */ - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) { - return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_TRACEBACK); -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) { - return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_FILENAME); -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) { - return duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_LINENUMBER); -} - -#else /* DUK_USE_TRACEBACKS */ - -/* - * Traceback handling when tracebacks disabled. - * - * The fileName / lineNumber stubs are now necessary because built-in - * data will include the accessor properties in Error.prototype. If those - * are removed for builds without tracebacks, these can also be removed. - * 'stack' should still be present and produce a ToString() equivalent: - * this is useful for user code which prints a stacktrace and expects to - * see something useful. A normal stacktrace also begins with a ToString() - * of the error so this makes sense. - */ - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) { - /* XXX: remove this native function and map 'stack' accessor - * to the toString() implementation directly. - */ - return duk_bi_error_prototype_to_string(thr); -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) { - DUK_UNREF(thr); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) { - DUK_UNREF(thr); - return 0; -} - -#endif /* DUK_USE_TRACEBACKS */ - -DUK_LOCAL duk_ret_t duk__error_setter_helper(duk_hthread *thr, duk_small_uint_t stridx_key) { - /* Attempt to write 'stack', 'fileName', 'lineNumber' works as if - * user code called Object.defineProperty() to create an overriding - * own property. This allows user code to overwrite .fileName etc - * intuitively as e.g. "err.fileName = 'dummy'" as one might expect. - * See https://github.com/svaarala/duktape/issues/387. - */ - - DUK_ASSERT_TOP(thr, 1); /* fixed arg count: value */ - - duk_push_this(thr); - duk_push_hstring_stridx(thr, stridx_key); - duk_dup_0(thr); - - /* [ ... obj key value ] */ - - DUK_DD(DUK_DDPRINT("error setter: %!T %!T %!T", - duk_get_tval(thr, -3), duk_get_tval(thr, -2), duk_get_tval(thr, -1))); - - duk_def_prop(thr, -3, DUK_DEFPROP_HAVE_VALUE | - DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE | - DUK_DEFPROP_HAVE_ENUMERABLE | /*not enumerable*/ - DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_setter(duk_hthread *thr) { - return duk__error_setter_helper(thr, DUK_STRIDX_STACK); -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_setter(duk_hthread *thr) { - return duk__error_setter_helper(thr, DUK_STRIDX_FILE_NAME); -} - -DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_hthread *thr) { - return duk__error_setter_helper(thr, DUK_STRIDX_LINE_NUMBER); -} - -/* automatic undefs */ -#undef DUK__OUTPUT_TYPE_FILENAME -#undef DUK__OUTPUT_TYPE_LINENUMBER -#undef DUK__OUTPUT_TYPE_TRACEBACK -#line 1 "duk_bi_function.c" -/* - * Function built-ins - */ - -/* #include duk_internal.h -> already included */ - -/* Needed even when Function built-in is disabled. */ -DUK_INTERNAL duk_ret_t duk_bi_function_prototype(duk_hthread *thr) { - /* ignore arguments, return undefined (E5 Section 15.3.4) */ - DUK_UNREF(thr); - return 0; -} - -#if defined(DUK_USE_FUNCTION_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_function_constructor(duk_hthread *thr) { - duk_hstring *h_sourcecode; - duk_idx_t nargs; - duk_idx_t i; - duk_small_uint_t comp_flags; - duk_hcompfunc *func; - duk_hobject *outer_lex_env; - duk_hobject *outer_var_env; - - /* normal and constructor calls have identical semantics */ - - nargs = duk_get_top(thr); - for (i = 0; i < nargs; i++) { - duk_to_string(thr, i); /* Rejects Symbols during coercion. */ - } - - if (nargs == 0) { - duk_push_hstring_empty(thr); - duk_push_hstring_empty(thr); - } else if (nargs == 1) { - /* XXX: cover this with the generic >1 case? */ - duk_push_hstring_empty(thr); - } else { - duk_insert(thr, 0); /* [ arg1 ... argN-1 body] -> [body arg1 ... argN-1] */ - duk_push_string(thr, ","); - duk_insert(thr, 1); - duk_join(thr, nargs - 1); - } - - /* [ body formals ], formals is comma separated list that needs to be parsed */ - - DUK_ASSERT_TOP(thr, 2); - - /* XXX: this placeholder is not always correct, but use for now. - * It will fail in corner cases; see test-dev-func-cons-args.js. - */ - duk_push_string(thr, "function("); - duk_dup_1(thr); - duk_push_string(thr, "){"); - duk_dup_0(thr); - duk_push_string(thr, "\n}"); /* Newline is important to handle trailing // comment. */ - duk_concat(thr, 5); - - /* [ body formals source ] */ - - DUK_ASSERT_TOP(thr, 3); - - /* strictness is not inherited, intentional */ - comp_flags = DUK_COMPILE_FUNCEXPR; - - duk_push_hstring_stridx(thr, DUK_STRIDX_COMPILE); /* XXX: copy from caller? */ /* XXX: ignored now */ - h_sourcecode = duk_require_hstring(thr, -2); /* no symbol check needed; -2 is concat'd code */ - duk_js_compile(thr, - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode), - (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode), - comp_flags); - - /* Force .name to 'anonymous' (ES2015). */ - duk_push_string(thr, "anonymous"); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); - - func = (duk_hcompfunc *) duk_known_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func)); - DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) func)); - - /* [ body formals source template ] */ - - /* only outer_lex_env matters, as functions always get a new - * variable declaration environment. - */ - - outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - - duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 1 /*add_auto_proto*/); - - /* [ body formals source template closure ] */ - - return 1; -} -#endif /* DUK_USE_FUNCTION_BUILTIN */ - -#if defined(DUK_USE_FUNCTION_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_function_prototype_to_string(duk_hthread *thr) { - duk_tval *tv; - - /* - * E5 Section 15.3.4.2 places few requirements on the output of - * this function: the result is implementation dependent, must - * follow FunctionDeclaration syntax (in particular, must have a - * name even for anonymous functions or functions with empty name). - * The output does NOT need to compile into anything useful. - * - * E6 Section 19.2.3.5 changes the requirements completely: the - * result must either eval() to a functionally equivalent object - * OR eval() to a SyntaxError. - * - * We opt for the SyntaxError approach for now, with a syntax that - * mimics V8's native function syntax: - * - * 'function cos() { [native code] }' - * - * but extended with [ecmascript code], [bound code], and - * [lightfunc code]. - */ - - duk_push_this(thr); - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv); - const char *func_name; - - /* Function name: missing/undefined is mapped to empty string, - * otherwise coerce to string. No handling for invalid identifier - * characters or e.g. '{' in the function name. This doesn't - * really matter as long as a SyntaxError results. Technically - * if the name contained a suitable prefix followed by '//' it - * might cause the result to parse without error. - */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME); - if (duk_is_undefined(thr, -1)) { - func_name = ""; - } else { - func_name = duk_to_string(thr, -1); - DUK_ASSERT(func_name != NULL); - } - - if (DUK_HOBJECT_IS_COMPFUNC(obj)) { - duk_push_sprintf(thr, "function %s() { [ecmascript code] }", (const char *) func_name); - } else if (DUK_HOBJECT_IS_NATFUNC(obj)) { - duk_push_sprintf(thr, "function %s() { [native code] }", (const char *) func_name); - } else if (DUK_HOBJECT_IS_BOUNDFUNC(obj)) { - duk_push_sprintf(thr, "function %s() { [bound code] }", (const char *) func_name); - } else { - goto type_error; - } - } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - duk_push_lightfunc_tostring(thr, tv); - } else { - goto type_error; - } - - return 1; - - type_error: - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} -#endif - -/* Always present because the native function pointer is needed in call - * handling. - */ -DUK_INTERNAL duk_ret_t duk_bi_function_prototype_call(duk_hthread *thr) { - /* .call() is dealt with in call handling by simulating its - * effects so this function is actually never called. - */ - DUK_UNREF(thr); - return DUK_RET_TYPE_ERROR; -} - -DUK_INTERNAL duk_ret_t duk_bi_function_prototype_apply(duk_hthread *thr) { - /* Like .call(), never actually called. */ - DUK_UNREF(thr); - return DUK_RET_TYPE_ERROR; -} - -DUK_INTERNAL duk_ret_t duk_bi_reflect_apply(duk_hthread *thr) { - /* Like .call(), never actually called. */ - DUK_UNREF(thr); - return DUK_RET_TYPE_ERROR; -} - -DUK_INTERNAL duk_ret_t duk_bi_reflect_construct(duk_hthread *thr) { - /* Like .call(), never actually called. */ - DUK_UNREF(thr); - return DUK_RET_TYPE_ERROR; -} - -#if defined(DUK_USE_FUNCTION_BUILTIN) -/* Create a bound function which points to a target function which may - * be bound or non-bound. If the target is bound, the argument lists - * and 'this' binding of the functions are merged and the resulting - * function points directly to the non-bound target. - */ -DUK_INTERNAL duk_ret_t duk_bi_function_prototype_bind(duk_hthread *thr) { - duk_hboundfunc *h_bound; - duk_idx_t nargs; /* bound args, not counting 'this' binding */ - duk_idx_t bound_nargs; - duk_int_t bound_len; - duk_tval *tv_prevbound; - duk_idx_t n_prevbound; - duk_tval *tv_res; - duk_tval *tv_tmp; - - /* XXX: C API call, e.g. duk_push_bound_function(thr, target_idx, nargs); */ - - /* Vararg function, careful arg handling, e.g. thisArg may not - * be present. - */ - nargs = duk_get_top(thr) - 1; /* actual args, not counting 'this' binding */ - if (nargs < 0) { - nargs++; - duk_push_undefined(thr); - } - DUK_ASSERT(nargs >= 0); - - /* Limit 'nargs' for bound functions to guarantee arithmetic - * below will never wrap. - */ - if (nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) { - DUK_DCERROR_RANGE_INVALID_COUNT(thr); - } - - duk_push_this(thr); - duk_require_callable(thr, -1); - - /* [ thisArg arg1 ... argN func ] (thisArg+args == nargs+1 total) */ - DUK_ASSERT_TOP(thr, nargs + 2); - - /* Create bound function object. */ - h_bound = duk_push_hboundfunc(thr); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->target)); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->this_binding)); - DUK_ASSERT(h_bound->args == NULL); - DUK_ASSERT(h_bound->nargs == 0); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_bound) == NULL); - - /* [ thisArg arg1 ... argN func boundFunc ] */ - - /* If the target is a bound function, argument lists must be - * merged. The 'this' binding closest to the target function - * wins because in call handling the 'this' gets replaced over - * and over again until we call the non-bound function. - */ - tv_prevbound = NULL; - n_prevbound = 0; - tv_tmp = DUK_GET_TVAL_POSIDX(thr, 0); - DUK_TVAL_SET_TVAL(&h_bound->this_binding, tv_tmp); - tv_tmp = DUK_GET_TVAL_NEGIDX(thr, -2); - DUK_TVAL_SET_TVAL(&h_bound->target, tv_tmp); - - if (DUK_TVAL_IS_OBJECT(tv_tmp)) { - duk_hobject *h_target; - duk_hobject *bound_proto; - - h_target = DUK_TVAL_GET_OBJECT(tv_tmp); - DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(h_target)); - - /* Internal prototype must be copied from the target. - * For lightfuncs Function.prototype is used and is already - * in place. - */ - bound_proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_target); - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto); - - /* The 'strict' flag is copied to get the special [[Get]] of E5.1 - * Section 15.3.5.4 to apply when a 'caller' value is a strict bound - * function. Not sure if this is correct, because the specification - * is a bit ambiguous on this point but it would make sense. - */ - /* Strictness is inherited from target. */ - if (DUK_HOBJECT_HAS_STRICT(h_target)) { - DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound); - } - - if (DUK_HOBJECT_HAS_BOUNDFUNC(h_target)) { - duk_hboundfunc *h_boundtarget; - - h_boundtarget = (duk_hboundfunc *) h_target; - - /* The final function should always be non-bound, unless - * there's a bug in the internals. Assert for it. - */ - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&h_boundtarget->target) || - (DUK_TVAL_IS_OBJECT(&h_boundtarget->target) && - DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)) && - !DUK_HOBJECT_IS_BOUNDFUNC(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)))); - - DUK_TVAL_SET_TVAL(&h_bound->target, &h_boundtarget->target); - DUK_TVAL_SET_TVAL(&h_bound->this_binding, &h_boundtarget->this_binding); - - tv_prevbound = h_boundtarget->args; - n_prevbound = h_boundtarget->nargs; - } - } else { - /* Lightfuncs are always strict. */ - duk_hobject *bound_proto; - - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_tmp)); - DUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound); - bound_proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto); - } - - DUK_TVAL_INCREF(thr, &h_bound->target); /* old values undefined, no decref needed */ - DUK_TVAL_INCREF(thr, &h_bound->this_binding); - - bound_nargs = n_prevbound + nargs; - if (bound_nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) { - DUK_DCERROR_RANGE_INVALID_COUNT(thr); - } - tv_res = (duk_tval *) DUK_ALLOC_CHECKED(thr, ((duk_size_t) bound_nargs) * sizeof(duk_tval)); - DUK_ASSERT(tv_res != NULL); - DUK_ASSERT(h_bound->args == NULL); - DUK_ASSERT(h_bound->nargs == 0); - h_bound->args = tv_res; - h_bound->nargs = bound_nargs; - - DUK_ASSERT(n_prevbound >= 0); - duk_copy_tvals_incref(thr, tv_res, tv_prevbound, (duk_size_t) n_prevbound); - DUK_ASSERT(nargs >= 0); - duk_copy_tvals_incref(thr, tv_res + n_prevbound, DUK_GET_TVAL_POSIDX(thr, 1), (duk_size_t) nargs); - - /* [ thisArg arg1 ... argN func boundFunc ] */ - - /* Bound function 'length' property is interesting. - * For lightfuncs, simply read the virtual property. - */ - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH); - bound_len = duk_get_int(thr, -1); /* ES2015: no coercion */ - if (bound_len < nargs) { - bound_len = 0; - } else { - bound_len -= nargs; - } - if (sizeof(duk_int_t) > 4 && bound_len > (duk_int_t) DUK_UINT32_MAX) { - bound_len = (duk_int_t) DUK_UINT32_MAX; - } - duk_pop(thr); - DUK_ASSERT(bound_len >= 0); - tv_tmp = thr->valstack_top++; - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_tmp)); - DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_tmp)); - DUK_TVAL_SET_U32(tv_tmp, (duk_uint32_t) bound_len); /* in-place update, fastint */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); /* attrs in E6 Section 9.2.4 */ - - /* XXX: could these be virtual? */ - /* Caller and arguments must use the same thrower, [[ThrowTypeError]]. */ - duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_CALLER); - duk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_LC_ARGUMENTS); - - /* Function name and fileName (non-standard). */ - duk_push_string(thr, "bound "); /* ES2015 19.2.3.2. */ - duk_get_prop_stridx(thr, -3, DUK_STRIDX_NAME); - if (!duk_is_string_notsymbol(thr, -1)) { - /* ES2015 has requirement to check that .name of target is a string - * (also must check for Symbol); if not, targetName should be the - * empty string. ES2015 19.2.3.2. - */ - duk_pop(thr); - duk_push_hstring_empty(thr); - } - duk_concat(thr, 2); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); -#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C); -#endif - - DUK_DDD(DUK_DDDPRINT("created bound function: %!iT", (duk_tval *) duk_get_tval(thr, -1))); - - return 1; -} -#endif /* DUK_USE_FUNCTION_BUILTIN */ - -/* %NativeFunctionPrototype% .length getter. */ -DUK_INTERNAL duk_ret_t duk_bi_native_function_length(duk_hthread *thr) { - duk_tval *tv; - duk_hnatfunc *h; - duk_int16_t func_nargs; - - tv = duk_get_borrowed_this_tval(thr); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_OBJECT(tv)) { - h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) { - goto fail_type; - } - func_nargs = h->nargs; - duk_push_int(thr, func_nargs == DUK_HNATFUNC_NARGS_VARARGS ? 0 : func_nargs); - } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - duk_small_uint_t lf_flags; - duk_small_uint_t lf_len; - - lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); - lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); - duk_push_uint(thr, lf_len); - } else { - goto fail_type; - } - return 1; - - fail_type: - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} - -/* %NativeFunctionPrototype% .name getter. */ -DUK_INTERNAL duk_ret_t duk_bi_native_function_name(duk_hthread *thr) { - duk_tval *tv; - duk_hnatfunc *h; - - tv = duk_get_borrowed_this_tval(thr); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_OBJECT(tv)) { - h = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - if (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) { - goto fail_type; - } -#if 0 - duk_push_hnatfunc_name(thr, h); -#endif - duk_push_hstring_empty(thr); - } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { - duk_push_lightfunc_name(thr, tv); - } else { - goto fail_type; - } - return 1; - - fail_type: - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} -#line 1 "duk_bi_global.c" -/* - * Global object built-ins - */ - -/* #include duk_internal.h -> already included */ - -/* - * Encoding/decoding helpers - */ - -/* XXX: Could add fast path (for each transform callback) with direct byte - * lookups (no shifting) and no explicit check for x < 0x80 before table - * lookup. - */ - -/* Macros for creating and checking bitmasks for character encoding. - * Bit number is a bit counterintuitive, but minimizes code size. - */ -#define DUK__MKBITS(a,b,c,d,e,f,g,h) ((duk_uint8_t) ( \ - ((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | \ - ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7) \ - )) -#define DUK__CHECK_BITMASK(table,cp) ((table)[(cp) >> 3] & (1 << ((cp) & 0x07))) - -/* E5.1 Section 15.1.3.3: uriReserved + uriUnescaped + '#' */ -DUK_LOCAL const duk_uint8_t duk__encode_uriunescaped_table[16] = { - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ - DUK__MKBITS(0, 1, 0, 1, 1, 0, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x20-0x2f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ - DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ -}; - -/* E5.1 Section 15.1.3.4: uriUnescaped */ -DUK_LOCAL const duk_uint8_t duk__encode_uricomponent_unescaped_table[16] = { - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ - DUK__MKBITS(0, 1, 0, 0, 0, 0, 0, 1), DUK__MKBITS(1, 1, 1, 0, 0, 1, 1, 0), /* 0x20-0x2f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ - DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ - DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ -}; - -/* E5.1 Section 15.1.3.1: uriReserved + '#' */ -DUK_LOCAL const duk_uint8_t duk__decode_uri_reserved_table[16] = { - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ - DUK__MKBITS(0, 0, 0, 1, 1, 0, 1, 0), DUK__MKBITS(0, 0, 0, 1, 1, 0, 0, 1), /* 0x20-0x2f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ - DUK__MKBITS(1, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ -}; - -/* E5.1 Section 15.1.3.2: empty */ -DUK_LOCAL const duk_uint8_t duk__decode_uri_component_reserved_table[16] = { - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x20-0x2f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ -}; - -#if defined(DUK_USE_SECTION_B) -/* E5.1 Section B.2.2, step 7. */ -DUK_LOCAL const duk_uint8_t duk__escape_unescaped_table[16] = { - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ - DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 1, 1), /* 0x20-0x2f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ - DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ - DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 0) /* 0x70-0x7f */ -}; -#endif /* DUK_USE_SECTION_B */ - -typedef struct { - duk_hthread *thr; - duk_hstring *h_str; - duk_bufwriter_ctx bw; - const duk_uint8_t *p; - const duk_uint8_t *p_start; - const duk_uint8_t *p_end; -} duk__transform_context; - -typedef void (*duk__transform_callback)(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp); - -/* XXX: refactor and share with other code */ -DUK_LOCAL duk_small_int_t duk__decode_hex_escape(const duk_uint8_t *p, duk_small_int_t n) { - duk_small_int_t ch; - duk_small_int_t t = 0; - - while (n > 0) { - t = t * 16; - ch = (duk_small_int_t) duk_hex_dectab[*p++]; - if (DUK_LIKELY(ch >= 0)) { - t += ch; - } else { - return -1; - } - n--; - } - return t; -} - -DUK_LOCAL int duk__transform_helper(duk_hthread *thr, duk__transform_callback callback, const void *udata) { - duk__transform_context tfm_ctx_alloc; - duk__transform_context *tfm_ctx = &tfm_ctx_alloc; - duk_codepoint_t cp; - - tfm_ctx->thr = thr; - - tfm_ctx->h_str = duk_to_hstring(thr, 0); - DUK_ASSERT(tfm_ctx->h_str != NULL); - - DUK_BW_INIT_PUSHBUF(thr, &tfm_ctx->bw, DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str)); /* initial size guess */ - - tfm_ctx->p_start = DUK_HSTRING_GET_DATA(tfm_ctx->h_str); - tfm_ctx->p_end = tfm_ctx->p_start + DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str); - tfm_ctx->p = tfm_ctx->p_start; - - while (tfm_ctx->p < tfm_ctx->p_end) { - cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end); - callback(tfm_ctx, udata, cp); - } - - DUK_BW_COMPACT(thr, &tfm_ctx->bw); - - (void) duk_buffer_to_string(thr, -1); /* Safe if transform is safe. */ - return 1; -} - -DUK_LOCAL void duk__transform_callback_encode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { - duk_uint8_t xutf8_buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; - duk_small_int_t len; - duk_codepoint_t cp1, cp2; - duk_small_int_t i, t; - const duk_uint8_t *unescaped_table = (const duk_uint8_t *) udata; - - /* UTF-8 encoded bytes escaped as %xx%xx%xx... -> 3 * nbytes. - * Codepoint range is restricted so this is a slightly too large - * but doesn't matter. - */ - DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 3 * DUK_UNICODE_MAX_XUTF8_LENGTH); - - if (cp < 0) { - goto uri_error; - } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(unescaped_table, cp)) { - DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); - return; - } else if (cp >= 0xdc00L && cp <= 0xdfffL) { - goto uri_error; - } else if (cp >= 0xd800L && cp <= 0xdbffL) { - /* Needs lookahead */ - if (duk_unicode_decode_xutf8(tfm_ctx->thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end, (duk_ucodepoint_t *) &cp2) == 0) { - goto uri_error; - } - if (!(cp2 >= 0xdc00L && cp2 <= 0xdfffL)) { - goto uri_error; - } - cp1 = cp; - cp = (duk_codepoint_t) (((cp1 - 0xd800L) << 10) + (cp2 - 0xdc00L) + 0x10000L); - } else if (cp > 0x10ffffL) { - /* Although we can allow non-BMP characters (they'll decode - * back into surrogate pairs), we don't allow extended UTF-8 - * characters; they would encode to URIs which won't decode - * back because of strict UTF-8 checks in URI decoding. - * (However, we could just as well allow them here.) - */ - goto uri_error; - } else { - /* Non-BMP characters within valid UTF-8 range: encode as is. - * They'll decode back into surrogate pairs if the escaped - * output is decoded. - */ - ; - } - - len = duk_unicode_encode_xutf8((duk_ucodepoint_t) cp, xutf8_buf); - for (i = 0; i < len; i++) { - t = (duk_small_int_t) xutf8_buf[i]; - DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, - &tfm_ctx->bw, - DUK_ASC_PERCENT, - (duk_uint8_t) duk_uc_nybbles[t >> 4], - (duk_uint8_t) duk_uc_nybbles[t & 0x0f]); - } - - return; - - uri_error: - DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT); -} - -DUK_LOCAL void duk__transform_callback_decode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { - const duk_uint8_t *reserved_table = (const duk_uint8_t *) udata; - duk_small_uint_t utf8_blen; - duk_codepoint_t min_cp; - duk_small_int_t t; /* must be signed */ - duk_small_uint_t i; - - /* Maximum write size: XUTF8 path writes max DUK_UNICODE_MAX_XUTF8_LENGTH, - * percent escape path writes max two times CESU-8 encoded BMP length. - */ - DUK_BW_ENSURE(tfm_ctx->thr, - &tfm_ctx->bw, - (DUK_UNICODE_MAX_XUTF8_LENGTH >= 2 * DUK_UNICODE_MAX_CESU8_BMP_LENGTH ? - DUK_UNICODE_MAX_XUTF8_LENGTH : DUK_UNICODE_MAX_CESU8_BMP_LENGTH)); - - if (cp == (duk_codepoint_t) '%') { - const duk_uint8_t *p = tfm_ctx->p; - duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ - - DUK_DDD(DUK_DDDPRINT("percent encoding, left=%ld", (long) left)); - - if (left < 2) { - goto uri_error; - } - - t = duk__decode_hex_escape(p, 2); - DUK_DDD(DUK_DDDPRINT("first byte: %ld", (long) t)); - if (t < 0) { - goto uri_error; - } - - if (t < 0x80) { - if (DUK__CHECK_BITMASK(reserved_table, t)) { - /* decode '%xx' to '%xx' if decoded char in reserved set */ - DUK_ASSERT(tfm_ctx->p - 1 >= tfm_ctx->p_start); - DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, - &tfm_ctx->bw, - DUK_ASC_PERCENT, - p[0], - p[1]); - } else { - DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) t); - } - tfm_ctx->p += 2; - return; - } - - /* Decode UTF-8 codepoint from a sequence of hex escapes. The - * first byte of the sequence has been decoded to 't'. - * - * Note that UTF-8 validation must be strict according to the - * specification: E5.1 Section 15.1.3, decode algorithm step - * 4.d.vii.8. URIError from non-shortest encodings is also - * specifically noted in the spec. - */ - - DUK_ASSERT(t >= 0x80); - if (t < 0xc0) { - /* continuation byte */ - goto uri_error; - } else if (t < 0xe0) { - /* 110x xxxx; 2 bytes */ - utf8_blen = 2; - min_cp = 0x80L; - cp = t & 0x1f; - } else if (t < 0xf0) { - /* 1110 xxxx; 3 bytes */ - utf8_blen = 3; - min_cp = 0x800L; - cp = t & 0x0f; - } else if (t < 0xf8) { - /* 1111 0xxx; 4 bytes */ - utf8_blen = 4; - min_cp = 0x10000L; - cp = t & 0x07; - } else { - /* extended utf-8 not allowed for URIs */ - goto uri_error; - } - - if (left < utf8_blen * 3 - 1) { - /* '%xx%xx...%xx', p points to char after first '%' */ - goto uri_error; - } - - p += 3; - for (i = 1; i < utf8_blen; i++) { - /* p points to digit part ('%xy', p points to 'x') */ - t = duk__decode_hex_escape(p, 2); - DUK_DDD(DUK_DDDPRINT("i=%ld utf8_blen=%ld cp=%ld t=0x%02lx", - (long) i, (long) utf8_blen, (long) cp, (unsigned long) t)); - if (t < 0) { - goto uri_error; - } - if ((t & 0xc0) != 0x80) { - goto uri_error; - } - cp = (cp << 6) + (t & 0x3f); - p += 3; - } - p--; /* p overshoots */ - tfm_ctx->p = p; - - DUK_DDD(DUK_DDDPRINT("final cp=%ld, min_cp=%ld", (long) cp, (long) min_cp)); - - if (cp < min_cp || cp > 0x10ffffL || (cp >= 0xd800L && cp <= 0xdfffL)) { - goto uri_error; - } - - /* The E5.1 algorithm checks whether or not a decoded codepoint - * is below 0x80 and perhaps may be in the "reserved" set. - * This seems pointless because the single byte UTF-8 case is - * handled separately, and non-shortest encodings are rejected. - * So, 'cp' cannot be below 0x80 here, and thus cannot be in - * the reserved set. - */ - - /* utf-8 validation ensures these */ - DUK_ASSERT(cp >= 0x80L && cp <= 0x10ffffL); - - if (cp >= 0x10000L) { - cp -= 0x10000L; - DUK_ASSERT(cp < 0x100000L); - - DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp >> 10) + 0xd800L)); - DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp & 0x03ffL) + 0xdc00L)); - } else { - DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); - } - } else { - DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); - } - return; - - uri_error: - DUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT); -} - -#if defined(DUK_USE_SECTION_B) -DUK_LOCAL void duk__transform_callback_escape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { - DUK_UNREF(udata); - - DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 6); - - if (cp < 0) { - goto esc_error; - } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(duk__escape_unescaped_table, cp)) { - DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); - } else if (cp < 0x100L) { - DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, - &tfm_ctx->bw, - (duk_uint8_t) DUK_ASC_PERCENT, - (duk_uint8_t) duk_uc_nybbles[cp >> 4], - (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); - } else if (cp < 0x10000L) { - DUK_BW_WRITE_RAW_U8_6(tfm_ctx->thr, - &tfm_ctx->bw, - (duk_uint8_t) DUK_ASC_PERCENT, - (duk_uint8_t) DUK_ASC_LC_U, - (duk_uint8_t) duk_uc_nybbles[cp >> 12], - (duk_uint8_t) duk_uc_nybbles[(cp >> 8) & 0x0f], - (duk_uint8_t) duk_uc_nybbles[(cp >> 4) & 0x0f], - (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); - } else { - /* Characters outside BMP cannot be escape()'d. We could - * encode them as surrogate pairs (for codepoints inside - * valid UTF-8 range, but not extended UTF-8). Because - * escape() and unescape() are legacy functions, we don't. - */ - goto esc_error; - } - - return; - - esc_error: - DUK_ERROR_TYPE(tfm_ctx->thr, DUK_STR_INVALID_INPUT); -} - -DUK_LOCAL void duk__transform_callback_unescape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) { - duk_small_int_t t; - - DUK_UNREF(udata); - - if (cp == (duk_codepoint_t) '%') { - const duk_uint8_t *p = tfm_ctx->p; - duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ - - if (left >= 5 && p[0] == 'u' && - ((t = duk__decode_hex_escape(p + 1, 4)) >= 0)) { - cp = (duk_codepoint_t) t; - tfm_ctx->p += 5; - } else if (left >= 2 && - ((t = duk__decode_hex_escape(p, 2)) >= 0)) { - cp = (duk_codepoint_t) t; - tfm_ctx->p += 2; - } - } - - DUK_BW_WRITE_ENSURE_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); -} -#endif /* DUK_USE_SECTION_B */ - -/* - * Eval - * - * Eval needs to handle both a "direct eval" and an "indirect eval". - * Direct eval handling needs access to the caller's activation so that its - * lexical environment can be accessed. A direct eval is only possible from - * Ecmascript code; an indirect eval call is possible also from C code. - * When an indirect eval call is made from C code, there may not be a - * calling activation at all which needs careful handling. - */ - -DUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_hthread *thr) { - duk_hstring *h; - duk_activation *act_caller; - duk_activation *act_eval; - duk_hcompfunc *func; - duk_hobject *outer_lex_env; - duk_hobject *outer_var_env; - duk_bool_t this_to_global = 1; - duk_small_uint_t comp_flags; - duk_int_t level = -2; - duk_small_uint_t call_flags; - - DUK_ASSERT(duk_get_top(thr) == 1 || duk_get_top(thr) == 2); /* 2 when called by debugger */ - DUK_ASSERT(thr->callstack_top >= 1); /* at least this function exists */ - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT((thr->callstack_curr->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0 || /* indirect eval */ - (thr->callstack_top >= 2)); /* if direct eval, calling activation must exist */ - - /* - * callstack_top - 1 --> this function - * callstack_top - 2 --> caller (may not exist) - * - * If called directly from C, callstack_top might be 1. If calling - * activation doesn't exist, call must be indirect. - */ - - h = duk_get_hstring_notsymbol(thr, 0); - if (!h) { - /* Symbol must be returned as is, like any non-string values. */ - return 1; /* return arg as-is */ - } - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* NOTE: level is used only by the debugger and should never be present - * for an Ecmascript eval(). - */ - DUK_ASSERT(level == -2); /* by default, use caller's environment */ - if (duk_get_top(thr) >= 2 && duk_is_number(thr, 1)) { - level = duk_get_int(thr, 1); - } - DUK_ASSERT(level <= -2); /* This is guaranteed by debugger code. */ -#endif - - /* [ source ] */ - - comp_flags = DUK_COMPILE_EVAL; - act_eval = thr->callstack_curr; /* this function */ - DUK_ASSERT(act_eval != NULL); - act_caller = duk_hthread_get_activation_for_level(thr, level); - if (act_caller != NULL) { - /* Have a calling activation, check for direct eval (otherwise - * assume indirect eval. - */ - if ((act_caller->flags & DUK_ACT_FLAG_STRICT) && - (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL)) { - /* Only direct eval inherits strictness from calling code - * (E5.1 Section 10.1.1). - */ - comp_flags |= DUK_COMPILE_STRICT; - } - } else { - DUK_ASSERT((act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0); - } - - duk_push_hstring_stridx(thr, DUK_STRIDX_INPUT); /* XXX: copy from caller? */ - duk_js_compile(thr, - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), - (duk_size_t) DUK_HSTRING_GET_BYTELEN(h), - comp_flags); - func = (duk_hcompfunc *) duk_known_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func)); - - /* [ source template ] */ - - /* E5 Section 10.4.2 */ - - if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) { - DUK_ASSERT(thr->callstack_top >= 2); - DUK_ASSERT(act_caller != NULL); - if (act_caller->lex_env == NULL) { - DUK_ASSERT(act_caller->var_env == NULL); - DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); - - /* this may have side effects, so re-lookup act */ - duk_js_init_activation_environment_records_delayed(thr, act_caller); - } - DUK_ASSERT(act_caller->lex_env != NULL); - DUK_ASSERT(act_caller->var_env != NULL); - - this_to_global = 0; - - if (DUK_HOBJECT_HAS_STRICT((duk_hobject *) func)) { - duk_hdecenv *new_env; - duk_hobject *act_lex_env; - - DUK_DDD(DUK_DDDPRINT("direct eval call to a strict function -> " - "var_env and lex_env to a fresh env, " - "this_binding to caller's this_binding")); - - act_lex_env = act_caller->lex_env; - - new_env = duk_hdecenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); - DUK_ASSERT(new_env != NULL); - duk_push_hobject(thr, (duk_hobject *) new_env); - - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act_lex_env); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, act_lex_env); - DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env)); - - outer_lex_env = (duk_hobject *) new_env; - outer_var_env = (duk_hobject *) new_env; - - duk_insert(thr, 0); /* stash to bottom of value stack to keep new_env reachable for duration of eval */ - - /* compiler's responsibility */ - DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); - } else { - DUK_DDD(DUK_DDDPRINT("direct eval call to a non-strict function -> " - "var_env and lex_env to caller's envs, " - "this_binding to caller's this_binding")); - - outer_lex_env = act_caller->lex_env; - outer_var_env = act_caller->var_env; - - /* compiler's responsibility */ - DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); - } - } else { - DUK_DDD(DUK_DDDPRINT("indirect eval call -> var_env and lex_env to " - "global object, this_binding to global object")); - - this_to_global = 1; - outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - } - - /* Eval code doesn't need an automatic .prototype object. */ - duk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 0 /*add_auto_proto*/); - - /* [ env? source template closure ] */ - - if (this_to_global) { - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - duk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL); - } else { - duk_tval *tv; - DUK_ASSERT(thr->callstack_top >= 2); - DUK_ASSERT(act_caller != NULL); - tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act_caller->bottom_byteoff - sizeof(duk_tval)); /* this is just beneath bottom */ - DUK_ASSERT(tv >= thr->valstack); - duk_push_tval(thr, tv); - } - - DUK_DDD(DUK_DDDPRINT("eval -> lex_env=%!iO, var_env=%!iO, this_binding=%!T", - (duk_heaphdr *) outer_lex_env, - (duk_heaphdr *) outer_var_env, - duk_get_tval(thr, -1))); - - /* [ env? source template closure this ] */ - - call_flags = 0; - if (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) { - /* Set DIRECT_EVAL flag for the call; it's not strictly - * needed for the 'inner' eval call (the eval body) but - * current new.target implementation expects to find it - * so it can traverse direct eval chains up to the real - * calling function. - */ - call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; - } - duk_handle_call_unprotected_nargs(thr, 0, call_flags); - - /* [ env? source template result ] */ - - return 1; -} - -/* - * Parsing of ints and floats - */ - -#if defined(DUK_USE_GLOBAL_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_int(duk_hthread *thr) { - duk_int32_t radix; - duk_small_uint_t s2n_flags; - - DUK_ASSERT_TOP(thr, 2); - duk_to_string(thr, 0); /* Reject symbols. */ - - radix = duk_to_int32(thr, 1); - - /* While parseInt() recognizes 0xdeadbeef, it doesn't recognize - * ES2015 0o123 or 0b10001. - */ - s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | - DUK_S2N_FLAG_ALLOW_GARBAGE | - DUK_S2N_FLAG_ALLOW_PLUS | - DUK_S2N_FLAG_ALLOW_MINUS | - DUK_S2N_FLAG_ALLOW_LEADING_ZERO | - DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; - - /* Specification stripPrefix maps to DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT. - * - * Don't autodetect octals (from leading zeroes), require user code to - * provide an explicit radix 8 for parsing octal. See write-up from Mozilla: - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#ECMAScript_5_Removes_Octal_Interpretation - */ - - if (radix != 0) { - if (radix < 2 || radix > 36) { - goto ret_nan; - } - if (radix != 16) { - s2n_flags &= ~DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT; - } - } else { - radix = 10; - } - - duk_dup_0(thr); - duk_numconv_parse(thr, (duk_small_int_t) radix, s2n_flags); - return 1; - - ret_nan: - duk_push_nan(thr); - return 1; -} -#endif /* DUK_USE_GLOBAL_BUILTIN */ - -#if defined(DUK_USE_GLOBAL_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_float(duk_hthread *thr) { - duk_small_uint_t s2n_flags; - - DUK_ASSERT_TOP(thr, 1); - duk_to_string(thr, 0); /* Reject symbols. */ - - /* XXX: check flags */ - s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | - DUK_S2N_FLAG_ALLOW_EXP | - DUK_S2N_FLAG_ALLOW_GARBAGE | - DUK_S2N_FLAG_ALLOW_PLUS | - DUK_S2N_FLAG_ALLOW_MINUS | - DUK_S2N_FLAG_ALLOW_INF | - DUK_S2N_FLAG_ALLOW_FRAC | - DUK_S2N_FLAG_ALLOW_NAKED_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | - DUK_S2N_FLAG_ALLOW_LEADING_ZERO; - - duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); - return 1; -} -#endif /* DUK_USE_GLOBAL_BUILTIN */ - -/* - * Number checkers - */ - -#if defined(DUK_USE_GLOBAL_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_global_object_is_nan(duk_hthread *thr) { - duk_double_t d = duk_to_number(thr, 0); - duk_push_boolean(thr, (duk_bool_t) DUK_ISNAN(d)); - return 1; -} -#endif /* DUK_USE_GLOBAL_BUILTIN */ - -#if defined(DUK_USE_GLOBAL_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_global_object_is_finite(duk_hthread *thr) { - duk_double_t d = duk_to_number(thr, 0); - duk_push_boolean(thr, (duk_bool_t) DUK_ISFINITE(d)); - return 1; -} -#endif /* DUK_USE_GLOBAL_BUILTIN */ - -/* - * URI handling - */ - -#if defined(DUK_USE_GLOBAL_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_reserved_table); -} - -DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri_component(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_component_reserved_table); -} - -DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uriunescaped_table); -} - -DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri_component(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uricomponent_unescaped_table); -} - -#if defined(DUK_USE_SECTION_B) -DUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_escape, (const void *) NULL); -} - -DUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_hthread *thr) { - return duk__transform_helper(thr, duk__transform_callback_unescape, (const void *) NULL); -} -#endif /* DUK_USE_SECTION_B */ -#endif /* DUK_USE_GLOBAL_BUILTIN */ - -/* automatic undefs */ -#undef DUK__CHECK_BITMASK -#undef DUK__MKBITS -#line 1 "duk_bi_json.c" -/* - * JSON built-ins. - * - * See doc/json.rst. - * - * Codepoints are handled as duk_uint_fast32_t to ensure that the full - * unsigned 32-bit range is supported. This matters to e.g. JX. - * - * Input parsing doesn't do an explicit end-of-input check at all. This is - * safe: input string data is always NUL-terminated (0x00) and valid JSON - * inputs never contain plain NUL characters, so that as long as syntax checks - * are correct, we'll never read past the NUL. This approach reduces code size - * and improves parsing performance, but it's critical that syntax checks are - * indeed correct! - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_JSON_SUPPORT) - -/* - * Local defines and forward declarations. - */ - -#define DUK__JSON_DECSTR_BUFSIZE 128 -#define DUK__JSON_DECSTR_CHUNKSIZE 64 -#define DUK__JSON_ENCSTR_CHUNKSIZE 64 -#define DUK__JSON_STRINGIFY_BUFSIZE 128 -#define DUK__JSON_MAX_ESC_LEN 10 /* '\Udeadbeef' */ - -DUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx); -#if defined(DUK_USE_JX) -DUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx); -#endif -DUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n); -DUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx); -DUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx); -#if defined(DUK_USE_JX) -DUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx); -#endif -DUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx); -DUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx); - -DUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch); -DUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2); -DUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx); -DUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h); -#if defined(DUK_USE_FASTINT) -DUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p); -#endif -DUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx); -DUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q); -DUK_LOCAL_DECL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k); -DUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str); -DUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top); -DUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top); -DUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx); -DUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx); -DUK_LOCAL_DECL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder); -DUK_LOCAL_DECL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv); -DUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx); -#if defined(DUK_USE_FASTINT) -DUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv); -#endif -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) -DUK_LOCAL_DECL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h); -DUK_LOCAL_DECL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_LOCAL_DECL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj); -#endif -#endif -#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) -DUK_LOCAL_DECL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h); -#endif -DUK_LOCAL_DECL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth); - -/* - * Helper tables - */ - -#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) -DUK_LOCAL const duk_uint8_t duk__json_quotestr_lookup[256] = { - /* 0x00 ... 0x7f: as is - * 0x80: escape generically - * 0x81: slow path - * 0xa0 ... 0xff: backslash + one char - */ - - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xe2, 0xf4, 0xee, 0x80, 0xe6, 0xf2, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x20, 0x21, 0xa2, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0xdc, 0x5d, 0x5e, 0x5f, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81 -}; -#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ -DUK_LOCAL const duk_uint8_t duk__json_quotestr_esc[14] = { - DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, - DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, - DUK_ASC_LC_B, DUK_ASC_LC_T, DUK_ASC_LC_N, DUK_ASC_NUL, - DUK_ASC_LC_F, DUK_ASC_LC_R -}; -#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ - -#if defined(DUK_USE_JSON_DECSTRING_FASTPATH) -DUK_LOCAL const duk_uint8_t duk__json_decstr_lookup[256] = { - /* 0x00: slow path - * other: as is - */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x21, 0x00, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff -}; -#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ - -#if defined(DUK_USE_JSON_EATWHITE_FASTPATH) -DUK_LOCAL const duk_uint8_t duk__json_eatwhite_lookup[256] = { - /* 0x00: finish (non-white) - * 0x01: continue - */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ - -#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) -DUK_LOCAL const duk_uint8_t duk__json_decnumber_lookup[256] = { - /* 0x00: finish (not part of number) - * 0x01: continue - */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ - -/* - * Parsing implementation. - * - * JSON lexer is now separate from duk_lexer.c because there are numerous - * small differences making it difficult to share the lexer. - * - * The parser here works with raw bytes directly; this works because all - * JSON delimiters are ASCII characters. Invalid xUTF-8 encoded values - * inside strings will be passed on without normalization; this is not a - * compliance concern because compliant inputs will always be valid - * CESU-8 encodings. - */ - -DUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) { - /* Shared handler to minimize parser size. Cause will be - * hidden, unfortunately, but we'll have an offset which - * is often quite enough. - */ - DUK_ERROR_FMT1(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON, - (long) (js_ctx->p - js_ctx->p_start)); -} - -DUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) { - const duk_uint8_t *p; - duk_uint8_t t; - - p = js_ctx->p; - for (;;) { - DUK_ASSERT(p <= js_ctx->p_end); - t = *p; - -#if defined(DUK_USE_JSON_EATWHITE_FASTPATH) - /* This fast path is pretty marginal in practice. - * XXX: candidate for removal. - */ - DUK_ASSERT(duk__json_eatwhite_lookup[0x00] == 0x00); /* end-of-input breaks */ - if (duk__json_eatwhite_lookup[t] == 0) { - break; - } -#else /* DUK_USE_JSON_EATWHITE_FASTPATH */ - if (!(t == 0x20 || t == 0x0a || t == 0x0d || t == 0x09)) { - /* NUL also comes here. Comparison order matters, 0x20 - * is most common whitespace. - */ - break; - } -#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ - p++; - } - js_ctx->p = p; -} - -#if defined(DUK_USE_JX) -DUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) { - DUK_ASSERT(js_ctx->p <= js_ctx->p_end); - return *js_ctx->p; -} -#endif - -DUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) { - DUK_ASSERT(js_ctx->p <= js_ctx->p_end); - return *js_ctx->p++; -} - -DUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) { - duk__dec_eat_white(js_ctx); - return duk__dec_get(js_ctx); -} - -/* For JX, expressing the whole unsigned 32-bit range matters. */ -DUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n) { - duk_small_uint_t i; - duk_uint_fast32_t res = 0; - duk_uint8_t x; - duk_small_int_t t; - - for (i = 0; i < n; i++) { - /* XXX: share helper from lexer; duk_lexer.c / hexval(). */ - - x = duk__dec_get(js_ctx); - DUK_DDD(DUK_DDDPRINT("decode_hex_escape: i=%ld, n=%ld, res=%ld, x=%ld", - (long) i, (long) n, (long) res, (long) x)); - - /* x == 0x00 (EOF) causes syntax_error */ - DUK_ASSERT(duk_hex_dectab[0] == -1); - t = duk_hex_dectab[x & 0xff]; - if (DUK_LIKELY(t >= 0)) { - res = (res * 16) + (duk_uint_fast32_t) t; - } else { - /* catches EOF and invalid digits */ - goto syntax_error; - } - } - - DUK_DDD(DUK_DDDPRINT("final hex decoded value: %ld", (long) res)); - return res; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); - return 0; -} - -DUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) { - duk_hstring *h; - const duk_uint8_t *p; - duk_uint8_t x, y; - - /* First character has already been eaten and checked by the caller. - * We can scan until a NUL in stridx string because no built-in strings - * have internal NULs. - */ - - DUK_ASSERT_STRIDX_VALID(stridx); - h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); - DUK_ASSERT(h != NULL); - - p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h) + 1; - DUK_ASSERT(*(js_ctx->p - 1) == *(p - 1)); /* first character has been matched */ - - for (;;) { - x = *p; - if (x == 0) { - break; - } - y = duk__dec_get(js_ctx); - if (x != y) { - /* Catches EOF of JSON input. */ - goto syntax_error; - } - p++; - } - - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} - -DUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) { - duk_uint_fast32_t cp; - - /* EOF (-1) will be cast to an unsigned value first - * and then re-cast for the switch. In any case, it - * will match the default case (syntax error). - */ - cp = (duk_uint_fast32_t) duk__dec_get(js_ctx); - switch (cp) { - case DUK_ASC_BACKSLASH: break; - case DUK_ASC_DOUBLEQUOTE: break; - case DUK_ASC_SLASH: break; - case DUK_ASC_LC_T: cp = 0x09; break; - case DUK_ASC_LC_N: cp = 0x0a; break; - case DUK_ASC_LC_R: cp = 0x0d; break; - case DUK_ASC_LC_F: cp = 0x0c; break; - case DUK_ASC_LC_B: cp = 0x08; break; - case DUK_ASC_LC_U: { - cp = duk__dec_decode_hex_escape(js_ctx, 4); - break; - } -#if defined(DUK_USE_JX) - case DUK_ASC_UC_U: { - if (js_ctx->flag_ext_custom) { - cp = duk__dec_decode_hex_escape(js_ctx, 8); - } else { - return 1; /* syntax error */ - } - break; - } - case DUK_ASC_LC_X: { - if (js_ctx->flag_ext_custom) { - cp = duk__dec_decode_hex_escape(js_ctx, 2); - } else { - return 1; /* syntax error */ - } - break; - } -#endif /* DUK_USE_JX */ - default: - /* catches EOF (0x00) */ - return 1; /* syntax error */ - } - - DUK_RAW_WRITE_XUTF8(*ext_p, cp); - - return 0; -} - -DUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; - duk_uint8_t *q; - - /* '"' was eaten by caller */ - - /* Note that we currently parse -bytes-, not codepoints. - * All non-ASCII extended UTF-8 will encode to bytes >= 0x80, - * so they'll simply pass through (valid UTF-8 or not). - */ - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE); - q = DUK_BW_GET_PTR(js_ctx->thr, bw); - -#if defined(DUK_USE_JSON_DECSTRING_FASTPATH) - for (;;) { - duk_small_uint_t safe; - duk_uint8_t b, x; - const duk_uint8_t *p; - - /* Select a safe loop count where no output checks are - * needed assuming we won't encounter escapes. Input - * bound checks are not necessary as a NUL (guaranteed) - * will cause a SyntaxError before we read out of bounds. - */ - - safe = DUK__JSON_DECSTR_CHUNKSIZE; - - /* Ensure space for 1:1 output plus one escape. */ - q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q); - - p = js_ctx->p; /* temp copy, write back for next loop */ - for (;;) { - if (safe == 0) { - js_ctx->p = p; - break; - } - safe--; - - /* End of input (NUL) goes through slow path and causes SyntaxError. */ - DUK_ASSERT(duk__json_decstr_lookup[0] == 0x00); - - b = *p++; - x = (duk_small_int_t) duk__json_decstr_lookup[b]; - if (DUK_LIKELY(x != 0)) { - /* Fast path, decode as is. */ - *q++ = b; - } else if (b == DUK_ASC_DOUBLEQUOTE) { - js_ctx->p = p; - goto found_quote; - } else if (b == DUK_ASC_BACKSLASH) { - /* We've ensured space for one escaped input; then - * bail out and recheck (this makes escape handling - * quite slow but it's uncommon). - */ - js_ctx->p = p; - if (duk__dec_string_escape(js_ctx, &q) != 0) { - goto syntax_error; - } - break; - } else { - js_ctx->p = p; - goto syntax_error; - } - } - } - found_quote: -#else /* DUK_USE_JSON_DECSTRING_FASTPATH */ - for (;;) { - duk_uint8_t x; - - q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q); - - x = duk__dec_get(js_ctx); - - if (x == DUK_ASC_DOUBLEQUOTE) { - break; - } else if (x == DUK_ASC_BACKSLASH) { - if (duk__dec_string_escape(js_ctx, &q) != 0) { - goto syntax_error; - } - } else if (x < 0x20) { - /* catches EOF (NUL) */ - goto syntax_error; - } else { - *q++ = (duk_uint8_t) x; - } - } -#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ - - DUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q); - (void) duk_buffer_to_string(thr, -1); /* Safe if input string is safe. */ - - /* [ ... str ] */ - - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} - -#if defined(DUK_USE_JX) -/* Decode a plain string consisting entirely of identifier characters. - * Used to parse plain keys (e.g. "foo: 123"). - */ -DUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - const duk_uint8_t *p; - duk_small_int_t x; - - /* Caller has already eaten the first char so backtrack one byte. */ - - js_ctx->p--; /* safe */ - p = js_ctx->p; - - /* Here again we parse bytes, and non-ASCII UTF-8 will cause end of - * parsing (which is correct except if there are non-shortest encodings). - * There is also no need to check explicitly for end of input buffer as - * the input is NUL padded and NUL will exit the parsing loop. - * - * Because no unescaping takes place, we can just scan to the end of the - * plain string and intern from the input buffer. - */ - - for (;;) { - x = *p; - - /* There is no need to check the first character specially here - * (i.e. reject digits): the caller only accepts valid initial - * characters and won't call us if the first character is a digit. - * This also ensures that the plain string won't be empty. - */ - - if (!duk_unicode_is_identifier_part((duk_codepoint_t) x)) { - break; - } - p++; - } - - duk_push_lstring(thr, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p)); - js_ctx->p = p; - - /* [ ... str ] */ -} -#endif /* DUK_USE_JX */ - -#if defined(DUK_USE_JX) -DUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - const duk_uint8_t *p; - duk_small_int_t x; - void *voidptr; - - /* Caller has already eaten the first character ('(') which we don't need. */ - - p = js_ctx->p; - - for (;;) { - x = *p; - - /* Assume that the native representation never contains a closing - * parenthesis. - */ - - if (x == DUK_ASC_RPAREN) { - break; - } else if (x <= 0) { - /* NUL term or -1 (EOF), NUL check would suffice */ - goto syntax_error; - } - p++; - } - - /* There is no need to NUL delimit the sscanf() call: trailing garbage is - * ignored and there is always a NUL terminator which will force an error - * if no error is encountered before it. It's possible that the scan - * would scan further than between [js_ctx->p,p[ though and we'd advance - * by less than the scanned value. - * - * Because pointers are platform specific, a failure to scan a pointer - * results in a null pointer which is a better placeholder than a missing - * value or an error. - */ - - voidptr = NULL; - (void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr); - duk_push_pointer(thr, voidptr); - js_ctx->p = p + 1; /* skip ')' */ - - /* [ ... ptr ] */ - - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} -#endif /* DUK_USE_JX */ - -#if defined(DUK_USE_JX) -DUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - const duk_uint8_t *p; - duk_uint8_t *buf; - duk_size_t src_len; - duk_small_int_t x; - - /* Caller has already eaten the first character ('|') which we don't need. */ - - p = js_ctx->p; - - /* XXX: Would be nice to share the fast path loop from duk_hex_decode() - * and avoid creating a temporary buffer. However, there are some - * differences which prevent trivial sharing: - * - * - Pipe char detection - * - EOF detection - * - Unknown length of input and output - * - * The best approach here would be a bufwriter and a reasonaly sized - * safe inner loop (e.g. 64 output bytes at a time). - */ - - for (;;) { - x = *p; - - /* This loop intentionally does not ensure characters are valid - * ([0-9a-fA-F]) because the hex decode call below will do that. - */ - if (x == DUK_ASC_PIPE) { - break; - } else if (x <= 0) { - /* NUL term or -1 (EOF), NUL check would suffice */ - goto syntax_error; - } - p++; - } - - /* XXX: this is not very nice; unnecessary copy is made. */ - src_len = (duk_size_t) (p - js_ctx->p); - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_len); - DUK_ASSERT(buf != NULL); - DUK_MEMCPY((void *) buf, (const void *) js_ctx->p, src_len); - duk_hex_decode(thr, -1); - - js_ctx->p = p + 1; /* skip '|' */ - - /* [ ... buf ] */ - - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} -#endif /* DUK_USE_JX */ - -/* Parse a number, other than NaN or +/- Infinity */ -DUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - const duk_uint8_t *p_start; - const duk_uint8_t *p; - duk_uint8_t x; - duk_small_uint_t s2n_flags; - - DUK_DDD(DUK_DDDPRINT("parse_number")); - - p_start = js_ctx->p; - - /* First pass parse is very lenient (e.g. allows '1.2.3') and extracts a - * string for strict number parsing. - */ - - p = js_ctx->p; - for (;;) { - x = *p; - - DUK_DDD(DUK_DDDPRINT("parse_number: p_start=%p, p=%p, p_end=%p, x=%ld", - (const void *) p_start, (const void *) p, - (const void *) js_ctx->p_end, (long) x)); - -#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) - /* This fast path is pretty marginal in practice. - * XXX: candidate for removal. - */ - DUK_ASSERT(duk__json_decnumber_lookup[0x00] == 0x00); /* end-of-input breaks */ - if (duk__json_decnumber_lookup[x] == 0) { - break; - } -#else /* DUK_USE_JSON_DECNUMBER_FASTPATH */ - if (!((x >= DUK_ASC_0 && x <= DUK_ASC_9) || - (x == DUK_ASC_PERIOD || x == DUK_ASC_LC_E || - x == DUK_ASC_UC_E || x == DUK_ASC_MINUS || x == DUK_ASC_PLUS))) { - /* Plus sign must be accepted for positive exponents - * (e.g. '1.5e+2'). This clause catches NULs. - */ - break; - } -#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ - p++; /* safe, because matched (NUL causes a break) */ - } - js_ctx->p = p; - - DUK_ASSERT(js_ctx->p > p_start); - duk_push_lstring(thr, (const char *) p_start, (duk_size_t) (p - p_start)); - - s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | - DUK_S2N_FLAG_ALLOW_MINUS | /* but don't allow leading plus */ - DUK_S2N_FLAG_ALLOW_FRAC; - - DUK_DDD(DUK_DDDPRINT("parse_number: string before parsing: %!T", - (duk_tval *) duk_get_tval(thr, -1))); - duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); - if (duk_is_nan(thr, -1)) { - duk__dec_syntax_error(js_ctx); - } - DUK_ASSERT(duk_is_number(thr, -1)); - DUK_DDD(DUK_DDDPRINT("parse_number: final number: %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - /* [ ... num ] */ -} - -DUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_require_stack(thr, DUK_JSON_DEC_REQSTACK); - - /* c recursion check */ - - DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { - DUK_ERROR_RANGE(thr, DUK_STR_JSONDEC_RECLIMIT); - } - js_ctx->recursion_depth++; -} - -DUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) { - /* c recursion check */ - - DUK_ASSERT(js_ctx->recursion_depth > 0); - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - js_ctx->recursion_depth--; -} - -DUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_int_t key_count; /* XXX: a "first" flag would suffice */ - duk_uint8_t x; - - DUK_DDD(DUK_DDDPRINT("parse_object")); - - duk__dec_objarr_entry(js_ctx); - - duk_push_object(thr); - - /* Initial '{' has been checked and eaten by caller. */ - - key_count = 0; - for (;;) { - x = duk__dec_get_nonwhite(js_ctx); - - DUK_DDD(DUK_DDDPRINT("parse_object: obj=%!T, x=%ld, key_count=%ld", - (duk_tval *) duk_get_tval(thr, -1), - (long) x, (long) key_count)); - - /* handle comma and closing brace */ - - if (x == DUK_ASC_COMMA && key_count > 0) { - /* accept comma, expect new value */ - x = duk__dec_get_nonwhite(js_ctx); - } else if (x == DUK_ASC_RCURLY) { - /* eat closing brace */ - break; - } else if (key_count == 0) { - /* accept anything, expect first value (EOF will be - * caught by key parsing below. - */ - ; - } else { - /* catches EOF (NUL) and initial comma */ - goto syntax_error; - } - - /* parse key and value */ - - if (x == DUK_ASC_DOUBLEQUOTE) { - duk__dec_string(js_ctx); -#if defined(DUK_USE_JX) - } else if (js_ctx->flag_ext_custom && - duk_unicode_is_identifier_start((duk_codepoint_t) x)) { - duk__dec_plain_string(js_ctx); -#endif - } else { - goto syntax_error; - } - - /* [ ... obj key ] */ - - x = duk__dec_get_nonwhite(js_ctx); - if (x != DUK_ASC_COLON) { - goto syntax_error; - } - - duk__dec_value(js_ctx); - - /* [ ... obj key val ] */ - - duk_xdef_prop_wec(thr, -3); - - /* [ ... obj ] */ - - key_count++; - } - - /* [ ... obj ] */ - - DUK_DDD(DUK_DDDPRINT("parse_object: final object is %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - duk__dec_objarr_exit(js_ctx); - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} - -DUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_uarridx_t arr_idx; - duk_uint8_t x; - - DUK_DDD(DUK_DDDPRINT("parse_array")); - - duk__dec_objarr_entry(js_ctx); - - duk_push_array(thr); - - /* Initial '[' has been checked and eaten by caller. */ - - arr_idx = 0; - for (;;) { - x = duk__dec_get_nonwhite(js_ctx); - - DUK_DDD(DUK_DDDPRINT("parse_array: arr=%!T, x=%ld, arr_idx=%ld", - (duk_tval *) duk_get_tval(thr, -1), - (long) x, (long) arr_idx)); - - /* handle comma and closing bracket */ - - if ((x == DUK_ASC_COMMA) && (arr_idx != 0)) { - /* accept comma, expect new value */ - ; - } else if (x == DUK_ASC_RBRACKET) { - /* eat closing bracket */ - break; - } else if (arr_idx == 0) { - /* accept anything, expect first value (EOF will be - * caught by duk__dec_value() below. - */ - js_ctx->p--; /* backtrack (safe) */ - } else { - /* catches EOF (NUL) and initial comma */ - goto syntax_error; - } - - /* parse value */ - - duk__dec_value(js_ctx); - - /* [ ... arr val ] */ - - duk_xdef_prop_index_wec(thr, -2, arr_idx); - arr_idx++; - } - - /* Must set 'length' explicitly when using duk_xdef_prop_xxx() to - * set the values. - */ - - duk_set_length(thr, -1, arr_idx); - - /* [ ... arr ] */ - - DUK_DDD(DUK_DDDPRINT("parse_array: final array is %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - duk__dec_objarr_exit(js_ctx); - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} - -DUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_uint8_t x; - - x = duk__dec_get_nonwhite(js_ctx); - - DUK_DDD(DUK_DDDPRINT("parse_value: initial x=%ld", (long) x)); - - /* Note: duk__dec_req_stridx() backtracks one char */ - - if (x == DUK_ASC_DOUBLEQUOTE) { - duk__dec_string(js_ctx); - } else if ((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_MINUS)) { -#if defined(DUK_USE_JX) - if (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY); /* "-Infinity", '-' has been eaten */ - duk_push_number(thr, -DUK_DOUBLE_INFINITY); - } else { -#else - { /* unconditional block */ -#endif - /* We already ate 'x', so backup one byte. */ - js_ctx->p--; /* safe */ - duk__dec_number(js_ctx); - } - } else if (x == DUK_ASC_LC_T) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE); - duk_push_true(thr); - } else if (x == DUK_ASC_LC_F) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE); - duk_push_false(thr); - } else if (x == DUK_ASC_LC_N) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL); - duk_push_null(thr); -#if defined(DUK_USE_JX) - } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED); - duk_push_undefined(thr); - } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN); - duk_push_nan(thr); - } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) { - duk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY); - duk_push_number(thr, DUK_DOUBLE_INFINITY); - } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) { - duk__dec_pointer(js_ctx); - } else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) { - duk__dec_buffer(js_ctx); -#endif - } else if (x == DUK_ASC_LCURLY) { - duk__dec_object(js_ctx); - } else if (x == DUK_ASC_LBRACKET) { - duk__dec_array(js_ctx); - } else { - /* catches EOF (NUL) */ - goto syntax_error; - } - - duk__dec_eat_white(js_ctx); - - /* [ ... val ] */ - return; - - syntax_error: - duk__dec_syntax_error(js_ctx); - DUK_UNREACHABLE(); -} - -/* Recursive value reviver, implements the Walk() algorithm. No C recursion - * check is done here because the initial parsing step will already ensure - * there is a reasonable limit on C recursion depth and hence object depth. - */ -DUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_hobject *h; - duk_uarridx_t i, arr_len; - - DUK_DDD(DUK_DDDPRINT("walk: top=%ld, holder=%!T, name=%!T", - (long) duk_get_top(thr), - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - duk_dup_top(thr); - duk_get_prop(thr, -3); /* -> [ ... holder name val ] */ - - h = duk_get_hobject(thr, -1); - if (h != NULL) { - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { - arr_len = (duk_uarridx_t) duk_get_length(thr, -1); - for (i = 0; i < arr_len; i++) { - /* [ ... holder name val ] */ - - DUK_DDD(DUK_DDDPRINT("walk: array, top=%ld, i=%ld, arr_len=%ld, holder=%!T, name=%!T, val=%!T", - (long) duk_get_top(thr), (long) i, (long) arr_len, - (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - duk_dup_top(thr); - (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... holder name val val ToString(i) ] */ - duk__dec_reviver_walk(js_ctx); /* -> [ ... holder name val new_elem ] */ - - if (duk_is_undefined(thr, -1)) { - duk_pop(thr); - duk_del_prop_index(thr, -1, i); - } else { - /* XXX: duk_xdef_prop_index_wec() would be more appropriate - * here but it currently makes some assumptions that might - * not hold (e.g. that previous property is not an accessor). - */ - duk_put_prop_index(thr, -2, i); - } - } - } else { - /* [ ... holder name val ] */ - duk_enum(thr, -1, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); - while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) { - DUK_DDD(DUK_DDDPRINT("walk: object, top=%ld, holder=%!T, name=%!T, val=%!T, enum=%!iT, obj_key=%!T", - (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -5), - (duk_tval *) duk_get_tval(thr, -4), (duk_tval *) duk_get_tval(thr, -3), - (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); - - /* [ ... holder name val enum obj_key ] */ - duk_dup_m3(thr); - duk_dup_m2(thr); - - /* [ ... holder name val enum obj_key val obj_key ] */ - duk__dec_reviver_walk(js_ctx); - - /* [ ... holder name val enum obj_key new_elem ] */ - if (duk_is_undefined(thr, -1)) { - duk_pop(thr); - duk_del_prop(thr, -3); - } else { - /* XXX: duk_xdef_prop_index_wec() would be more appropriate - * here but it currently makes some assumptions that might - * not hold (e.g. that previous property is not an accessor). - * - * Using duk_put_prop() works incorrectly with '__proto__' - * if the own property with that name has been deleted. This - * does not happen normally, but a clever reviver can trigger - * that, see complex reviver case in: test-bug-json-parse-__proto__.js. - */ - duk_put_prop(thr, -4); - } - } - duk_pop(thr); /* pop enum */ - } - } - - /* [ ... holder name val ] */ - - duk_dup(thr, js_ctx->idx_reviver); - duk_insert(thr, -4); /* -> [ ... reviver holder name val ] */ - duk_call_method(thr, 2); /* -> [ ... res ] */ - - DUK_DDD(DUK_DDDPRINT("walk: top=%ld, result=%!T", - (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -1))); -} - -/* - * Stringify implementation. - */ - -#define DUK__EMIT_1(js_ctx,ch) duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch)) -#define DUK__EMIT_2(js_ctx,ch1,ch2) duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_fast8_t) (ch2)) -#define DUK__EMIT_HSTR(js_ctx,h) duk__emit_hstring((js_ctx), (h)) -#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) -#define DUK__EMIT_CSTR(js_ctx,p) duk__emit_cstring((js_ctx), (p)) -#endif -#define DUK__EMIT_STRIDX(js_ctx,i) duk__emit_stridx((js_ctx), (i)) -#define DUK__UNEMIT_1(js_ctx) duk__unemit_1((js_ctx)) - -DUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) { - DUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch); -} - -DUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) { - DUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2); -} - -DUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) { - DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); -} - -#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) -DUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) { - DUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str); -} -#endif - -DUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) { - duk_hstring *h; - - DUK_ASSERT_STRIDX_VALID(stridx); - h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); - DUK_ASSERT(h != NULL); - - DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); -} - -DUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) { - DUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1); - DUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1); -} - -#define DUK__MKESC(nybbles,esc1,esc2) \ - (((duk_uint_fast32_t) (nybbles)) << 16) | \ - (((duk_uint_fast32_t) (esc1)) << 8) | \ - ((duk_uint_fast32_t) (esc2)) - -DUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q) { - duk_uint_fast32_t tmp; - duk_small_uint_t dig; - - DUK_UNREF(js_ctx); - - /* Caller ensures space for at least DUK__JSON_MAX_ESC_LEN. */ - - /* Select appropriate escape format automatically, and set 'tmp' to a - * value encoding both the escape format character and the nybble count: - * - * (nybble_count << 16) | (escape_char1) | (escape_char2) - */ - -#if defined(DUK_USE_JX) - if (DUK_LIKELY(cp < 0x100UL)) { - if (DUK_UNLIKELY(js_ctx->flag_ext_custom != 0U)) { - tmp = DUK__MKESC(2, DUK_ASC_BACKSLASH, DUK_ASC_LC_X); - } else { - tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); - } - } else -#endif - if (DUK_LIKELY(cp < 0x10000UL)) { - tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); - } else { -#if defined(DUK_USE_JX) - if (DUK_LIKELY(js_ctx->flag_ext_custom != 0U)) { - tmp = DUK__MKESC(8, DUK_ASC_BACKSLASH, DUK_ASC_UC_U); - } else -#endif - { - /* In compatible mode and standard JSON mode, output - * something useful for non-BMP characters. This won't - * roundtrip but will still be more or less readable and - * more useful than an error. - */ - tmp = DUK__MKESC(8, DUK_ASC_UC_U, DUK_ASC_PLUS); - } - } - - *q++ = (duk_uint8_t) ((tmp >> 8) & 0xff); - *q++ = (duk_uint8_t) (tmp & 0xff); - - tmp = tmp >> 16; - while (tmp > 0) { - tmp--; - dig = (duk_small_uint_t) ((cp >> (4 * tmp)) & 0x0f); - *q++ = duk_lc_digits[dig]; - } - - return q; -} - -DUK_LOCAL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k) { - const duk_int8_t *p, *p_start, *p_end; /* Note: intentionally signed. */ - duk_size_t k_len; - duk_codepoint_t cp; - - DUK_ASSERT(k != NULL); - - /* Accept ASCII strings which conform to identifier requirements - * as being emitted without key quotes. Since we only accept ASCII - * there's no need for actual decoding: 'p' is intentionally signed - * so that bytes >= 0x80 extend to negative values and are rejected - * as invalid identifier codepoints. - */ - - if (js_ctx->flag_avoid_key_quotes) { - k_len = DUK_HSTRING_GET_BYTELEN(k); - p_start = (const duk_int8_t *) DUK_HSTRING_GET_DATA(k); - p_end = p_start + k_len; - p = p_start; - - if (p == p_end) { - /* Zero length string is not accepted without quotes */ - goto quote_normally; - } - cp = (duk_codepoint_t) (*p++); - if (DUK_UNLIKELY(!duk_unicode_is_identifier_start(cp))) { - goto quote_normally; - } - while (p < p_end) { - cp = (duk_codepoint_t) (*p++); - if (DUK_UNLIKELY(!duk_unicode_is_identifier_part(cp))) { - goto quote_normally; - } - } - - /* This seems faster than emitting bytes one at a time and - * then potentially rewinding. - */ - DUK__EMIT_HSTR(js_ctx, k); - return; - } - - quote_normally: - duk__enc_quote_string(js_ctx, k); -} - -/* The Quote(value) operation: quote a string. - * - * Stack policy: [ ] -> [ ]. - */ - -DUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) { - duk_hthread *thr = js_ctx->thr; - const duk_uint8_t *p, *p_start, *p_end, *p_now, *p_tmp; - duk_uint8_t *q; - duk_ucodepoint_t cp; /* typed for duk_unicode_decode_xutf8() */ - - DUK_DDD(DUK_DDDPRINT("duk__enc_quote_string: h_str=%!O", (duk_heaphdr *) h_str)); - - DUK_ASSERT(h_str != NULL); - p_start = DUK_HSTRING_GET_DATA(h_str); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_str); - p = p_start; - - DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); - - /* Encode string in small chunks, estimating the maximum expansion so that - * there's no need to ensure space while processing the chunk. - */ - - while (p < p_end) { - duk_size_t left, now, space; - - left = (duk_size_t) (p_end - p); - now = (left > DUK__JSON_ENCSTR_CHUNKSIZE ? - DUK__JSON_ENCSTR_CHUNKSIZE : left); - - /* Maximum expansion per input byte is 6: - * - invalid UTF-8 byte causes "\uXXXX" to be emitted (6/1 = 6). - * - 2-byte UTF-8 encodes as "\uXXXX" (6/2 = 3). - * - 4-byte UTF-8 encodes as "\Uxxxxxxxx" (10/4 = 2.5). - */ - space = now * 6; - q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); - - p_now = p + now; - - while (p < p_now) { -#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) - duk_uint8_t b; - - b = duk__json_quotestr_lookup[*p++]; - if (DUK_LIKELY(b < 0x80)) { - /* Most input bytes go through here. */ - *q++ = b; - } else if (b >= 0xa0) { - *q++ = DUK_ASC_BACKSLASH; - *q++ = (duk_uint8_t) (b - 0x80); - } else if (b == 0x80) { - cp = (duk_ucodepoint_t) (*(p - 1)); - q = duk__emit_esc_auto_fast(js_ctx, cp, q); - } else if (b == 0x7f && js_ctx->flag_ascii_only) { - /* 0x7F is special */ - DUK_ASSERT(b == 0x81); - cp = (duk_ucodepoint_t) 0x7f; - q = duk__emit_esc_auto_fast(js_ctx, cp, q); - } else { - DUK_ASSERT(b == 0x81); - p--; - - /* slow path is shared */ -#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ - cp = *p; - - if (DUK_LIKELY(cp <= 0x7f)) { - /* ascii fast path: avoid decoding utf-8 */ - p++; - if (cp == 0x22 || cp == 0x5c) { - /* double quote or backslash */ - *q++ = DUK_ASC_BACKSLASH; - *q++ = (duk_uint8_t) cp; - } else if (cp < 0x20) { - duk_uint_fast8_t esc_char; - - /* This approach is a bit shorter than a straight - * if-else-ladder and also a bit faster. - */ - if (cp < (sizeof(duk__json_quotestr_esc) / sizeof(duk_uint8_t)) && - (esc_char = duk__json_quotestr_esc[cp]) != 0) { - *q++ = DUK_ASC_BACKSLASH; - *q++ = (duk_uint8_t) esc_char; - } else { - q = duk__emit_esc_auto_fast(js_ctx, cp, q); - } - } else if (cp == 0x7f && js_ctx->flag_ascii_only) { - q = duk__emit_esc_auto_fast(js_ctx, cp, q); - } else { - /* any other printable -> as is */ - *q++ = (duk_uint8_t) cp; - } - } else { - /* slow path is shared */ -#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ - - /* slow path decode */ - - /* If XUTF-8 decoding fails, treat the offending byte as a codepoint directly - * and go forward one byte. This is of course very lossy, but allows some kind - * of output to be produced even for internal strings which don't conform to - * XUTF-8. All standard Ecmascript strings are always CESU-8, so this behavior - * does not violate the Ecmascript specification. The behavior is applied to - * all modes, including Ecmascript standard JSON. Because the current XUTF-8 - * decoding is not very strict, this behavior only really affects initial bytes - * and truncated codepoints. - * - * Another alternative would be to scan forwards to start of next codepoint - * (or end of input) and emit just one replacement codepoint. - */ - - p_tmp = p; - if (!duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) { - /* Decode failed. */ - cp = *p_tmp; - p = p_tmp + 1; - } - -#if defined(DUK_USE_NONSTD_JSON_ESC_U2028_U2029) - if (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) { -#else - if (js_ctx->flag_ascii_only) { -#endif - q = duk__emit_esc_auto_fast(js_ctx, cp, q); - } else { - /* as is */ - DUK_RAW_WRITE_XUTF8(q, cp); - } - } - } - - DUK_BW_SET_PTR(thr, &js_ctx->bw, q); - } - - DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); -} - -/* Encode a double (checked by caller) from stack top. Stack top may be - * replaced by serialized string but is not popped (caller does that). - */ -DUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) { - duk_hthread *thr; - duk_tval *tv; - duk_double_t d; - duk_small_int_t c; - duk_small_int_t s; - duk_small_uint_t stridx; - duk_small_uint_t n2s_flags; - duk_hstring *h_str; - - DUK_ASSERT(js_ctx != NULL); - thr = js_ctx->thr; - DUK_ASSERT(thr != NULL); - - /* Caller must ensure 'tv' is indeed a double and not a fastint! */ - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); - d = DUK_TVAL_GET_DOUBLE(tv); - - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - s = (duk_small_int_t) DUK_SIGNBIT(d); - DUK_UNREF(s); - - if (DUK_LIKELY(!(c == DUK_FP_INFINITE || c == DUK_FP_NAN))) { - DUK_ASSERT(DUK_ISFINITE(d)); - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - /* Negative zero needs special handling in JX/JC because - * it would otherwise serialize to '0', not '-0'. - */ - if (DUK_UNLIKELY(c == DUK_FP_ZERO && s != 0 && - (js_ctx->flag_ext_custom_or_compatible))) { - duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_ZERO); /* '-0' */ - } else -#endif /* DUK_USE_JX || DUK_USE_JC */ - { - n2s_flags = 0; - /* [ ... number ] -> [ ... string ] */ - duk_numconv_stringify(thr, 10 /*radix*/, 0 /*digits*/, n2s_flags); - } - h_str = duk_known_hstring(thr, -1); - DUK__EMIT_HSTR(js_ctx, h_str); - return; - } - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | - DUK_JSON_FLAG_EXT_COMPATIBLE))) { - stridx = DUK_STRIDX_LC_NULL; - } else if (c == DUK_FP_NAN) { - stridx = js_ctx->stridx_custom_nan; - } else if (s == 0) { - stridx = js_ctx->stridx_custom_posinf; - } else { - stridx = js_ctx->stridx_custom_neginf; - } -#else - stridx = DUK_STRIDX_LC_NULL; -#endif - DUK__EMIT_STRIDX(js_ctx, stridx); -} - -#if defined(DUK_USE_FASTINT) -/* Encode a fastint from duk_tval ptr, no value stack effects. */ -DUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) { - duk_int64_t v; - - /* Fastint range is signed 48-bit so longest value is -2^47 = -140737488355328 - * (16 chars long), longest signed 64-bit value is -2^63 = -9223372036854775808 - * (20 chars long). Alloc space for 64-bit range to be safe. - */ - duk_uint8_t buf[20 + 1]; - - /* Caller must ensure 'tv' is indeed a fastint! */ - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); - v = DUK_TVAL_GET_FASTINT(tv); - - /* XXX: There are no format strings in duk_config.h yet, could add - * one for formatting duk_int64_t. For now, assumes "%lld" and that - * "long long" type exists. Could also rely on C99 directly but that - * won't work for older MSVC. - */ - DUK_SPRINTF((char *) buf, "%lld", (long long) v); - DUK__EMIT_CSTR(js_ctx, (const char *) buf); -} -#endif - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) -#if defined(DUK_USE_HEX_FASTPATH) -DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) { - duk_uint8_t *q; - duk_uint16_t *q16; - duk_small_uint_t x; - duk_size_t i, len_safe; -#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) - duk_bool_t shift_dst; -#endif - - /* Unlike in duk_hex_encode() 'dst' is not necessarily aligned by 2. - * For platforms where unaligned accesses are not allowed, shift 'dst' - * ahead by 1 byte to get alignment and then DUK_MEMMOVE() the result - * in place. The faster encoding loop makes up the difference. - * There's always space for one extra byte because a terminator always - * follows the hex data and that's been accounted for by the caller. - */ - -#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) - q16 = (duk_uint16_t *) (void *) dst; -#else - shift_dst = (duk_bool_t) (((duk_size_t) dst) & 0x01U); - if (shift_dst) { - DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst not aligned -> step to dst + 1")); - q16 = (duk_uint16_t *) (void *) (dst + 1); - } else { - DUK_DD(DUK_DDPRINT("unaligned accesses not possible, dst is aligned")); - q16 = (duk_uint16_t *) (void *) dst; - } - DUK_ASSERT((((duk_size_t) q16) & 0x01U) == 0); -#endif - - len_safe = src_len & ~0x03U; - for (i = 0; i < len_safe; i += 4) { - q16[0] = duk_hex_enctab[src[i]]; - q16[1] = duk_hex_enctab[src[i + 1]]; - q16[2] = duk_hex_enctab[src[i + 2]]; - q16[3] = duk_hex_enctab[src[i + 3]]; - q16 += 4; - } - q = (duk_uint8_t *) q16; - -#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE) - if (shift_dst) { - q--; - DUK_MEMMOVE((void *) dst, (const void *) (dst + 1), 2 * len_safe); - DUK_ASSERT(dst + 2 * len_safe == q); - } -#endif - - for (; i < src_len; i++) { - x = src[i]; - *q++ = duk_lc_digits[x >> 4]; - *q++ = duk_lc_digits[x & 0x0f]; - } - - return q; -} -#else /* DUK_USE_HEX_FASTPATH */ -DUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) { - const duk_uint8_t *p; - const duk_uint8_t *p_end; - duk_uint8_t *q; - duk_small_uint_t x; - - p = src; - p_end = src + src_len; - q = dst; - while (p != p_end) { - x = *p++; - *q++ = duk_lc_digits[x >> 4]; - *q++ = duk_lc_digits[x & 0x0f]; - } - - return q; -} -#endif /* DUK_USE_HEX_FASTPATH */ - -DUK_LOCAL void duk__enc_buffer_data(duk_json_enc_ctx *js_ctx, duk_uint8_t *buf_data, duk_size_t buf_len) { - duk_hthread *thr; - duk_uint8_t *q; - duk_size_t space; - - thr = js_ctx->thr; - - DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */ - DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible); - - /* Buffer values are encoded in (lowercase) hex to make the - * binary data readable. Base64 or similar would be more - * compact but less readable, and the point of JX/JC - * variants is to be as useful to a programmer as possible. - */ - - /* The #if defined() clutter here needs to handle the three - * cases: (1) JX+JC, (2) JX only, (3) JC only. - */ - - /* Note: space must cater for both JX and JC. */ - space = 9 + buf_len * 2 + 2; - DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7ffffffeUL); - DUK_ASSERT((space - 2) / 2 >= buf_len); /* overflow not possible, buffer limits */ - q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); - -#if defined(DUK_USE_JX) && defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom) -#endif -#if defined(DUK_USE_JX) - { - *q++ = DUK_ASC_PIPE; - q = duk__enc_buffer_data_hex(buf_data, buf_len, q); - *q++ = DUK_ASC_PIPE; - - } -#endif -#if defined(DUK_USE_JX) && defined(DUK_USE_JC) - else -#endif -#if defined(DUK_USE_JC) - { - DUK_ASSERT(js_ctx->flag_ext_compatible); - DUK_MEMCPY((void *) q, (const void *) "{\"_buf\":\"", 9); /* len: 9 */ - q += 9; - q = duk__enc_buffer_data_hex(buf_data, buf_len, q); - *q++ = DUK_ASC_DOUBLEQUOTE; - *q++ = DUK_ASC_RCURLY; - } -#endif - - DUK_BW_SET_PTR(thr, &js_ctx->bw, q); -} - -DUK_LOCAL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) { - duk__enc_buffer_data(js_ctx, - (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h), - (duk_size_t) DUK_HBUFFER_GET_SIZE(h)); -} -#endif /* DUK_USE_JX || DUK_USE_JC */ - -#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) -DUK_LOCAL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) { - duk_size_t i, n; - const duk_uint8_t *buf; - duk_uint8_t *q; - - n = DUK_HBUFFER_GET_SIZE(h); - if (n == 0) { - DUK__EMIT_2(js_ctx, DUK_ASC_LCURLY, DUK_ASC_RCURLY); - return; - } - - DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); - - /* Maximum encoded length with 32-bit index: 1 + 10 + 2 + 3 + 1 + 1 = 18, - * with 64-bit index: 1 + 20 + 2 + 3 + 1 + 1 = 28. 32 has some slack. - * - * Note that because the output buffer is reallocated from time to time, - * side effects (such as finalizers) affecting the buffer 'h' must be - * disabled. This is the case in the JSON.stringify() fast path. - */ - - buf = (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h); - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - for (i = 0; i < n; i++) { - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth + 1); - q = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, 32); - q += DUK_SPRINTF((char *) q, "\"%lu\": %u,", (unsigned long) i, (unsigned int) buf[i]); - DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q); - } - } else { - q = DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw); - for (i = 0; i < n; i++) { - q = DUK_BW_ENSURE_RAW(js_ctx->thr, &js_ctx->bw, 32, q); - q += DUK_SPRINTF((char *) q, "\"%lu\":%u,", (unsigned long) i, (unsigned int) buf[i]); - } - DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q); - } - DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ - - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); - } - DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); -} -#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) -DUK_LOCAL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr) { - char buf[64]; /* XXX: how to figure correct size? */ - const char *fmt; - - DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); /* caller checks */ - DUK_ASSERT(js_ctx->flag_ext_custom_or_compatible); - - DUK_MEMZERO(buf, sizeof(buf)); - - /* The #if defined() clutter here needs to handle the three - * cases: (1) JX+JC, (2) JX only, (3) JC only. - */ -#if defined(DUK_USE_JX) && defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom) -#endif -#if defined(DUK_USE_JX) - { - fmt = ptr ? "(%p)" : "(null)"; - } -#endif -#if defined(DUK_USE_JX) && defined(DUK_USE_JC) - else -#endif -#if defined(DUK_USE_JC) - { - DUK_ASSERT(js_ctx->flag_ext_compatible); - fmt = ptr ? "{\"_ptr\":\"%p\"}" : "{\"_ptr\":\"null\"}"; - } -#endif - - /* When ptr == NULL, the format argument is unused. */ - DUK_SNPRINTF(buf, sizeof(buf) - 1, fmt, ptr); /* must not truncate */ - DUK__EMIT_CSTR(js_ctx, buf); -} -#endif /* DUK_USE_JX || DUK_USE_JC */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) -DUK_LOCAL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj) { - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - if (h_bufobj->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) { - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); - } else { - /* Handle both full and partial slice (as long as covered). */ - duk__enc_buffer_data(js_ctx, - (duk_uint8_t *) DUK_HBUFOBJ_GET_SLICE_BASE(js_ctx->thr->heap, h_bufobj), - (duk_size_t) h_bufobj->length); - } -} -#endif /* DUK_USE_JX || DUK_USE_JC */ -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* Indent helper. Calling code relies on js_ctx->recursion_depth also being - * directly related to indent depth. - */ -#if defined(DUK_USE_PREFER_SIZE) -DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) { - DUK_ASSERT(js_ctx->h_gap != NULL); - DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */ - - DUK__EMIT_1(js_ctx, 0x0a); - while (depth-- > 0) { - DUK__EMIT_HSTR(js_ctx, js_ctx->h_gap); - } -} -#else /* DUK_USE_PREFER_SIZE */ -DUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) { - const duk_uint8_t *gap_data; - duk_size_t gap_len; - duk_size_t avail_bytes; /* bytes of indent available for copying */ - duk_size_t need_bytes; /* bytes of indent still needed */ - duk_uint8_t *p_start; - duk_uint8_t *p; - - DUK_ASSERT(js_ctx->h_gap != NULL); - DUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0); /* caller guarantees */ - - DUK__EMIT_1(js_ctx, 0x0a); - if (DUK_UNLIKELY(depth == 0)) { - return; - } - - /* To handle deeper indents efficiently, make use of copies we've - * already emitted. In effect we can emit a sequence of 1, 2, 4, - * 8, etc copies, and then finish the last run. Byte counters - * avoid multiply with gap_len on every loop. - */ - - gap_data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(js_ctx->h_gap); - gap_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap); - DUK_ASSERT(gap_len > 0); - - need_bytes = gap_len * depth; - p = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, need_bytes); - p_start = p; - - DUK_MEMCPY((void *) p, (const void *) gap_data, (size_t) gap_len); - p += gap_len; - avail_bytes = gap_len; - DUK_ASSERT(need_bytes >= gap_len); - need_bytes -= gap_len; - - while (need_bytes >= avail_bytes) { - DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) avail_bytes); - p += avail_bytes; - need_bytes -= avail_bytes; - avail_bytes <<= 1; - } - - DUK_ASSERT(need_bytes < avail_bytes); /* need_bytes may be zero */ - DUK_MEMCPY((void *) p, (const void *) p_start, (size_t) need_bytes); - p += need_bytes; - /*avail_bytes += need_bytes*/ - - DUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, p); -} -#endif /* DUK_USE_PREFER_SIZE */ - -/* Shared entry handling for object/array serialization. */ -DUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { - duk_hthread *thr = js_ctx->thr; - duk_hobject *h_target; - duk_uint_fast32_t i, n; - - *entry_top = duk_get_top(thr); - - duk_require_stack(thr, DUK_JSON_ENC_REQSTACK); - - /* Loop check using a hybrid approach: a fixed-size visited[] array - * with overflow in a loop check object. - */ - - h_target = duk_known_hobject(thr, -1); /* object or array */ - - n = js_ctx->recursion_depth; - if (DUK_UNLIKELY(n > DUK_JSON_ENC_LOOPARRAY)) { - n = DUK_JSON_ENC_LOOPARRAY; - } - for (i = 0; i < n; i++) { - if (DUK_UNLIKELY(js_ctx->visiting[i] == h_target)) { - DUK_DD(DUK_DDPRINT("slow path loop detect")); - DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT); - } - } - if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) { - js_ctx->visiting[js_ctx->recursion_depth] = h_target; - } else { - duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target); - duk_dup_top(thr); /* -> [ ... voidp voidp ] */ - if (duk_has_prop(thr, js_ctx->idx_loop)) { - DUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT); - } - duk_push_true(thr); /* -> [ ... voidp true ] */ - duk_put_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */ - } - - /* C recursion check. */ - - DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { - DUK_ERROR_RANGE(thr, DUK_STR_JSONENC_RECLIMIT); - } - js_ctx->recursion_depth++; - - DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", - (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop))); -} - -/* Shared exit handling for object/array serialization. */ -DUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) { - duk_hthread *thr = js_ctx->thr; - duk_hobject *h_target; - - /* C recursion check. */ - - DUK_ASSERT(js_ctx->recursion_depth > 0); - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - js_ctx->recursion_depth--; - - /* Loop check. */ - - h_target = duk_known_hobject(thr, *entry_top - 1); /* original target at entry_top - 1 */ - - if (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) { - /* Previous entry was inside visited[], nothing to do. */ - } else { - duk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target); - duk_del_prop(thr, js_ctx->idx_loop); /* -> [ ... ] */ - } - - /* Restore stack top after unbalanced code paths. */ - duk_set_top(thr, *entry_top); - - DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", - (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop))); -} - -/* The JO(value) operation: encode object. - * - * Stack policy: [ object ] -> [ object ]. - */ -DUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_hstring *h_key; - duk_idx_t entry_top; - duk_idx_t idx_obj; - duk_idx_t idx_keys; - duk_bool_t emitted; - duk_uarridx_t arr_len, i; - duk_size_t prev_size; - - DUK_DDD(DUK_DDDPRINT("duk__enc_object: obj=%!T", (duk_tval *) duk_get_tval(thr, -1))); - - duk__enc_objarr_entry(js_ctx, &entry_top); - - idx_obj = entry_top - 1; - - if (js_ctx->idx_proplist >= 0) { - idx_keys = js_ctx->idx_proplist; - } else { - /* XXX: would be nice to enumerate an object at specified index */ - duk_dup(thr, idx_obj); - (void) duk_hobject_get_enumerated_keys(thr, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); /* [ ... target ] -> [ ... target keys ] */ - idx_keys = duk_require_normalize_index(thr, -1); - /* leave stack unbalanced on purpose */ - } - - DUK_DDD(DUK_DDDPRINT("idx_keys=%ld, h_keys=%!T", - (long) idx_keys, (duk_tval *) duk_get_tval(thr, idx_keys))); - - /* Steps 8-10 have been merged to avoid a "partial" variable. */ - - DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); - - /* XXX: keys is an internal object with all keys to be processed - * in its (gapless) array part. Because nobody can touch the keys - * object, we could iterate its array part directly (keeping in mind - * that it can be reallocated). - */ - - arr_len = (duk_uarridx_t) duk_get_length(thr, idx_keys); - emitted = 0; - for (i = 0; i < arr_len; i++) { - duk_get_prop_index(thr, idx_keys, i); /* -> [ ... key ] */ - - DUK_DDD(DUK_DDDPRINT("object property loop: holder=%!T, key=%!T", - (duk_tval *) duk_get_tval(thr, idx_obj), - (duk_tval *) duk_get_tval(thr, -1))); - - h_key = duk_known_hstring(thr, -1); - DUK_ASSERT(h_key != NULL); - DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(h_key)); /* proplist filtering; enum options */ - - prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw); - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); - duk__enc_key_autoquote(js_ctx, h_key); - DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE); - } else { - duk__enc_key_autoquote(js_ctx, h_key); - DUK__EMIT_1(js_ctx, DUK_ASC_COLON); - } - - /* [ ... key ] */ - - if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_obj) == 0)) { - /* Value would yield 'undefined', so skip key altogether. - * Side effects have already happened. - */ - DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size); - } else { - DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); - emitted = 1; - } - - /* [ ... ] */ - } - - if (emitted) { - DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); - DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - DUK_ASSERT(js_ctx->recursion_depth >= 1); - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); - } - } - DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); - - duk__enc_objarr_exit(js_ctx, &entry_top); - - DUK_ASSERT_TOP(thr, entry_top); -} - -/* The JA(value) operation: encode array. - * - * Stack policy: [ array ] -> [ array ]. - */ -DUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) { - duk_hthread *thr = js_ctx->thr; - duk_idx_t entry_top; - duk_idx_t idx_arr; - duk_bool_t emitted; - duk_uarridx_t i, arr_len; - - DUK_DDD(DUK_DDDPRINT("duk__enc_array: array=%!T", - (duk_tval *) duk_get_tval(thr, -1))); - - duk__enc_objarr_entry(js_ctx, &entry_top); - - idx_arr = entry_top - 1; - - /* Steps 8-10 have been merged to avoid a "partial" variable. */ - - DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); - - arr_len = (duk_uarridx_t) duk_get_length(thr, idx_arr); - emitted = 0; - for (i = 0; i < arr_len; i++) { - DUK_DDD(DUK_DDDPRINT("array entry loop: array=%!T, index=%ld, arr_len=%ld", - (duk_tval *) duk_get_tval(thr, idx_arr), - (long) i, (long) arr_len)); - - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - DUK_ASSERT(js_ctx->recursion_depth >= 1); - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); - } - - (void) duk_push_uint_to_hstring(thr, (duk_uint_t) i); /* -> [ ... key ] */ - - /* [ ... key ] */ - - if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_arr) == 0)) { - /* Value would normally be omitted, replace with 'null'. */ - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); - } else { - ; - } - - /* [ ... ] */ - - DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); - emitted = 1; - } - - if (emitted) { - DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); - DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - DUK_ASSERT(js_ctx->recursion_depth >= 1); - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); - } - } - DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); - - duk__enc_objarr_exit(js_ctx, &entry_top); - - DUK_ASSERT_TOP(thr, entry_top); -} - -/* The Str(key, holder) operation. - * - * Stack policy: [ ... key ] -> [ ... ] - */ -DUK_LOCAL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) { - duk_hthread *thr = js_ctx->thr; - duk_tval *tv; - duk_tval *tv_holder; - duk_tval *tv_key; - duk_small_int_t c; - - DUK_DDD(DUK_DDDPRINT("duk__enc_value: idx_holder=%ld, holder=%!T, key=%!T", - (long) idx_holder, (duk_tval *) duk_get_tval(thr, idx_holder), - (duk_tval *) duk_get_tval(thr, -1))); - - tv_holder = DUK_GET_TVAL_POSIDX(thr, idx_holder); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_holder)); - tv_key = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv_key)); - DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING(tv_key))); /* Caller responsible. */ - (void) duk_hobject_getprop(thr, tv_holder, tv_key); - - /* -> [ ... key val ] */ - - DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); - - /* Standard JSON checks for .toJSON() only for actual objects; for - * example, setting Number.prototype.toJSON and then serializing a - * number won't invoke the .toJSON() method. However, lightfuncs and - * plain buffers mimic objects so we check for their .toJSON() method. - */ - if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_LIGHTFUNC | - DUK_TYPE_MASK_BUFFER)) { - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_JSON); - if (duk_is_callable(thr, -1)) { /* toJSON() can also be a lightfunc */ - DUK_DDD(DUK_DDDPRINT("value is object, has callable toJSON() -> call it")); - /* XXX: duk_dup_unvalidated(thr, -2) etc. */ - duk_dup_m2(thr); /* -> [ ... key val toJSON val ] */ - duk_dup_m4(thr); /* -> [ ... key val toJSON val key ] */ - duk_call_method(thr, 1); /* -> [ ... key val val' ] */ - duk_remove_m2(thr); /* -> [ ... key val' ] */ - } else { - duk_pop(thr); /* -> [ ... key val ] */ - } - } - - /* [ ... key val ] */ - - DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); - - if (js_ctx->h_replacer) { - /* XXX: Here a "slice copy" would be useful. */ - DUK_DDD(DUK_DDDPRINT("replacer is set, call replacer")); - duk_push_hobject(thr, js_ctx->h_replacer); /* -> [ ... key val replacer ] */ - duk_dup(thr, idx_holder); /* -> [ ... key val replacer holder ] */ - duk_dup_m4(thr); /* -> [ ... key val replacer holder key ] */ - duk_dup_m4(thr); /* -> [ ... key val replacer holder key val ] */ - duk_call_method(thr, 2); /* -> [ ... key val val' ] */ - duk_remove_m2(thr); /* -> [ ... key val' ] */ - } - - /* [ ... key val ] */ - - DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); - - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (DUK_HOBJECT_IS_BUFOBJ(h) && - js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) { - /* With JX/JC a bufferobject gets serialized specially. */ - duk_hbufobj *h_bufobj; - h_bufobj = (duk_hbufobj *) h; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - duk__enc_bufobj(js_ctx, h_bufobj); - goto pop2_emitted; - } - /* Otherwise bufferobjects get serialized as normal objects. */ -#endif /* JX || JC */ -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); - switch (c) { - case DUK_HOBJECT_CLASS_NUMBER: { - DUK_DDD(DUK_DDDPRINT("value is a Number object -> coerce with ToNumber()")); - duk_to_number_m1(thr); - /* The coercion potentially invokes user .valueOf() and .toString() - * but can't result in a function value because ToPrimitive() would - * reject such a result: test-dev-json-stringify-coercion-1.js. - */ - DUK_ASSERT(!duk_is_callable(thr, -1)); - break; - } - case DUK_HOBJECT_CLASS_STRING: { - DUK_DDD(DUK_DDDPRINT("value is a String object -> coerce with ToString()")); - duk_to_string(thr, -1); - /* Same coercion behavior as for Number. */ - DUK_ASSERT(!duk_is_callable(thr, -1)); - break; - } -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - case DUK_HOBJECT_CLASS_POINTER: -#endif - case DUK_HOBJECT_CLASS_BOOLEAN: { - DUK_DDD(DUK_DDDPRINT("value is a Boolean/Buffer/Pointer object -> get internal value")); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - duk_remove_m2(thr); - break; - } - default: { - /* Normal object which doesn't get automatically coerced to a - * primitive value. Functions are checked for specially. The - * primitive value coercions for Number, String, Pointer, and - * Boolean can't result in functions so suffices to check here. - * Symbol objects are handled like plain objects (their primitive - * value is NOT looked up like for e.g. String objects). - */ - DUK_ASSERT(h != NULL); - if (DUK_HOBJECT_IS_CALLABLE(h)) { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | - DUK_JSON_FLAG_EXT_COMPATIBLE)) { - /* We only get here when doing non-standard JSON encoding */ - DUK_DDD(DUK_DDDPRINT("-> function allowed, serialize to custom format")); - DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); - goto pop2_emitted; - } else { - DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)")); - goto pop2_undef; - } -#else /* DUK_USE_JX || DUK_USE_JC */ - DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)")); - goto pop2_undef; -#endif /* DUK_USE_JX || DUK_USE_JC */ - } - } - } /* end switch */ - } - - /* [ ... key val ] */ - - DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(thr, -1))); - - if (duk_check_type_mask(thr, -1, js_ctx->mask_for_undefined)) { - /* will result in undefined */ - DUK_DDD(DUK_DDDPRINT("-> will result in undefined (type mask check)")); - goto pop2_undef; - } - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - - switch (DUK_TVAL_GET_TAG(tv)) { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - /* When JX/JC not in use, the type mask above will avoid this case if needed. */ - case DUK_TAG_UNDEFINED: { - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); - break; - } -#endif - case DUK_TAG_NULL: { - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); - break; - } - case DUK_TAG_BOOLEAN: { - DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? - DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); - break; - } -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - /* When JX/JC not in use, the type mask above will avoid this case if needed. */ - case DUK_TAG_POINTER: { - duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv)); - break; - } -#endif /* DUK_USE_JX || DUK_USE_JC */ - case DUK_TAG_STRING: { - duk_hstring *h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - goto pop2_undef; - } - duk__enc_quote_string(js_ctx, h); - break; - } - case DUK_TAG_OBJECT: { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - /* Function values are handled completely above (including - * coercion results): - */ - DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE(h)); - - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { - duk__enc_array(js_ctx); - } else { - duk__enc_object(js_ctx); - } - break; - } - /* Because plain buffers mimics Uint8Array, they have enumerable - * index properties [0,byteLength[. Because JSON only serializes - * enumerable own properties, no properties can be serialized for - * plain buffers (all virtual properties are non-enumerable). However, - * there may be a .toJSON() method which was already handled above. - */ - case DUK_TAG_BUFFER: { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom_or_compatible) { - duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv)); - break; - } -#endif - - /* Could implement a fastpath, but the fast path would need - * to handle realloc side effects correctly. - */ - duk_to_object(thr, -1); - duk__enc_object(js_ctx); - break; - } - case DUK_TAG_LIGHTFUNC: { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - /* We only get here when doing non-standard JSON encoding */ - DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); -#else - /* Standard JSON omits functions */ - DUK_UNREACHABLE(); -#endif - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: - /* Number serialization has a significant impact relative to - * other fast path code, so careful fast path for fastints. - */ - duk__enc_fastint_tval(js_ctx, tv); - break; -#endif - default: { - /* number */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - /* XXX: A fast path for usual integers would be useful when - * fastint support is not enabled. - */ - duk__enc_double(js_ctx); - break; - } - } - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - pop2_emitted: -#endif - duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */ - return 1; /* emitted */ - - pop2_undef: - duk_pop_2(thr); /* [ ... key val ] -> [ ... ] */ - return 0; /* not emitted */ -} - -/* E5 Section 15.12.3, main algorithm, step 4.b.ii steps 1-4. */ -DUK_LOCAL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv) { - duk_small_int_t c; - - /* XXX: some kind of external internal type checker? - * - type mask; symbol flag; class mask - */ - DUK_ASSERT(tv != NULL); - if (DUK_TVAL_IS_STRING(tv)) { - duk_hstring *h; - h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - return 0; - } - return 1; - } else if (DUK_TVAL_IS_NUMBER(tv)) { - return 1; - } else if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h; - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); - if (c == DUK_HOBJECT_CLASS_STRING || c == DUK_HOBJECT_CLASS_NUMBER) { - return 1; - } - } - - return 0; -} - -/* - * JSON.stringify() fast path - * - * Otherwise supports full JSON, JX, and JC features, but bails out on any - * possible side effect which might change the value being serialized. The - * fast path can take advantage of the fact that the value being serialized - * is unchanged so that we can walk directly through property tables etc. - */ - -#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) -DUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) { - duk_uint_fast32_t i, n; - - DUK_DDD(DUK_DDDPRINT("stringify fast: %!T", tv)); - - DUK_ASSERT(js_ctx != NULL); - DUK_ASSERT(js_ctx->thr != NULL); - -#if 0 /* disabled for now */ - restart_match: -#endif - - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible) { - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); - break; - } else { - goto emit_undefined; - } -#else - goto emit_undefined; -#endif - } - case DUK_TAG_NULL: { - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); - break; - } - case DUK_TAG_BOOLEAN: { - DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? - DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); - break; - } - case DUK_TAG_STRING: { - duk_hstring *h; - h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - goto emit_undefined; - } - duk__enc_quote_string(js_ctx, h); - break; - } - case DUK_TAG_OBJECT: { - duk_hobject *obj; - duk_tval *tv_val; - duk_bool_t emitted = 0; - duk_uint32_t c_bit, c_all, c_array, c_unbox, c_undef, - c_func, c_bufobj, c_object, c_abort; - - /* For objects JSON.stringify() only looks for own, enumerable - * properties which is nice for the fast path here. - * - * For arrays JSON.stringify() uses [[Get]] so it will actually - * inherit properties during serialization! This fast path - * supports gappy arrays as long as there's no actual inherited - * property (which might be a getter etc). - * - * Since recursion only happens for objects, we can have both - * recursion and loop checks here. We use a simple, depth-limited - * loop check in the fast path because the object-based tracking - * is very slow (when tested, it accounted for 50% of fast path - * execution time for input data with a lot of small objects!). - */ - - /* XXX: for real world code, could just ignore array inheritance - * and only look at array own properties. - */ - - /* We rely on a few object flag / class number relationships here, - * assert for them. - */ - - obj = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(obj != NULL); - DUK_ASSERT_HOBJECT_VALID(obj); - - /* Once recursion depth is increased, exit path must decrease - * it (though it's OK to abort the fast path). - */ - - DUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0); /* unsigned */ - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { - DUK_DD(DUK_DDPRINT("fast path recursion limit")); - DUK_ERROR_RANGE(js_ctx->thr, DUK_STR_JSONDEC_RECLIMIT); - } - - for (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) { - if (DUK_UNLIKELY(js_ctx->visiting[i] == obj)) { - DUK_DD(DUK_DDPRINT("fast path loop detect")); - DUK_ERROR_TYPE(js_ctx->thr, DUK_STR_CYCLIC_INPUT); - } - } - - /* Guaranteed by recursion_limit setup so we don't have to - * check twice. - */ - DUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY); - js_ctx->visiting[js_ctx->recursion_depth] = obj; - js_ctx->recursion_depth++; - - /* If object has a .toJSON() property, we can't be certain - * that it wouldn't mutate any value arbitrarily, so bail - * out of the fast path. - * - * If an object is a Proxy we also can't avoid side effects - * so abandon. - */ - /* XXX: non-callable .toJSON() doesn't need to cause an abort - * but does at the moment, probably not worth fixing. - */ - if (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) || - DUK_HOBJECT_IS_PROXY(obj)) { - DUK_DD(DUK_DDPRINT("object has a .toJSON property or object is a Proxy, abort fast path")); - goto abort_fastpath; - } - - /* We could use a switch-case for the class number but it turns out - * a small if-else ladder on class masks is better. The if-ladder - * should be in order of relevancy. - */ - - /* XXX: move masks to js_ctx? they don't change during one - * fast path invocation. - */ - DUK_ASSERT(DUK_HOBJECT_CLASS_MAX <= 31); -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom_or_compatible) { - c_all = DUK_HOBJECT_CMASK_ALL; - c_array = DUK_HOBJECT_CMASK_ARRAY; - c_unbox = DUK_HOBJECT_CMASK_NUMBER | - DUK_HOBJECT_CMASK_STRING | - DUK_HOBJECT_CMASK_BOOLEAN | - DUK_HOBJECT_CMASK_POINTER; /* Symbols are not unboxed. */ - c_func = DUK_HOBJECT_CMASK_FUNCTION; - c_bufobj = DUK_HOBJECT_CMASK_ALL_BUFOBJS; - c_undef = 0; - c_abort = 0; - c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort); - } - else -#endif - { - c_all = DUK_HOBJECT_CMASK_ALL; - c_array = DUK_HOBJECT_CMASK_ARRAY; - c_unbox = DUK_HOBJECT_CMASK_NUMBER | - DUK_HOBJECT_CMASK_STRING | - DUK_HOBJECT_CMASK_BOOLEAN; /* Symbols are not unboxed. */ - c_func = 0; - c_bufobj = 0; - c_undef = DUK_HOBJECT_CMASK_FUNCTION | - DUK_HOBJECT_CMASK_POINTER; - /* As the fast path doesn't currently properly support - * duk_hbufobj virtual properties, abort fast path if - * we encounter them in plain JSON mode. - */ - c_abort = DUK_HOBJECT_CMASK_ALL_BUFOBJS; - c_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort); - } - - c_bit = (duk_uint32_t) DUK_HOBJECT_GET_CLASS_MASK(obj); - if (c_bit & c_object) { - /* All other object types. */ - DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); - - /* A non-Array object should not have an array part in practice. - * But since it is supported internally (and perhaps used at some - * point), check and abandon if that's the case. - */ - if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - DUK_DD(DUK_DDPRINT("non-Array object has array part, abort fast path")); - goto abort_fastpath; - } - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(obj); i++) { - duk_hstring *k; - duk_size_t prev_size; - - k = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i); - if (!k) { - continue; - } - if (DUK_HSTRING_HAS_ARRIDX(k)) { - /* If an object has array index keys we would need - * to sort them into the ES2015 enumeration order to - * be consistent with the slow path. Abort the fast - * path and handle in the slow path for now. - */ - DUK_DD(DUK_DDPRINT("property key is an array index, abort fast path")); - goto abort_fastpath; - } - if (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) { - continue; - } - if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) { - /* Getter might have arbitrary side effects, - * so bail out. - */ - DUK_DD(DUK_DDPRINT("property is an accessor, abort fast path")); - goto abort_fastpath; - } - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) { - continue; - } - - tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i); - - prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw); - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); - duk__enc_key_autoquote(js_ctx, k); - DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE); - } else { - duk__enc_key_autoquote(js_ctx, k); - DUK__EMIT_1(js_ctx, DUK_ASC_COLON); - } - - if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) { - DUK_DD(DUK_DDPRINT("prop value not supported, rewind key and colon")); - DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size); - } else { - DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); - emitted = 1; - } - } - - /* If any non-Array value had enumerable virtual own - * properties, they should be serialized here (actually, - * before the explicit properties). Standard types don't. - */ - - if (emitted) { - DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); - DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - DUK_ASSERT(js_ctx->recursion_depth >= 1); - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); - } - } - DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); - } else if (c_bit & c_array) { - duk_uint_fast32_t arr_len; - duk_uint_fast32_t asize; - - DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); - - /* Assume arrays are dense in the fast path. */ - if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - DUK_DD(DUK_DDPRINT("Array object is sparse, abort fast path")); - goto abort_fastpath; - } - - arr_len = (duk_uint_fast32_t) ((duk_harray *) obj)->length; - asize = (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj); - /* Array part may be larger than 'length'; if so, iterate - * only up to array 'length'. Array part may also be smaller - * than 'length' in some cases. - */ - for (i = 0; i < arr_len; i++) { - duk_tval *tv_arrval; - duk_hstring *h_tmp; - duk_bool_t has_inherited; - - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth); - } - - if (DUK_LIKELY(i < asize)) { - tv_arrval = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i); - if (DUK_LIKELY(!DUK_TVAL_IS_UNUSED(tv_arrval))) { - /* Expected case: element is present. */ - if (duk__json_stringify_fast_value(js_ctx, tv_arrval) == 0) { - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); - } - goto elem_done; - } - } - - /* Gap in array; check for inherited property, - * bail out if one exists. This should be enough - * to support gappy arrays for all practical code. - */ - - h_tmp = duk_push_uint_to_hstring(js_ctx->thr, (duk_uint_t) i); - has_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp); - duk_pop(js_ctx->thr); - if (has_inherited) { - DUK_D(DUK_DPRINT("gap in array, conflicting inherited property, abort fast path")); - goto abort_fastpath; - } - - /* Ordinary gap, undefined encodes to 'null' in - * standard JSON, but JX/JC use their form for - * undefined to better preserve the typing. - */ - DUK_D(DUK_DPRINT("gap in array, no conflicting inherited property, remain on fast path")); -#if defined(DUK_USE_JX) - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); -#else - DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); -#endif - /* fall through */ - - elem_done: - DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); - emitted = 1; - } - - if (emitted) { - DUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA); - DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ - if (DUK_UNLIKELY(js_ctx->h_gap != NULL)) { - DUK_ASSERT(js_ctx->recursion_depth >= 1); - duk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U); - } - } - DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); - } else if (c_bit & c_unbox) { - /* Certain boxed types are required to go through - * automatic unboxing. Rely on internal value being - * sane (to avoid infinite recursion). - */ - DUK_ASSERT((c_bit & DUK_HOBJECT_CMASK_SYMBOL) == 0); /* Symbols are not unboxed. */ - -#if 1 - /* The code below is incorrect if .toString() or .valueOf() have - * have been overridden. The correct approach would be to look up - * the method(s) and if they resolve to the built-in function we - * can safely bypass it and look up the internal value directly. - * Unimplemented for now, abort fast path for boxed values. - */ - goto abort_fastpath; -#else /* disabled */ - /* Disabled until fixed, see above. */ - duk_tval *tv_internal; - - DUK_DD(DUK_DDPRINT("auto unboxing in fast path")); - - tv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj); - DUK_ASSERT(tv_internal != NULL); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv_internal) || - DUK_TVAL_IS_NUMBER(tv_internal) || - DUK_TVAL_IS_BOOLEAN(tv_internal) || - DUK_TVAL_IS_POINTER(tv_internal)); - - tv = tv_internal; - DUK_ASSERT(js_ctx->recursion_depth > 0); - js_ctx->recursion_depth--; /* required to keep recursion depth correct */ - goto restart_match; -#endif /* disabled */ -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - } else if (c_bit & c_func) { - DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - } else if (c_bit & c_bufobj) { - duk__enc_bufobj(js_ctx, (duk_hbufobj *) obj); -#endif -#endif - } else if (c_bit & c_abort) { - DUK_DD(DUK_DDPRINT("abort fast path for unsupported type")); - goto abort_fastpath; - } else { - DUK_ASSERT((c_bit & c_undef) != 0); - - /* Must decrease recursion depth before returning. */ - DUK_ASSERT(js_ctx->recursion_depth > 0); - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - js_ctx->recursion_depth--; - goto emit_undefined; - } - - DUK_ASSERT(js_ctx->recursion_depth > 0); - DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); - js_ctx->recursion_depth--; - break; - } - case DUK_TAG_BUFFER: { - /* Plain buffers are treated like Uint8Arrays: they have - * enumerable indices. Other virtual properties are not - * enumerable, and inherited properties are not serialized. - * However, there can be a replacer (not relevant here) or - * a .toJSON() method (which we need to check for explicitly). - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - if (duk_hobject_hasprop_raw(js_ctx->thr, - js_ctx->thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE], - DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr))) { - DUK_DD(DUK_DDPRINT("value is a plain buffer and there's an inherited .toJSON, abort fast path")); - goto abort_fastpath; - } -#endif - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom_or_compatible) { - duk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv)); - break; - } -#endif - - /* Plain buffers mimic Uint8Arrays, and have enumerable index - * properties. - */ - duk__enc_buffer_json_fastpath(js_ctx, DUK_TVAL_GET_BUFFER(tv)); - break; - } - case DUK_TAG_POINTER: { -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flag_ext_custom_or_compatible) { - duk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv)); - break; - } else { - goto emit_undefined; - } -#else - goto emit_undefined; -#endif - } - case DUK_TAG_LIGHTFUNC: { - /* A lightfunc might also inherit a .toJSON() so just bail out. */ - /* XXX: Could just lookup .toJSON() and continue in fast path, - * as it would almost never be defined. - */ - DUK_DD(DUK_DDPRINT("value is a lightfunc, abort fast path")); - goto abort_fastpath; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: { - /* Number serialization has a significant impact relative to - * other fast path code, so careful fast path for fastints. - */ - duk__enc_fastint_tval(js_ctx, tv); - break; - } -#endif - default: { - /* XXX: A fast path for usual integers would be useful when - * fastint support is not enabled. - */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - - /* XXX: Stack discipline is annoying, could be changed in numconv. */ - duk_push_tval(js_ctx->thr, tv); - duk__enc_double(js_ctx); - duk_pop(js_ctx->thr); - -#if 0 - /* Could also rely on native sprintf(), but it will handle - * values like NaN, Infinity, -0, exponent notation etc in - * a JSON-incompatible way. - */ - duk_double_t d; - char buf[64]; - - DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); - d = DUK_TVAL_GET_DOUBLE(tv); - DUK_SPRINTF(buf, "%lg", d); - DUK__EMIT_CSTR(js_ctx, buf); -#endif - } - } - return 1; /* not undefined */ - - emit_undefined: - return 0; /* value was undefined/unsupported */ - - abort_fastpath: - /* Error message doesn't matter: the error is ignored anyway. */ - DUK_DD(DUK_DDPRINT("aborting fast path")); - DUK_ERROR_INTERNAL(js_ctx->thr); - return 0; /* unreachable */ -} - -DUK_LOCAL duk_ret_t duk__json_stringify_fast(duk_hthread *thr, void *udata) { - duk_json_enc_ctx *js_ctx; - duk_tval *tv; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(udata != NULL); - - js_ctx = (duk_json_enc_ctx *) udata; - DUK_ASSERT(js_ctx != NULL); - - tv = DUK_GET_TVAL_NEGIDX(thr, -1); - if (duk__json_stringify_fast_value(js_ctx, tv) == 0) { - DUK_DD(DUK_DDPRINT("top level value not supported, fail fast path")); - DUK_DCERROR_TYPE_INVALID_ARGS(thr); /* Error message is ignored, so doesn't matter. */ - } - - return 0; -} -#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ - -/* - * Top level wrappers - */ - -DUK_INTERNAL -void duk_bi_json_parse_helper(duk_hthread *thr, - duk_idx_t idx_value, - duk_idx_t idx_reviver, - duk_small_uint_t flags) { - duk_json_dec_ctx js_ctx_alloc; - duk_json_dec_ctx *js_ctx = &js_ctx_alloc; - duk_hstring *h_text; -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t entry_top = duk_get_top(thr); -#endif - - /* negative top-relative indices not allowed now */ - DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); - DUK_ASSERT(idx_reviver == DUK_INVALID_INDEX || idx_reviver >= 0); - - DUK_DDD(DUK_DDDPRINT("JSON parse start: text=%!T, reviver=%!T, flags=0x%08lx, stack_top=%ld", - (duk_tval *) duk_get_tval(thr, idx_value), - (duk_tval *) duk_get_tval(thr, idx_reviver), - (unsigned long) flags, - (long) duk_get_top(thr))); - - DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); - js_ctx->thr = thr; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - /* nothing now */ -#endif - js_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT; - DUK_ASSERT(js_ctx->recursion_depth == 0); - - /* Flag handling currently assumes that flags are consistent. This is OK - * because the call sites are now strictly controlled. - */ - - js_ctx->flags = flags; -#if defined(DUK_USE_JX) - js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; -#endif -#if defined(DUK_USE_JC) - js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; -#endif -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE); -#endif - - h_text = duk_to_hstring(thr, idx_value); /* coerce in-place; rejects Symbols */ - DUK_ASSERT(h_text != NULL); - - /* JSON parsing code is allowed to read [p_start,p_end]: p_end is - * valid and points to the string NUL terminator (which is always - * guaranteed for duk_hstrings. - */ - js_ctx->p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text); - js_ctx->p = js_ctx->p_start; - js_ctx->p_end = ((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) + - DUK_HSTRING_GET_BYTELEN(h_text); - DUK_ASSERT(*(js_ctx->p_end) == 0x00); - - duk__dec_value(js_ctx); /* -> [ ... value ] */ - - /* Trailing whitespace has been eaten by duk__dec_value(), so if - * we're not at end of input here, it's a SyntaxError. - */ - - if (js_ctx->p != js_ctx->p_end) { - duk__dec_syntax_error(js_ctx); - } - - if (duk_is_callable(thr, idx_reviver)) { - DUK_DDD(DUK_DDDPRINT("applying reviver: %!T", - (duk_tval *) duk_get_tval(thr, idx_reviver))); - - js_ctx->idx_reviver = idx_reviver; - - duk_push_object(thr); - duk_dup_m2(thr); /* -> [ ... val root val ] */ - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING); /* default attrs ok */ - duk_push_hstring_stridx(thr, DUK_STRIDX_EMPTY_STRING); /* -> [ ... val root "" ] */ - - DUK_DDD(DUK_DDDPRINT("start reviver walk, root=%!T, name=%!T", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - duk__dec_reviver_walk(js_ctx); /* [ ... val root "" ] -> [ ... val val' ] */ - duk_remove_m2(thr); /* -> [ ... val' ] */ - } else { - DUK_DDD(DUK_DDDPRINT("reviver does not exist or is not callable: %!T", - (duk_tval *) duk_get_tval(thr, idx_reviver))); - } - - /* Final result is at stack top. */ - - DUK_DDD(DUK_DDDPRINT("JSON parse end: text=%!T, reviver=%!T, flags=0x%08lx, result=%!T, stack_top=%ld", - (duk_tval *) duk_get_tval(thr, idx_value), - (duk_tval *) duk_get_tval(thr, idx_reviver), - (unsigned long) flags, - (duk_tval *) duk_get_tval(thr, -1), - (long) duk_get_top(thr))); - - DUK_ASSERT(duk_get_top(thr) == entry_top + 1); -} - -DUK_INTERNAL -void duk_bi_json_stringify_helper(duk_hthread *thr, - duk_idx_t idx_value, - duk_idx_t idx_replacer, - duk_idx_t idx_space, - duk_small_uint_t flags) { - duk_json_enc_ctx js_ctx_alloc; - duk_json_enc_ctx *js_ctx = &js_ctx_alloc; - duk_hobject *h; - duk_idx_t idx_holder; - duk_idx_t entry_top; - - /* negative top-relative indices not allowed now */ - DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); - DUK_ASSERT(idx_replacer == DUK_INVALID_INDEX || idx_replacer >= 0); - DUK_ASSERT(idx_space == DUK_INVALID_INDEX || idx_space >= 0); - - DUK_DDD(DUK_DDDPRINT("JSON stringify start: value=%!T, replacer=%!T, space=%!T, flags=0x%08lx, stack_top=%ld", - (duk_tval *) duk_get_tval(thr, idx_value), - (duk_tval *) duk_get_tval(thr, idx_replacer), - (duk_tval *) duk_get_tval(thr, idx_space), - (unsigned long) flags, - (long) duk_get_top(thr))); - - entry_top = duk_get_top(thr); - - /* - * Context init - */ - - DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); - js_ctx->thr = thr; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - js_ctx->h_replacer = NULL; - js_ctx->h_gap = NULL; -#endif - js_ctx->idx_proplist = -1; - - /* Flag handling currently assumes that flags are consistent. This is OK - * because the call sites are now strictly controlled. - */ - - js_ctx->flags = flags; - js_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY; - js_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES; -#if defined(DUK_USE_JX) - js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; -#endif -#if defined(DUK_USE_JC) - js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; -#endif -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - js_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE); -#endif - - /* The #if defined() clutter here handles the JX/JC enable/disable - * combinations properly. - */ -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_NULL; /* standard JSON; array gaps */ -#if defined(DUK_USE_JX) - if (flags & DUK_JSON_FLAG_EXT_CUSTOM) { - js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED; - js_ctx->stridx_custom_nan = DUK_STRIDX_NAN; - js_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY; - js_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY; - js_ctx->stridx_custom_function = - (flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES) ? - DUK_STRIDX_JSON_EXT_FUNCTION2 : - DUK_STRIDX_JSON_EXT_FUNCTION1; - } -#endif /* DUK_USE_JX */ -#if defined(DUK_USE_JX) && defined(DUK_USE_JC) - else -#endif /* DUK_USE_JX && DUK_USE_JC */ -#if defined(DUK_USE_JC) - if (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) { - js_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED; - js_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN; - js_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF; - js_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF; - js_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1; - } -#endif /* DUK_USE_JC */ -#endif /* DUK_USE_JX || DUK_USE_JC */ - -#if defined(DUK_USE_JX) || defined(DUK_USE_JC) - if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | - DUK_JSON_FLAG_EXT_COMPATIBLE)) { - DUK_ASSERT(js_ctx->mask_for_undefined == 0); /* already zero */ - } - else -#endif /* DUK_USE_JX || DUK_USE_JC */ - { - /* Plain buffer is treated like ArrayBuffer and serialized. - * Lightfuncs are treated like objects, but JSON explicitly - * skips serializing Function objects so we can just reject - * lightfuncs here. - */ - js_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_POINTER | - DUK_TYPE_MASK_LIGHTFUNC; - } - - DUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE); - - js_ctx->idx_loop = duk_push_bare_object(thr); - DUK_ASSERT(js_ctx->idx_loop >= 0); - - /* [ ... buf loop ] */ - - /* - * Process replacer/proplist (2nd argument to JSON.stringify) - */ - - h = duk_get_hobject(thr, idx_replacer); - if (h != NULL) { - if (DUK_HOBJECT_IS_CALLABLE(h)) { - js_ctx->h_replacer = h; - } else if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { - /* Here the specification requires correct array index enumeration - * which is a bit tricky for sparse arrays (it is handled by the - * enum setup code). We now enumerate ancestors too, although the - * specification is not very clear on whether that is required. - */ - - duk_uarridx_t plist_idx = 0; - duk_small_uint_t enum_flags; - - js_ctx->idx_proplist = duk_push_array(thr); /* XXX: array internal? */ - - enum_flags = DUK_ENUM_ARRAY_INDICES_ONLY | - DUK_ENUM_SORT_ARRAY_INDICES; /* expensive flag */ - duk_enum(thr, idx_replacer, enum_flags); - while (duk_next(thr, -1 /*enum_index*/, 1 /*get_value*/)) { - /* [ ... proplist enum_obj key val ] */ - if (duk__enc_allow_into_proplist(duk_get_tval(thr, -1))) { - /* XXX: duplicates should be eliminated here */ - DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> accept", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - duk_to_string(thr, -1); /* extra coercion of strings is OK */ - duk_put_prop_index(thr, -4, plist_idx); /* -> [ ... proplist enum_obj key ] */ - plist_idx++; - duk_pop(thr); - } else { - DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> reject", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - duk_pop_2(thr); - } - } - duk_pop(thr); /* pop enum */ - - /* [ ... proplist ] */ - } - } - - /* [ ... buf loop (proplist) ] */ - - /* - * Process space (3rd argument to JSON.stringify) - */ - - h = duk_get_hobject(thr, idx_space); - if (h != NULL) { - duk_small_uint_t c = DUK_HOBJECT_GET_CLASS_NUMBER(h); - if (c == DUK_HOBJECT_CLASS_NUMBER) { - duk_to_number(thr, idx_space); - } else if (c == DUK_HOBJECT_CLASS_STRING) { - duk_to_string(thr, idx_space); - } - } - - if (duk_is_number(thr, idx_space)) { - duk_small_int_t nspace; - /* spaces[] must be static to allow initializer with old compilers like BCC */ - static const char spaces[10] = { - DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, - DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, - DUK_ASC_SPACE, DUK_ASC_SPACE - }; /* XXX: helper */ - - /* ToInteger() coercion; NaN -> 0, infinities are clamped to 0 and 10 */ - nspace = (duk_small_int_t) duk_to_int_clamped(thr, idx_space, 0 /*minval*/, 10 /*maxval*/); - DUK_ASSERT(nspace >= 0 && nspace <= 10); - - duk_push_lstring(thr, spaces, (duk_size_t) nspace); - js_ctx->h_gap = duk_known_hstring(thr, -1); - DUK_ASSERT(js_ctx->h_gap != NULL); - } else if (duk_is_string_notsymbol(thr, idx_space)) { - duk_dup(thr, idx_space); - duk_substring(thr, -1, 0, 10); /* clamp to 10 chars */ - js_ctx->h_gap = duk_known_hstring(thr, -1); - } else { - /* nop */ - } - - if (js_ctx->h_gap != NULL) { - /* If gap is empty, behave as if not given at all. Check - * against byte length because character length is more - * expensive. - */ - if (DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) == 0) { - js_ctx->h_gap = NULL; - } - } - - /* [ ... buf loop (proplist) (gap) ] */ - - /* - * Fast path: assume no mutation, iterate object property tables - * directly; bail out if that assumption doesn't hold. - */ - -#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) - if (js_ctx->h_replacer == NULL && /* replacer is a mutation risk */ - js_ctx->idx_proplist == -1) { /* proplist is very rare */ - duk_int_t pcall_rc; - duk_small_uint_t prev_ms_base_flags; - - DUK_DD(DUK_DDPRINT("try JSON.stringify() fast path")); - - /* Use recursion_limit to ensure we don't overwrite js_ctx->visiting[] - * array so we don't need two counter checks in the fast path. The - * slow path has a much larger recursion limit which we'll use if - * necessary. - */ - DUK_ASSERT(DUK_USE_JSON_ENC_RECLIMIT >= DUK_JSON_ENC_LOOPARRAY); - js_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY; - DUK_ASSERT(js_ctx->recursion_depth == 0); - - /* Execute the fast path in a protected call. If any error is thrown, - * fall back to the slow path. This includes e.g. recursion limit - * because the fast path has a smaller recursion limit (and simpler, - * limited loop detection). - */ - - duk_dup(thr, idx_value); - - /* Must prevent finalizers which may have arbitrary side effects. */ - prev_ms_base_flags = thr->heap->ms_base_flags; - thr->heap->ms_base_flags |= - DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact any objects. */ - thr->heap->pf_prevent_count++; /* Prevent finalizers. */ - DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ - - pcall_rc = duk_safe_call(thr, duk__json_stringify_fast, (void *) js_ctx /*udata*/, 1 /*nargs*/, 0 /*nret*/); - - DUK_ASSERT(thr->heap->pf_prevent_count > 0); - thr->heap->pf_prevent_count--; - thr->heap->ms_base_flags = prev_ms_base_flags; - - if (pcall_rc == DUK_EXEC_SUCCESS) { - DUK_DD(DUK_DDPRINT("fast path successful")); - DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); - goto replace_finished; - } - - /* We come here for actual aborts (like encountering .toJSON()) - * but also for recursion/loop errors. Bufwriter size can be - * kept because we'll probably need at least as much as we've - * allocated so far. - */ - DUK_D(DUK_DPRINT("fast path failed, serialize using slow path instead")); - DUK_BW_RESET_SIZE(thr, &js_ctx->bw); - js_ctx->recursion_depth = 0; - } -#endif - - /* - * Create wrapper object and serialize - */ - - idx_holder = duk_push_object(thr); - duk_dup(thr, idx_value); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING); - - DUK_DDD(DUK_DDDPRINT("before: flags=0x%08lx, loop=%!T, replacer=%!O, " - "proplist=%!T, gap=%!O, holder=%!T", - (unsigned long) js_ctx->flags, - (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop), - (duk_heaphdr *) js_ctx->h_replacer, - (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL), - (duk_heaphdr *) js_ctx->h_gap, - (duk_tval *) duk_get_tval(thr, -1))); - - /* serialize the wrapper with empty string key */ - - duk_push_hstring_empty(thr); - - /* [ ... buf loop (proplist) (gap) holder "" ] */ - - js_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT; - DUK_ASSERT(js_ctx->recursion_depth == 0); - - if (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_holder) == 0)) { /* [ ... holder key ] -> [ ... holder ] */ - /* Result is undefined. */ - duk_push_undefined(thr); - } else { - /* Convert buffer to result string. */ - DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); - } - - DUK_DDD(DUK_DDDPRINT("after: flags=0x%08lx, loop=%!T, replacer=%!O, " - "proplist=%!T, gap=%!O, holder=%!T", - (unsigned long) js_ctx->flags, - (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop), - (duk_heaphdr *) js_ctx->h_replacer, - (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL), - (duk_heaphdr *) js_ctx->h_gap, - (duk_tval *) duk_get_tval(thr, idx_holder))); - - /* The stack has a variable shape here, so force it to the - * desired one explicitly. - */ - -#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) - replace_finished: -#endif - duk_replace(thr, entry_top); - duk_set_top(thr, entry_top + 1); - - DUK_DDD(DUK_DDDPRINT("JSON stringify end: value=%!T, replacer=%!T, space=%!T, " - "flags=0x%08lx, result=%!T, stack_top=%ld", - (duk_tval *) duk_get_tval(thr, idx_value), - (duk_tval *) duk_get_tval(thr, idx_replacer), - (duk_tval *) duk_get_tval(thr, idx_space), - (unsigned long) flags, - (duk_tval *) duk_get_tval(thr, -1), - (long) duk_get_top(thr))); - - DUK_ASSERT(duk_get_top(thr) == entry_top + 1); -} - -#if defined(DUK_USE_JSON_BUILTIN) - -/* - * Entry points - */ - -DUK_INTERNAL duk_ret_t duk_bi_json_object_parse(duk_hthread *thr) { - duk_bi_json_parse_helper(thr, - 0 /*idx_value*/, - 1 /*idx_replacer*/, - 0 /*flags*/); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_json_object_stringify(duk_hthread *thr) { - duk_bi_json_stringify_helper(thr, - 0 /*idx_value*/, - 1 /*idx_replacer*/, - 2 /*idx_space*/, - 0 /*flags*/); - return 1; -} - -#endif /* DUK_USE_JSON_BUILTIN */ - -#endif /* DUK_USE_JSON_SUPPORT */ - -/* automatic undefs */ -#undef DUK__EMIT_1 -#undef DUK__EMIT_2 -#undef DUK__EMIT_CSTR -#undef DUK__EMIT_HSTR -#undef DUK__EMIT_STRIDX -#undef DUK__JSON_DECSTR_BUFSIZE -#undef DUK__JSON_DECSTR_CHUNKSIZE -#undef DUK__JSON_ENCSTR_CHUNKSIZE -#undef DUK__JSON_MAX_ESC_LEN -#undef DUK__JSON_STRINGIFY_BUFSIZE -#undef DUK__MKESC -#undef DUK__UNEMIT_1 -#line 1 "duk_bi_math.c" -/* - * Math built-ins - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_MATH_BUILTIN) - -/* - * Use static helpers which can work with math.h functions matching - * the following signatures. This is not portable if any of these math - * functions is actually a macro. - * - * Typing here is intentionally 'double' wherever values interact with - * the standard library APIs. - */ - -typedef double (*duk__one_arg_func)(double); -typedef double (*duk__two_arg_func)(double, double); - -DUK_LOCAL duk_ret_t duk__math_minmax(duk_hthread *thr, duk_double_t initial, duk__two_arg_func min_max) { - duk_idx_t n = duk_get_top(thr); - duk_idx_t i; - duk_double_t res = initial; - duk_double_t t; - - /* - * Note: fmax() does not match the E5 semantics. E5 requires - * that if -any- input to Math.max() is a NaN, the result is a - * NaN. fmax() will return a NaN only if -both- inputs are NaN. - * Same applies to fmin(). - * - * Note: every input value must be coerced with ToNumber(), even - * if we know the result will be a NaN anyway: ToNumber() may have - * side effects for which even order of evaluation matters. - */ - - for (i = 0; i < n; i++) { - t = duk_to_number(thr, i); - if (DUK_FPCLASSIFY(t) == DUK_FP_NAN || DUK_FPCLASSIFY(res) == DUK_FP_NAN) { - /* Note: not normalized, but duk_push_number() will normalize */ - res = (duk_double_t) DUK_DOUBLE_NAN; - } else { - res = (duk_double_t) min_max(res, (double) t); - } - } - - duk_push_number(thr, res); - return 1; -} - -DUK_LOCAL double duk__fmin_fixed(double x, double y) { - /* fmin() with args -0 and +0 is not guaranteed to return - * -0 as Ecmascript requires. - */ - if (x == 0 && y == 0) { - duk_double_union du1, du2; - du1.d = x; - du2.d = y; - - /* Already checked to be zero so these must hold, and allow us - * to check for "x is -0 or y is -0" by ORing the high parts - * for comparison. - */ - DUK_ASSERT(du1.ui[DUK_DBL_IDX_UI0] == 0 || du1.ui[DUK_DBL_IDX_UI0] == 0x80000000UL); - DUK_ASSERT(du2.ui[DUK_DBL_IDX_UI0] == 0 || du2.ui[DUK_DBL_IDX_UI0] == 0x80000000UL); - - /* XXX: what's the safest way of creating a negative zero? */ - if ((du1.ui[DUK_DBL_IDX_UI0] | du2.ui[DUK_DBL_IDX_UI0]) != 0) { - /* Enter here if either x or y (or both) is -0. */ - return -0.0; - } else { - return +0.0; - } - } - return duk_double_fmin(x, y); -} - -DUK_LOCAL double duk__fmax_fixed(double x, double y) { - /* fmax() with args -0 and +0 is not guaranteed to return - * +0 as Ecmascript requires. - */ - if (x == 0 && y == 0) { - if (DUK_SIGNBIT(x) == 0 || DUK_SIGNBIT(y) == 0) { - return +0.0; - } else { - return -0.0; - } - } - return duk_double_fmax(x, y); -} - -#if defined(DUK_USE_ES6) -DUK_LOCAL double duk__cbrt(double x) { - /* cbrt() is C99. To avoid hassling embedders with the need to provide a - * cube root function, we can get by with pow(). The result is not - * identical, but that's OK: ES2015 says it's implementation-dependent. - */ - -#if defined(DUK_CBRT) - /* cbrt() matches ES2015 requirements. */ - return DUK_CBRT(x); -#else - duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); - - /* pow() does not, however. */ - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) { - return x; - } - if (DUK_SIGNBIT(x)) { - return -DUK_POW(-x, 1.0 / 3.0); - } else { - return DUK_POW(x, 1.0 / 3.0); - } -#endif -} - -DUK_LOCAL double duk__log2(double x) { -#if defined(DUK_LOG2) - return DUK_LOG2(x); -#else - return DUK_LOG(x) * DUK_DOUBLE_LOG2E; -#endif -} - -DUK_LOCAL double duk__log10(double x) { -#if defined(DUK_LOG10) - return DUK_LOG10(x); -#else - return DUK_LOG(x) * DUK_DOUBLE_LOG10E; -#endif -} - -DUK_LOCAL double duk__trunc(double x) { -#if defined(DUK_TRUNC) - return DUK_TRUNC(x); -#else - /* Handles -0 correctly: -0.0 matches 'x >= 0.0' but floor() - * is required to return -0 when the argument is -0. - */ - return x >= 0.0 ? DUK_FLOOR(x) : DUK_CEIL(x); -#endif -} -#endif /* DUK_USE_ES6 */ - -DUK_LOCAL double duk__round_fixed(double x) { - /* Numbers half-way between integers must be rounded towards +Infinity, - * e.g. -3.5 must be rounded to -3 (not -4). When rounded to zero, zero - * sign must be set appropriately. E5.1 Section 15.8.2.15. - * - * Note that ANSI C round() is "round to nearest integer, away from zero", - * which is incorrect for negative values. Here we make do with floor(). - */ - - duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) { - return x; - } - - /* - * x is finite and non-zero - * - * -1.6 -> floor(-1.1) -> -2 - * -1.5 -> floor(-1.0) -> -1 (towards +Inf) - * -1.4 -> floor(-0.9) -> -1 - * -0.5 -> -0.0 (special case) - * -0.1 -> -0.0 (special case) - * +0.1 -> +0.0 (special case) - * +0.5 -> floor(+1.0) -> 1 (towards +Inf) - * +1.4 -> floor(+1.9) -> 1 - * +1.5 -> floor(+2.0) -> 2 (towards +Inf) - * +1.6 -> floor(+2.1) -> 2 - */ - - if (x >= -0.5 && x < 0.5) { - /* +0.5 is handled by floor, this is on purpose */ - if (x < 0.0) { - return -0.0; - } else { - return +0.0; - } - } - - return DUK_FLOOR(x + 0.5); -} - -/* Wrappers for calling standard math library methods. These may be required - * on platforms where one or more of the math built-ins are defined as macros - * or inline functions and are thus not suitable to be used as function pointers. - */ -#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) -DUK_LOCAL double duk__fabs(double x) { - return DUK_FABS(x); -} -DUK_LOCAL double duk__acos(double x) { - return DUK_ACOS(x); -} -DUK_LOCAL double duk__asin(double x) { - return DUK_ASIN(x); -} -DUK_LOCAL double duk__atan(double x) { - return DUK_ATAN(x); -} -DUK_LOCAL double duk__ceil(double x) { - return DUK_CEIL(x); -} -DUK_LOCAL double duk__cos(double x) { - return DUK_COS(x); -} -DUK_LOCAL double duk__exp(double x) { - return DUK_EXP(x); -} -DUK_LOCAL double duk__floor(double x) { - return DUK_FLOOR(x); -} -DUK_LOCAL double duk__log(double x) { - return DUK_LOG(x); -} -DUK_LOCAL double duk__sin(double x) { - return DUK_SIN(x); -} -DUK_LOCAL double duk__sqrt(double x) { - return DUK_SQRT(x); -} -DUK_LOCAL double duk__tan(double x) { - return DUK_TAN(x); -} -DUK_LOCAL double duk__atan2_fixed(double x, double y) { -#if defined(DUK_USE_ATAN2_WORKAROUNDS) - /* Specific fixes to common atan2() implementation issues: - * - test-bug-mingw-math-issues.js - */ - if (DUK_ISINF(x) && DUK_ISINF(y)) { - if (DUK_SIGNBIT(x)) { - if (DUK_SIGNBIT(y)) { - return -2.356194490192345; - } else { - return -0.7853981633974483; - } - } else { - if (DUK_SIGNBIT(y)) { - return 2.356194490192345; - } else { - return 0.7853981633974483; - } - } - } -#else - /* Some ISO C assumptions. */ - DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == 0.7853981633974483); - DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == -0.7853981633974483); - DUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == 2.356194490192345); - DUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == -2.356194490192345); -#endif - - return DUK_ATAN2(x, y); -} -#endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ - -/* order must match constants in genbuiltins.py */ -DUK_LOCAL const duk__one_arg_func duk__one_arg_funcs[] = { -#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) - duk__fabs, - duk__acos, - duk__asin, - duk__atan, - duk__ceil, - duk__cos, - duk__exp, - duk__floor, - duk__log, - duk__round_fixed, - duk__sin, - duk__sqrt, - duk__tan, -#if defined(DUK_USE_ES6) - duk__cbrt, - duk__log2, - duk__log10, - duk__trunc -#endif -#else /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ - DUK_FABS, - DUK_ACOS, - DUK_ASIN, - DUK_ATAN, - DUK_CEIL, - DUK_COS, - DUK_EXP, - DUK_FLOOR, - DUK_LOG, - duk__round_fixed, - DUK_SIN, - DUK_SQRT, - DUK_TAN, -#if defined(DUK_USE_ES6) - duk__cbrt, - duk__log2, - duk__log10, - duk__trunc -#endif -#endif /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */ -}; - -/* order must match constants in genbuiltins.py */ -DUK_LOCAL const duk__two_arg_func duk__two_arg_funcs[] = { -#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS) - duk__atan2_fixed, - duk_js_arith_pow -#else - duk__atan2_fixed, - duk_js_arith_pow -#endif -}; - -DUK_INTERNAL duk_ret_t duk_bi_math_object_onearg_shared(duk_hthread *thr) { - duk_small_int_t fun_idx = duk_get_current_magic(thr); - duk__one_arg_func fun; - duk_double_t arg1; - - DUK_ASSERT(fun_idx >= 0); - DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__one_arg_funcs) / sizeof(duk__one_arg_func))); - arg1 = duk_to_number(thr, 0); - fun = duk__one_arg_funcs[fun_idx]; - duk_push_number(thr, (duk_double_t) fun((double) arg1)); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_math_object_twoarg_shared(duk_hthread *thr) { - duk_small_int_t fun_idx = duk_get_current_magic(thr); - duk__two_arg_func fun; - duk_double_t arg1; - duk_double_t arg2; - - DUK_ASSERT(fun_idx >= 0); - DUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__two_arg_funcs) / sizeof(duk__two_arg_func))); - arg1 = duk_to_number(thr, 0); /* explicit ordered evaluation to match coercion semantics */ - arg2 = duk_to_number(thr, 1); - fun = duk__two_arg_funcs[fun_idx]; - duk_push_number(thr, (duk_double_t) fun((double) arg1, (double) arg2)); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_math_object_max(duk_hthread *thr) { - return duk__math_minmax(thr, -DUK_DOUBLE_INFINITY, duk__fmax_fixed); -} - -DUK_INTERNAL duk_ret_t duk_bi_math_object_min(duk_hthread *thr) { - return duk__math_minmax(thr, DUK_DOUBLE_INFINITY, duk__fmin_fixed); -} - -DUK_INTERNAL duk_ret_t duk_bi_math_object_random(duk_hthread *thr) { - duk_push_number(thr, (duk_double_t) DUK_UTIL_GET_RANDOM_DOUBLE(thr)); - return 1; -} - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_math_object_hypot(duk_hthread *thr) { - /* - * E6 Section 20.2.2.18: Math.hypot - * - * - If no arguments are passed, the result is +0. - * - If any argument is +inf, the result is +inf. - * - If any argument is -inf, the result is +inf. - * - If no argument is +inf or -inf, and any argument is NaN, the result is - * NaN. - * - If all arguments are either +0 or -0, the result is +0. - */ - - duk_idx_t nargs; - duk_idx_t i; - duk_bool_t found_nan; - duk_double_t max; - duk_double_t sum, summand; - duk_double_t comp, prelim; - duk_double_t t; - - nargs = duk_get_top(thr); - - /* Find the highest value. Also ToNumber() coerces. */ - max = 0.0; - found_nan = 0; - for (i = 0; i < nargs; i++) { - t = DUK_FABS(duk_to_number(thr, i)); - if (DUK_FPCLASSIFY(t) == DUK_FP_NAN) { - found_nan = 1; - } else { - max = duk_double_fmax(max, t); - } - } - - /* Early return cases. */ - if (max == DUK_DOUBLE_INFINITY) { - duk_push_number(thr, DUK_DOUBLE_INFINITY); - return 1; - } else if (found_nan) { - duk_push_number(thr, DUK_DOUBLE_NAN); - return 1; - } else if (max == 0.0) { - duk_push_number(thr, 0.0); - /* Otherwise we'd divide by zero. */ - return 1; - } - - /* Use Kahan summation and normalize to the highest value to minimize - * floating point rounding error and avoid overflow. - * - * https://en.wikipedia.org/wiki/Kahan_summation_algorithm - */ - sum = 0.0; - comp = 0.0; - for (i = 0; i < nargs; i++) { - t = DUK_FABS(duk_get_number(thr, i)) / max; - summand = (t * t) - comp; - prelim = sum + summand; - comp = (prelim - sum) - summand; - sum = prelim; - } - - duk_push_number(thr, (duk_double_t) DUK_SQRT(sum) * max); - return 1; -} -#endif /* DUK_USE_ES6 */ - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_math_object_sign(duk_hthread *thr) { - duk_double_t d; - - d = duk_to_number(thr, 0); - if (duk_double_is_nan(d)) { - DUK_ASSERT(duk_is_nan(thr, -1)); - return 1; /* NaN input -> return NaN */ - } - if (d == 0.0) { - /* Zero sign kept, i.e. -0 -> -0, +0 -> +0. */ - return 1; - } - duk_push_int(thr, (d > 0.0 ? 1 : -1)); - return 1; -} -#endif /* DUK_USE_ES6 */ - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_math_object_clz32(duk_hthread *thr) { - duk_uint32_t x; - duk_small_uint_t i; - -#if defined(DUK_USE_PREFER_SIZE) - duk_uint32_t mask; - - x = duk_to_uint32(thr, 0); - for (i = 0, mask = 0x80000000UL; mask != 0; mask >>= 1) { - if (x & mask) { - break; - } - i++; - } - DUK_ASSERT(i <= 32); - duk_push_uint(thr, i); - return 1; -#else /* DUK_USE_PREFER_SIZE */ - i = 0; - x = duk_to_uint32(thr, 0); - if (x & 0xffff0000UL) { - x >>= 16; - } else { - i += 16; - } - if (x & 0x0000ff00UL) { - x >>= 8; - } else { - i += 8; - } - if (x & 0x000000f0UL) { - x >>= 4; - } else { - i += 4; - } - if (x & 0x0000000cUL) { - x >>= 2; - } else { - i += 2; - } - if (x & 0x00000002UL) { - x >>= 1; - } else { - i += 1; - } - if (x & 0x00000001UL) { - ; - } else { - i += 1; - } - DUK_ASSERT(i <= 32); - duk_push_uint(thr, i); - return 1; -#endif /* DUK_USE_PREFER_SIZE */ -} -#endif /* DUK_USE_ES6 */ - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_math_object_imul(duk_hthread *thr) { - duk_uint32_t x, y, z; - - x = duk_to_uint32(thr, 0); - y = duk_to_uint32(thr, 1); - z = x * y; - - /* While arguments are ToUint32() coerced and the multiplication - * is unsigned as such, the final result is curiously interpreted - * as a signed 32-bit value. - */ - duk_push_i32(thr, (duk_int32_t) z); - return 1; -} -#endif /* DUK_USE_ES6 */ - -#endif /* DUK_USE_MATH_BUILTIN */ -#line 1 "duk_bi_number.c" -/* - * Number built-ins - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_NUMBER_BUILTIN) - -DUK_LOCAL duk_double_t duk__push_this_number_plain(duk_hthread *thr) { - duk_hobject *h; - - /* Number built-in accepts a plain number or a Number object (whose - * internal value is operated on). Other types cause TypeError. - */ - - duk_push_this(thr); - if (duk_is_number(thr, -1)) { - DUK_DDD(DUK_DDDPRINT("plain number value: %!T", (duk_tval *) duk_get_tval(thr, -1))); - goto done; - } - h = duk_get_hobject(thr, -1); - if (!h || - (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_NUMBER)) { - DUK_DDD(DUK_DDDPRINT("unacceptable this value: %!T", (duk_tval *) duk_get_tval(thr, -1))); - DUK_ERROR_TYPE(thr, "number expected"); - } - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - DUK_ASSERT(duk_is_number(thr, -1)); - DUK_DDD(DUK_DDDPRINT("number object: %!T, internal value: %!T", - (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); - duk_remove_m2(thr); - - done: - return duk_get_number(thr, -1); -} - -DUK_INTERNAL duk_ret_t duk_bi_number_constructor(duk_hthread *thr) { - duk_idx_t nargs; - duk_hobject *h_this; - - /* - * The Number constructor uses ToNumber(arg) for number coercion - * (coercing an undefined argument to NaN). However, if the - * argument is not given at all, +0 must be used instead. To do - * this, a vararg function is used. - */ - - nargs = duk_get_top(thr); - if (nargs == 0) { - duk_push_int(thr, 0); - } - duk_to_number(thr, 0); - duk_set_top(thr, 1); - DUK_ASSERT_TOP(thr, 1); - - if (!duk_is_constructor_call(thr)) { - return 1; - } - - /* - * E5 Section 15.7.2.1 requires that the constructed object - * must have the original Number.prototype as its internal - * prototype. However, since Number.prototype is non-writable - * and non-configurable, this doesn't have to be enforced here: - * The default object (bound to 'this') is OK, though we have - * to change its class. - * - * Internal value set to ToNumber(arg) or +0; if no arg given, - * ToNumber(undefined) = NaN, so special treatment is needed - * (above). String internal value is immutable. - */ - - /* XXX: helper */ - duk_push_this(thr); - h_this = duk_known_hobject(thr, -1); - DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_NUMBER); - - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]); - DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_this) == DUK_HOBJECT_CLASS_NUMBER); - DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_this)); - - duk_dup_0(thr); /* -> [ val obj val ] */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); - return 0; /* no return value -> don't replace created value */ -} - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_value_of(duk_hthread *thr) { - (void) duk__push_this_number_plain(thr); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_string(duk_hthread *thr) { - duk_small_int_t radix; - duk_small_uint_t n2s_flags; - - (void) duk__push_this_number_plain(thr); - if (duk_is_undefined(thr, 0)) { - radix = 10; - } else { - radix = (duk_small_int_t) duk_to_int_check_range(thr, 0, 2, 36); - } - DUK_DDD(DUK_DDDPRINT("radix=%ld", (long) radix)); - - n2s_flags = 0; - - duk_numconv_stringify(thr, - radix /*radix*/, - 0 /*digits*/, - n2s_flags /*flags*/); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_hthread *thr) { - /* XXX: just use toString() for now; permitted although not recommended. - * nargs==1, so radix is passed to toString(). - */ - return duk_bi_number_prototype_to_string(thr); -} - -/* - * toFixed(), toExponential(), toPrecision() - */ - -/* XXX: shared helper for toFixed(), toExponential(), toPrecision()? */ - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_fixed(duk_hthread *thr) { - duk_small_int_t frac_digits; - duk_double_t d; - duk_small_int_t c; - duk_small_uint_t n2s_flags; - - frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20); - d = duk__push_this_number_plain(thr); - - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { - goto use_to_string; - } - - if (d >= 1.0e21 || d <= -1.0e21) { - goto use_to_string; - } - - n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | - DUK_N2S_FLAG_FRACTION_DIGITS; - - duk_numconv_stringify(thr, - 10 /*radix*/, - frac_digits /*digits*/, - n2s_flags /*flags*/); - return 1; - - use_to_string: - DUK_ASSERT_TOP(thr, 2); - duk_to_string(thr, -1); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_exponential(duk_hthread *thr) { - duk_bool_t frac_undefined; - duk_small_int_t frac_digits; - duk_double_t d; - duk_small_int_t c; - duk_small_uint_t n2s_flags; - - d = duk__push_this_number_plain(thr); - - frac_undefined = duk_is_undefined(thr, 0); - duk_to_int(thr, 0); /* for side effects */ - - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { - goto use_to_string; - } - - frac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20); - - n2s_flags = DUK_N2S_FLAG_FORCE_EXP | - (frac_undefined ? 0 : DUK_N2S_FLAG_FIXED_FORMAT); - - duk_numconv_stringify(thr, - 10 /*radix*/, - frac_digits + 1 /*leading digit + fractions*/, - n2s_flags /*flags*/); - return 1; - - use_to_string: - DUK_ASSERT_TOP(thr, 2); - duk_to_string(thr, -1); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_precision(duk_hthread *thr) { - /* The specification has quite awkward order of coercion and - * checks for toPrecision(). The operations below are a bit - * reordered, within constraints of observable side effects. - */ - - duk_double_t d; - duk_small_int_t prec; - duk_small_int_t c; - duk_small_uint_t n2s_flags; - - DUK_ASSERT_TOP(thr, 1); - - d = duk__push_this_number_plain(thr); - if (duk_is_undefined(thr, 0)) { - goto use_to_string; - } - DUK_ASSERT_TOP(thr, 2); - - duk_to_int(thr, 0); /* for side effects */ - - c = (duk_small_int_t) DUK_FPCLASSIFY(d); - if (c == DUK_FP_NAN || c == DUK_FP_INFINITE) { - goto use_to_string; - } - - prec = (duk_small_int_t) duk_to_int_check_range(thr, 0, 1, 21); - - n2s_flags = DUK_N2S_FLAG_FIXED_FORMAT | - DUK_N2S_FLAG_NO_ZERO_PAD; - - duk_numconv_stringify(thr, - 10 /*radix*/, - prec /*digits*/, - n2s_flags /*flags*/); - return 1; - - use_to_string: - /* Used when precision is undefined; also used for NaN (-> "NaN"), - * and +/- infinity (-> "Infinity", "-Infinity"). - */ - - DUK_ASSERT_TOP(thr, 2); - duk_to_string(thr, -1); - return 1; -} - -#endif /* DUK_USE_NUMBER_BUILTIN */ -#line 1 "duk_bi_object.c" -/* - * Object built-ins - */ - -/* #include duk_internal.h -> already included */ - -/* Needed even when Object built-in disabled. */ -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr) { - duk_tval *tv; - tv = DUK_HTHREAD_THIS_PTR(thr); - /* XXX: This is not entirely correct anymore; in ES2015 the - * default lookup should use @@toStringTag to come up with - * e.g. [object Symbol]. - */ - duk_push_class_string_tval(thr, tv); - return 1; -} - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor(duk_hthread *thr) { - duk_uint_t arg_mask; - - arg_mask = duk_get_type_mask(thr, 0); - - if (!duk_is_constructor_call(thr) && /* not a constructor call */ - ((arg_mask & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) == 0)) { /* and argument not null or undefined */ - duk_to_object(thr, 0); - return 1; - } - - /* Pointer and buffer primitive values are treated like other - * primitives values which have a fully fledged object counterpart: - * promote to an object value. Lightfuncs and plain buffers are - * coerced with ToObject() even they could also be returned as is. - */ - if (arg_mask & (DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_STRING | - DUK_TYPE_MASK_BOOLEAN | - DUK_TYPE_MASK_NUMBER | - DUK_TYPE_MASK_POINTER | - DUK_TYPE_MASK_BUFFER | - DUK_TYPE_MASK_LIGHTFUNC)) { - /* For DUK_TYPE_OBJECT the coercion is a no-op and could - * be checked for explicitly, but Object(obj) calls are - * not very common so opt for minimal footprint. - */ - duk_to_object(thr, 0); - return 1; - } - - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - DUK_BIDX_OBJECT_PROTOTYPE); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_assign(duk_hthread *thr) { - duk_idx_t nargs; - duk_int_t idx; - - nargs = duk_get_top_require_min(thr, 1 /*min_top*/); - - duk_to_object(thr, 0); - for (idx = 1; idx < nargs; idx++) { - /* E7 19.1.2.1 (step 4a) */ - if (duk_is_null_or_undefined(thr, idx)) { - continue; - } - - /* duk_enum() respects ES2015+ [[OwnPropertyKeys]] ordering, which is - * convenient here. - */ - duk_to_object(thr, idx); - duk_enum(thr, idx, DUK_ENUM_OWN_PROPERTIES_ONLY); - while (duk_next(thr, -1, 1 /*get_value*/)) { - /* [ target ... enum key value ] */ - duk_put_prop(thr, 0); - /* [ target ... enum ] */ - } - /* Could pop enumerator, but unnecessary because of duk_set_top() - * below. - */ - } - - duk_set_top(thr, 1); - return 1; -} -#endif - -#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 2); - duk_push_boolean(thr, duk_samevalue(thr, 0, 1)); - return 1; -} -#endif - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_create(duk_hthread *thr) { - duk_hobject *proto; - - DUK_ASSERT_TOP(thr, 2); - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - duk_hbufobj_promote_plain(thr, 0); -#endif - proto = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_NULL); - DUK_ASSERT(proto != NULL || duk_is_null(thr, 0)); - - (void) duk_push_object_helper_proto(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - proto); - - if (!duk_is_undefined(thr, 1)) { - /* [ O Properties obj ] */ - - duk_replace(thr, 0); - - /* [ obj Properties ] */ - - /* Just call the "original" Object.defineProperties() to - * finish up. - */ - - return duk_bi_object_constructor_define_properties(thr); - } - - /* [ O Properties obj ] */ - - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_properties(duk_hthread *thr) { - duk_small_uint_t pass; - duk_uint_t defprop_flags; - duk_hobject *obj; - duk_idx_t idx_value; - duk_hobject *get; - duk_hobject *set; - - /* Lightfunc and plain buffer handling by ToObject() coercion. */ - obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - DUK_ASSERT(obj != NULL); - - duk_to_object(thr, 1); /* properties object */ - - DUK_DDD(DUK_DDDPRINT("target=%!iT, properties=%!iT", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1))); - - /* - * Two pass approach to processing the property descriptors. - * On first pass validate and normalize all descriptors before - * any changes are made to the target object. On second pass - * make the actual modifications to the target object. - * - * Right now we'll just use the same normalize/validate helper - * on both passes, ignoring its outputs on the first pass. - */ - - for (pass = 0; pass < 2; pass++) { - duk_set_top(thr, 2); /* -> [ hobject props ] */ - duk_enum(thr, 1, DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_INCLUDE_SYMBOLS /*enum_flags*/); - - for (;;) { - duk_hstring *key; - - /* [ hobject props enum(props) ] */ - - duk_set_top(thr, 3); - - if (!duk_next(thr, 2, 1 /*get_value*/)) { - break; - } - - DUK_DDD(DUK_DDDPRINT("-> key=%!iT, desc=%!iT", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - /* [ hobject props enum(props) key desc ] */ - - duk_hobject_prepare_property_descriptor(thr, - 4 /*idx_desc*/, - &defprop_flags, - &idx_value, - &get, - &set); - - /* [ hobject props enum(props) key desc [multiple values] ] */ - - if (pass == 0) { - continue; - } - - /* This allows symbols on purpose. */ - key = duk_known_hstring(thr, 3); - DUK_ASSERT(key != NULL); - - duk_hobject_define_property_helper(thr, - defprop_flags, - obj, - key, - idx_value, - get, - set, - 1 /*throw_flag*/); - } - } - - /* - * Return target object - */ - - duk_dup_0(thr); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 1); - - duk_seal_freeze_raw(thr, 0, (duk_bool_t) duk_get_current_magic(thr) /*is_freeze*/); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_hthread *thr) { - duk_hobject *h; - duk_bool_t is_frozen; - duk_uint_t mask; - - is_frozen = (duk_bool_t) duk_get_current_magic(thr); - mask = duk_get_type_mask(thr, 0); - if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { - DUK_ASSERT(is_frozen == 0 || is_frozen == 1); - duk_push_boolean(thr, (mask & DUK_TYPE_MASK_LIGHTFUNC) ? - 1 : /* lightfunc always frozen and sealed */ - (is_frozen ^ 1)); /* buffer sealed but not frozen (index props writable) */ - } else { - /* ES2015 Sections 19.1.2.12, 19.1.2.13: anything other than an object - * is considered to be already sealed and frozen. - */ - h = duk_get_hobject(thr, 0); - duk_push_boolean(thr, (h == NULL) || - duk_hobject_object_is_sealed_frozen_helper(thr, h, is_frozen /*is_frozen*/)); - } - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 0); - (void) duk_push_this_coercible_to_object(thr); - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_TO_STRING); -#if 0 /* This is mentioned explicitly in the E5.1 spec, but duk_call_method() checks for it in practice. */ - duk_require_callable(thr, 1); -#endif - duk_dup_0(thr); /* -> [ O toString O ] */ - duk_call_method(thr, 0); /* XXX: call method tail call? */ - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_value_of(duk_hthread *thr) { - /* For lightfuncs and plain buffers, returns Object() coerced. */ - (void) duk_push_this_coercible_to_object(thr); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_hthread *thr) { - duk_hobject *h_v; - duk_hobject *h_obj; - - DUK_ASSERT_TOP(thr, 1); - - h_v = duk_get_hobject(thr, 0); - if (!h_v) { - duk_push_false(thr); /* XXX: tail call: return duk_push_false(thr) */ - return 1; - } - - h_obj = duk_push_this_coercible_to_object(thr); - DUK_ASSERT(h_obj != NULL); - - /* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare. - * Prototype loops should cause an error to be thrown. - */ - duk_push_boolean(thr, duk_hobject_prototype_chain_contains(thr, DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_v), h_obj, 0 /*ignore_loop*/)); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_has_own_property(duk_hthread *thr) { - return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, 0 /*required_desc_flags*/); -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_hthread *thr) { - return (duk_ret_t) duk_hobject_object_ownprop_helper(thr, DUK_PROPDESC_FLAG_ENUMERABLE /*required_desc_flags*/); -} -#endif /* DUK_USE_OBJECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -/* Shared helper to implement Object.getPrototypeOf, - * Object.prototype.__proto__ getter, and Reflect.getPrototypeOf. - * - * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__ - */ -DUK_INTERNAL duk_ret_t duk_bi_object_getprototype_shared(duk_hthread *thr) { - /* - * magic = 0: __proto__ getter - * magic = 1: Object.getPrototypeOf() - * magic = 2: Reflect.getPrototypeOf() - */ - - duk_hobject *h; - duk_hobject *proto; - duk_tval *tv; - duk_int_t magic; - - magic = duk_get_current_magic(thr); - - if (magic == 0) { - DUK_ASSERT_TOP(thr, 0); - duk_push_this_coercible_to_object(thr); - } - DUK_ASSERT(duk_get_top(thr) >= 1); - if (magic < 2) { - /* ES2015 Section 19.1.2.9, step 1 */ - duk_to_object(thr, 0); - } - tv = DUK_GET_TVAL_POSIDX(thr, 0); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_BUFFER: - proto = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - break; - case DUK_TAG_LIGHTFUNC: - proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; - break; - case DUK_TAG_OBJECT: - h = DUK_TVAL_GET_OBJECT(tv); - proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); - break; - default: - /* This implicitly handles CheckObjectCoercible() caused - * TypeError. - */ - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - if (proto != NULL) { - duk_push_hobject(thr, proto); - } else { - duk_push_null(thr); - } - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -/* Shared helper to implement ES2015 Object.setPrototypeOf, - * Object.prototype.__proto__ setter, and Reflect.setPrototypeOf. - * - * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__ - * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.setprototypeof - */ -DUK_INTERNAL duk_ret_t duk_bi_object_setprototype_shared(duk_hthread *thr) { - /* - * magic = 0: __proto__ setter - * magic = 1: Object.setPrototypeOf() - * magic = 2: Reflect.setPrototypeOf() - */ - - duk_hobject *h_obj; - duk_hobject *h_new_proto; - duk_hobject *h_curr; - duk_ret_t ret_success = 1; /* retval for success path */ - duk_uint_t mask; - duk_int_t magic; - - /* Preliminaries for __proto__ and setPrototypeOf (E6 19.1.2.18 steps 1-4). */ - magic = duk_get_current_magic(thr); - if (magic == 0) { - duk_push_this_check_object_coercible(thr); - duk_insert(thr, 0); - if (!duk_check_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT)) { - return 0; - } - - /* __proto__ setter returns 'undefined' on success unlike the - * setPrototypeOf() call which returns the target object. - */ - ret_success = 0; - } else { - if (magic == 1) { - duk_require_object_coercible(thr, 0); - } else { - duk_require_hobject_accept_mask(thr, 0, - DUK_TYPE_MASK_LIGHTFUNC | - DUK_TYPE_MASK_BUFFER); - } - duk_require_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT); - } - - h_new_proto = duk_get_hobject(thr, 1); - /* h_new_proto may be NULL */ - - mask = duk_get_type_mask(thr, 0); - if (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) { - duk_hobject *curr_proto; - curr_proto = thr->builtins[(mask & DUK_TYPE_MASK_LIGHTFUNC) ? - DUK_BIDX_FUNCTION_PROTOTYPE : - DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - if (h_new_proto == curr_proto) { - goto skip; - } - goto fail_nonextensible; - } - h_obj = duk_get_hobject(thr, 0); - if (h_obj == NULL) { - goto skip; - } - DUK_ASSERT(h_obj != NULL); - - /* [[SetPrototypeOf]] standard behavior, E6 9.1.2. */ - /* TODO: implement Proxy object support here */ - - if (h_new_proto == DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_obj)) { - goto skip; - } - if (!DUK_HOBJECT_HAS_EXTENSIBLE(h_obj)) { - goto fail_nonextensible; - } - for (h_curr = h_new_proto; h_curr != NULL; h_curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_curr)) { - /* Loop prevention. */ - if (h_curr == h_obj) { - goto fail_loop; - } - } - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h_obj, h_new_proto); - /* fall thru */ - - skip: - duk_set_top(thr, 1); - if (magic == 2) { - duk_push_true(thr); - } - return ret_success; - - fail_nonextensible: - fail_loop: - if (magic != 2) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } else { - duk_push_false(thr); - return 1; - } -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_property(duk_hthread *thr) { - /* - * magic = 0: Object.defineProperty() - * magic = 1: Reflect.defineProperty() - */ - - duk_hobject *obj; - duk_hstring *key; - duk_hobject *get; - duk_hobject *set; - duk_idx_t idx_value; - duk_uint_t defprop_flags; - duk_small_uint_t magic; - duk_bool_t throw_flag; - duk_bool_t ret; - - DUK_ASSERT(thr != NULL); - - DUK_DDD(DUK_DDDPRINT("Object.defineProperty(): ctx=%p obj=%!T key=%!T desc=%!T", - (void *) thr, - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1), - (duk_tval *) duk_get_tval(thr, 2))); - - /* [ obj key desc ] */ - - magic = (duk_small_uint_t) duk_get_current_magic(thr); - - /* Lightfuncs are currently supported by coercing to a temporary - * Function object; changes will be allowed (the coerced value is - * extensible) but will be lost. Same for plain buffers. - */ - obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - DUK_ASSERT(obj != NULL); - key = duk_to_property_key_hstring(thr, 1); - (void) duk_require_hobject(thr, 2); - - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(duk_get_hobject(thr, 2) != NULL); - - /* - * Validate and convert argument property descriptor (an Ecmascript - * object) into a set of defprop_flags and possibly property value, - * getter, and/or setter values on the value stack. - * - * Lightfunc set/get values are coerced to full Functions. - */ - - duk_hobject_prepare_property_descriptor(thr, - 2 /*idx_desc*/, - &defprop_flags, - &idx_value, - &get, - &set); - - /* - * Use Object.defineProperty() helper for the actual operation. - */ - - DUK_ASSERT(magic == 0U || magic == 1U); - throw_flag = magic ^ 1U; - ret = duk_hobject_define_property_helper(thr, - defprop_flags, - obj, - key, - idx_value, - get, - set, - throw_flag); - - /* Ignore the normalize/validate helper outputs on the value stack, - * they're popped automatically. - */ - - if (magic == 0U) { - /* Object.defineProperty(): return target object. */ - duk_push_hobject(thr, obj); - } else { - /* Reflect.defineProperty(): return success/fail. */ - duk_push_boolean(thr, ret); - } - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 2); - - /* ES2015 Section 19.1.2.6, step 1 */ - if (duk_get_current_magic(thr) == 0) { - duk_to_object(thr, 0); - } - - /* [ obj key ] */ - - duk_hobject_object_get_own_property_descriptor(thr, -2); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_extensible(duk_hthread *thr) { - /* - * magic = 0: Object.isExtensible() - * magic = 1: Reflect.isExtensible() - */ - - duk_hobject *h; - - if (duk_get_current_magic(thr) == 0) { - h = duk_get_hobject(thr, 0); - } else { - /* Reflect.isExtensible(): throw if non-object, but we accept lightfuncs - * and plain buffers here because they pretend to be objects. - */ - h = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - } - - duk_push_boolean(thr, (h != NULL) && DUK_HOBJECT_HAS_EXTENSIBLE(h)); - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -/* Shared helper for various key/symbol listings, magic: - * 0=Object.keys() - * 1=Object.getOwnPropertyNames(), - * 2=Object.getOwnPropertySymbols(), - * 3=Reflect.ownKeys() - */ -DUK_LOCAL const duk_small_uint_t duk__object_keys_enum_flags[4] = { - /* Object.keys() */ - DUK_ENUM_OWN_PROPERTIES_ONLY | - DUK_ENUM_NO_PROXY_BEHAVIOR, - - /* Object.getOwnPropertyNames() */ - DUK_ENUM_INCLUDE_NONENUMERABLE | - DUK_ENUM_OWN_PROPERTIES_ONLY | - DUK_ENUM_NO_PROXY_BEHAVIOR, - - /* Object.getOwnPropertySymbols() */ - DUK_ENUM_INCLUDE_SYMBOLS | - DUK_ENUM_OWN_PROPERTIES_ONLY | - DUK_ENUM_EXCLUDE_STRINGS | - DUK_ENUM_INCLUDE_NONENUMERABLE | - DUK_ENUM_NO_PROXY_BEHAVIOR, - - /* Reflect.ownKeys() */ - DUK_ENUM_INCLUDE_SYMBOLS | - DUK_ENUM_OWN_PROPERTIES_ONLY | - DUK_ENUM_INCLUDE_NONENUMERABLE | - DUK_ENUM_NO_PROXY_BEHAVIOR -}; - -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_keys_shared(duk_hthread *thr) { - duk_hobject *obj; -#if defined(DUK_USE_ES6_PROXY) - duk_hobject *h_proxy_target; - duk_hobject *h_proxy_handler; - duk_hobject *h_trap_result; -#endif - duk_small_uint_t enum_flags; - duk_int_t magic; - - DUK_ASSERT_TOP(thr, 1); - - magic = duk_get_current_magic(thr); - if (magic == 3) { - /* ES2015 Section 26.1.11 requires a TypeError for non-objects. Lightfuncs - * and plain buffers pretend to be objects, so accept those too. - */ - obj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - } else { - /* ES2015: ToObject coerce. */ - obj = duk_to_hobject(thr, 0); - } - DUK_ASSERT(obj != NULL); - DUK_UNREF(obj); - - /* XXX: proxy chains */ - -#if defined(DUK_USE_ES6_PROXY) - /* XXX: better sharing of code between proxy target call sites */ - if (DUK_LIKELY(!duk_hobject_proxy_check(obj, - &h_proxy_target, - &h_proxy_handler))) { - goto skip_proxy; - } - - duk_push_hobject(thr, h_proxy_handler); - if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) { - /* Careful with reachability here: don't pop 'obj' before pushing - * proxy target. - */ - DUK_DDD(DUK_DDDPRINT("no ownKeys trap, get keys of target instead")); - duk_pop_2(thr); - duk_push_hobject(thr, h_proxy_target); - duk_replace(thr, 0); - DUK_ASSERT_TOP(thr, 1); - goto skip_proxy; - } - - /* [ obj handler trap ] */ - duk_insert(thr, -2); - duk_push_hobject(thr, h_proxy_target); /* -> [ obj trap handler target ] */ - duk_call_method(thr, 1 /*nargs*/); /* -> [ obj trap_result ] */ - h_trap_result = duk_require_hobject(thr, -1); - DUK_UNREF(h_trap_result); - - magic = duk_get_current_magic(thr); - DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t))); - enum_flags = duk__object_keys_enum_flags[magic]; - - duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags); - return 1; - - skip_proxy: -#endif /* DUK_USE_ES6_PROXY */ - - DUK_ASSERT_TOP(thr, 1); - magic = duk_get_current_magic(thr); - DUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t))); - enum_flags = duk__object_keys_enum_flags[magic]; - return duk_hobject_get_enumerated_keys(thr, enum_flags); -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_hthread *thr) { - /* - * magic = 0: Object.preventExtensions() - * magic = 1: Reflect.preventExtensions() - */ - - duk_hobject *h; - duk_uint_t mask; - duk_int_t magic; - - magic = duk_get_current_magic(thr); - - /* Silent success for lightfuncs and plain buffers always. */ - mask = DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER; - - /* Object.preventExtensions() silent success for non-object. */ - if (magic == 0) { - mask |= DUK_TYPE_MASK_UNDEFINED | - DUK_TYPE_MASK_NULL | - DUK_TYPE_MASK_BOOLEAN | - DUK_TYPE_MASK_NUMBER | - DUK_TYPE_MASK_STRING | - DUK_TYPE_MASK_POINTER; - } - - if (duk_check_type_mask(thr, 0, mask)) { - /* Not an object, already non-extensible so always success. */ - goto done; - } - h = duk_require_hobject(thr, 0); - DUK_ASSERT(h != NULL); - - DUK_HOBJECT_CLEAR_EXTENSIBLE(h); - - /* A non-extensible object cannot gain any more properties, - * so this is a good time to compact. - */ - duk_hobject_compact_props(thr, h); - - done: - if (magic == 1) { - duk_push_true(thr); - } - return 1; -} -#endif /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */ - -/* - * __defineGetter__, __defineSetter__, __lookupGetter__, __lookupSetter__ - */ - -#if defined(DUK_USE_ES8) -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_hthread *thr) { - duk_push_this(thr); - duk_insert(thr, 0); - duk_to_object(thr, 0); - duk_require_callable(thr, 2); - - /* [ ToObject(this) key getter/setter ] */ - - /* ToPropertyKey() coercion is not needed, duk_def_prop() does it. */ - duk_def_prop(thr, 0, DUK_DEFPROP_SET_ENUMERABLE | - DUK_DEFPROP_SET_CONFIGURABLE | - (duk_get_current_magic(thr) ? DUK_DEFPROP_HAVE_SETTER : DUK_DEFPROP_HAVE_GETTER)); - return 0; -} -DUK_INTERNAL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_hthread *thr) { - duk_uint_t sanity; - - duk_push_this(thr); - duk_to_object(thr, -1); - - /* XXX: Prototype walk (with sanity) should be a core property - * operation, could add a flag to e.g. duk_get_prop_desc(). - */ - - /* ToPropertyKey() coercion is not needed, duk_get_prop_desc() does it. */ - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - while (!duk_is_undefined(thr, -1)) { - /* [ key obj ] */ - duk_dup(thr, 0); - duk_get_prop_desc(thr, 1, 0 /*flags*/); - if (!duk_is_undefined(thr, -1)) { - duk_get_prop_stridx(thr, -1, (duk_get_current_magic(thr) != 0 ? DUK_STRIDX_SET : DUK_STRIDX_GET)); - return 1; - } - duk_pop(thr); - - if (DUK_UNLIKELY(sanity-- == 0)) { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - - duk_get_prototype(thr, -1); - duk_remove(thr, -2); - } - return 1; -} -#endif /* DUK_USE_ES8 */ -#line 1 "duk_bi_performance.c" -/* - * High resolution time API (performance.now() et al) - * - * API specification: https://encoding.spec.whatwg.org/#ap://www.w3.org/TR/hr-time/ - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_PERFORMANCE_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_performance_now(duk_hthread *thr) { - /* From API spec: - * The DOMHighResTimeStamp type is used to store a time value in - * milliseconds, measured relative from the time origin, global - * monotonic clock, or a time value that represents a duration - * between two DOMHighResTimeStamp's. - */ - duk_push_number(thr, duk_time_get_monotonic_time(thr)); - return 1; -} - -#if 0 /* Missing until semantics decided. */ -DUK_INTERNAL duk_ret_t duk_bi_performance_timeorigin_getter(duk_hthread *thr) { - /* No decision yet how to handle timeOrigins, e.g. should one be - * initialized per heap, or per global object set. See - * https://www.w3.org/TR/hr-time/#time-origin. - */ - duk_push_uint(thr, 0); - return 1; -} -#endif /* 0 */ -#endif /* DUK_USE_PERFORMANCE_BUILTIN */ -#line 1 "duk_bi_pointer.c" -/* - * Pointer built-ins - */ - -/* #include duk_internal.h -> already included */ - -/* - * Constructor - */ - -DUK_INTERNAL duk_ret_t duk_bi_pointer_constructor(duk_hthread *thr) { - /* XXX: this behavior is quite useless now; it would be nice to be able - * to create pointer values from e.g. numbers or strings. Numbers are - * problematic on 64-bit platforms though. Hex encoded strings? - */ - if (duk_get_top(thr) == 0) { - duk_push_pointer(thr, NULL); - } else { - duk_to_pointer(thr, 0); - } - DUK_ASSERT(duk_is_pointer(thr, 0)); - duk_set_top(thr, 1); - - if (duk_is_constructor_call(thr)) { - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER), - DUK_BIDX_POINTER_PROTOTYPE); - - /* Pointer object internal value is immutable */ - duk_dup_0(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); - } - /* Note: unbalanced stack on purpose */ - - return 1; -} - -/* - * toString(), valueOf() - */ - -DUK_INTERNAL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_hthread *thr) { - duk_tval *tv; - duk_small_int_t to_string = duk_get_current_magic(thr); - - duk_push_this(thr); - tv = duk_require_tval(thr, -1); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_POINTER(tv)) { - /* nop */ - } else if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - /* Must be a "pointer object", i.e. class "Pointer" */ - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_POINTER) { - goto type_error; - } - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - } else { - goto type_error; - } - - if (to_string) { - duk_to_string(thr, -1); - } - return 1; - - type_error: - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} -#line 1 "duk_bi_promise.c" -/* - * Promise built-in - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_PROMISE_BUILTIN) - -DUK_INTERNAL duk_ret_t duk_bi_promise_constructor(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_all(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_race(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_reject(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_resolve(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_catch(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -DUK_INTERNAL duk_ret_t duk_bi_promise_then(duk_hthread *thr) { - DUK_ERROR_TYPE(thr, "unimplemented"); - return 0; -} - -#endif /* DUK_USE_PROMISE_BUILTIN */ -#line 1 "duk_bi_proxy.c" -/* - * Proxy built-in (ES2015) - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_ES6_PROXY) -/* Post-process a Proxy ownKeys() result at stack top. Push a cleaned up - * array of valid result keys (strings or symbols). TypeError for invalid - * values. Flags are shared with duk_enum(). - */ -DUK_INTERNAL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags) { - duk_uarridx_t i, len, idx; - duk_propdesc desc; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(h_proxy_target != NULL); - - len = (duk_uarridx_t) duk_get_length(thr, -1); - idx = 0; - duk_push_array(thr); - /* XXX: preallocated dense array, fill in directly */ - for (i = 0; i < len; i++) { - duk_hstring *h; - - /* [ obj trap_result res_arr ] */ - (void) duk_get_prop_index(thr, -2, i); - h = duk_get_hstring(thr, -1); - if (h == NULL) { - DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr); - } - - if (!(flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) { - /* No support for 'getOwnPropertyDescriptor' trap yet, - * so check enumerability always from target object - * descriptor. - */ - if (duk_hobject_get_own_propdesc(thr, h_proxy_target, duk_known_hstring(thr, -1), &desc, 0 /*flags*/)) { - if ((desc.flags & DUK_PROPDESC_FLAG_ENUMERABLE) == 0) { - DUK_DDD(DUK_DDDPRINT("ignore non-enumerable property: %!T", duk_get_tval(thr, -1))); - goto skip_key; - } - } else { - DUK_DDD(DUK_DDDPRINT("ignore non-existent property: %!T", duk_get_tval(thr, -1))); - goto skip_key; - } - } - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - if (!(flags & DUK_ENUM_INCLUDE_SYMBOLS)) { - DUK_DDD(DUK_DDDPRINT("ignore symbol property: %!T", duk_get_tval(thr, -1))); - goto skip_key; - } - if (DUK_HSTRING_HAS_HIDDEN(h) && !(flags & DUK_ENUM_INCLUDE_HIDDEN)) { - DUK_DDD(DUK_DDDPRINT("ignore hidden symbol property: %!T", duk_get_tval(thr, -1))); - goto skip_key; - } - } else { - if (flags & DUK_ENUM_EXCLUDE_STRINGS) { - DUK_DDD(DUK_DDDPRINT("ignore string property: %!T", duk_get_tval(thr, -1))); - goto skip_key; - } - } - - /* [ obj trap_result res_arr propname ] */ - duk_put_prop_index(thr, -2, idx++); - continue; - - skip_key: - duk_pop(thr); - continue; - } - - /* XXX: Missing trap result validation for non-configurable target keys - * (must be present), for non-extensible target all target keys must be - * present and no extra keys can be present. - * http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys - */ - - /* XXX: The key enumerability check should trigger the "getOwnPropertyDescriptor" - * trap which has not yet been implemented. In the absence of such a trap, - * the enumerability should be checked from the target object; this is - * handled above. - */ -} -#endif /* DUK_USE_ES6_PROXY */ - -#if defined(DUK_USE_ES6_PROXY) -DUK_INTERNAL duk_ret_t duk_bi_proxy_constructor(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 2); /* [ target handler ] */ - - duk_require_constructor_call(thr); - duk_push_proxy(thr, 0 /*flags*/); /* [ target handler ] -> [ proxy ] */ - return 1; /* replacement */ -} -#endif /* DUK_USE_ES6_PROXY */ -#line 1 "duk_bi_reflect.c" -/* - * 'Reflect' built-in (ES2016 Section 26.1) - * http://www.ecma-international.org/ecma-262/7.0/#sec-reflect-object - * - * Many Reflect built-in functions are provided by shared helpers in - * duk_bi_object.c or duk_bi_function.c. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_REFLECT_BUILTIN) -DUK_INTERNAL duk_ret_t duk_bi_reflect_object_delete_property(duk_hthread *thr) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t ret; - - DUK_ASSERT_TOP(thr, 2); - (void) duk_require_hobject(thr, 0); - (void) duk_to_string(thr, 1); - - /* [ target key ] */ - - DUK_ASSERT(thr != NULL); - tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); - tv_key = DUK_GET_TVAL_POSIDX(thr, 1); - ret = duk_hobject_delprop(thr, tv_obj, tv_key, 0 /*throw_flag*/); - duk_push_boolean(thr, ret); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_reflect_object_get(duk_hthread *thr) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_idx_t nargs; - - DUK_ASSERT(thr != NULL); - nargs = duk_get_top_require_min(thr, 2 /*min_top*/); - (void) duk_require_hobject(thr, 0); - (void) duk_to_string(thr, 1); - if (nargs >= 3 && !duk_strict_equals(thr, 0, 2)) { - /* XXX: [[Get]] receiver currently unsupported */ - DUK_ERROR_UNSUPPORTED(thr); - } - - /* [ target key receiver? ...? ] */ - - tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); - tv_key = DUK_GET_TVAL_POSIDX(thr, 1); - (void) duk_hobject_getprop(thr, tv_obj, tv_key); /* This could also be a duk_get_prop(). */ - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_reflect_object_has(duk_hthread *thr) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_bool_t ret; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT_TOP(thr, 2); - (void) duk_require_hobject(thr, 0); - (void) duk_to_string(thr, 1); - - /* [ target key ] */ - - tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); - tv_key = DUK_GET_TVAL_POSIDX(thr, 1); - ret = duk_hobject_hasprop(thr, tv_obj, tv_key); - duk_push_boolean(thr, ret); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_reflect_object_set(duk_hthread *thr) { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_tval *tv_val; - duk_idx_t nargs; - duk_bool_t ret; - - DUK_ASSERT(thr != NULL); - nargs = duk_get_top_require_min(thr, 3 /*min_top*/); - (void) duk_require_hobject(thr, 0); - (void) duk_to_string(thr, 1); - if (nargs >= 4 && !duk_strict_equals(thr, 0, 3)) { - /* XXX: [[Set]] receiver currently unsupported */ - DUK_ERROR_UNSUPPORTED(thr); - } - - /* [ target key value receiver? ...? ] */ - - tv_obj = DUK_GET_TVAL_POSIDX(thr, 0); - tv_key = DUK_GET_TVAL_POSIDX(thr, 1); - tv_val = DUK_GET_TVAL_POSIDX(thr, 2); - ret = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, 0 /*throw_flag*/); - duk_push_boolean(thr, ret); - return 1; -} -#endif /* DUK_USE_REFLECT_BUILTIN */ -#line 1 "duk_bi_regexp.c" -/* - * RegExp built-ins - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_REGEXP_SUPPORT) - -DUK_LOCAL void duk__get_this_regexp(duk_hthread *thr) { - duk_hobject *h; - - duk_push_this(thr); - h = duk_require_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_REGEXP); - DUK_ASSERT(h != NULL); - DUK_UNREF(h); - duk_insert(thr, 0); /* prepend regexp to valstack 0 index */ -} - -/* XXX: much to improve (code size) */ -DUK_INTERNAL duk_ret_t duk_bi_regexp_constructor(duk_hthread *thr) { - duk_hobject *h_pattern; - - DUK_ASSERT_TOP(thr, 2); - h_pattern = duk_get_hobject(thr, 0); - - if (!duk_is_constructor_call(thr) && - h_pattern != NULL && - DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP && - duk_is_undefined(thr, 1)) { - /* Called as a function, pattern has [[Class]] "RegExp" and - * flags is undefined -> return object as is. - */ - /* XXX: ES2015 has a NewTarget SameValue() check which is not - * yet implemented. - */ - duk_dup_0(thr); - return 1; - } - - /* Else functionality is identical for function call and constructor - * call. - */ - - if (h_pattern != NULL && - DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP) { - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_SOURCE); - if (duk_is_undefined(thr, 1)) { - /* In ES5 one would need to read the flags individually; - * in ES2015 just read .flags. - */ - duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS); - } else { - /* In ES2015 allowed; overrides argument RegExp flags. */ - duk_dup_1(thr); - } - } else { - if (duk_is_undefined(thr, 0)) { - duk_push_hstring_empty(thr); - } else { - duk_dup_0(thr); - duk_to_string(thr, -1); /* Rejects Symbols. */ - } - if (duk_is_undefined(thr, 1)) { - duk_push_hstring_empty(thr); - } else { - duk_dup_1(thr); - duk_to_string(thr, -1); /* Rejects Symbols. */ - } - - /* [ ... pattern flags ] */ - } - - DUK_DDD(DUK_DDDPRINT("RegExp constructor/function call, pattern=%!T, flags=%!T", - (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1))); - - /* [ ... pattern flags ] (both uncoerced) */ - - duk_to_string(thr, -2); - duk_to_string(thr, -1); - duk_regexp_compile(thr); - - /* [ ... bytecode escaped_source ] */ - - duk_regexp_create_instance(thr); - - /* [ ... RegExp ] */ - - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_exec(duk_hthread *thr) { - duk__get_this_regexp(thr); - - /* [ regexp input ] */ - - duk_regexp_match(thr); - - /* [ result ] */ - - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_test(duk_hthread *thr) { - duk__get_this_regexp(thr); - - /* [ regexp input ] */ - - /* result object is created and discarded; wasteful but saves code space */ - duk_regexp_match(thr); - - /* [ result ] */ - - duk_push_boolean(thr, (duk_is_null(thr, -1) ? 0 : 1)); - - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_tostring(duk_hthread *thr) { - /* This must be generic in ES2015 and later. */ - DUK_ASSERT_TOP(thr, 0); - duk_push_this(thr); - duk_push_string(thr, "/"); - duk_get_prop_stridx(thr, 0, DUK_STRIDX_SOURCE); - duk_dup_m2(thr); /* another "/" */ - duk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS); - duk_concat(thr, 4); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_flags(duk_hthread *thr) { - /* .flags is ES2015 but present even when ES2015 bindings are - * disabled because the constructor relies on it. - */ - duk_uint8_t buf[8]; /* enough for all flags + NUL */ - duk_uint8_t *p = buf; - - /* .flags is generic and works on any object. */ - duk_push_this(thr); - (void) duk_require_hobject(thr, -1); - if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL)) { - *p++ = DUK_ASC_LC_G; - } - if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_IGNORE_CASE, NULL)) { - *p++ = DUK_ASC_LC_I; - } - if (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_MULTILINE, NULL)) { - *p++ = DUK_ASC_LC_M; - } - /* .unicode: to be added */ - /* .sticky: to be added */ - *p++ = DUK_ASC_NUL; - DUK_ASSERT((duk_size_t) (p - buf) <= sizeof(buf)); - - duk_push_string(thr, (const char *) buf); - return 1; -} - -/* Shared helper for providing .source, .global, .multiline, etc getters. */ -DUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_hthread *thr) { - duk_hstring *h_bc; - duk_small_uint_t re_flags; - duk_hobject *h; - duk_int_t magic; - - DUK_ASSERT_TOP(thr, 0); - - duk_push_this(thr); - h = duk_require_hobject(thr, -1); - magic = duk_get_current_magic(thr); - - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_REGEXP) { - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_SOURCE); - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_BYTECODE); - h_bc = duk_require_hstring(thr, -1); - re_flags = (duk_small_uint_t) DUK_HSTRING_GET_DATA(h_bc)[0]; /* Safe even if h_bc length is 0 (= NUL) */ - duk_pop(thr); - } else if (h == thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]) { - /* In ES2015 and ES2016 a TypeError would be thrown here. - * However, this had real world issues so ES2017 draft - * allows RegExp.prototype specifically, returning '(?:)' - * for .source and undefined for all flags. - */ - if (magic != 16 /* .source */) { - return 0; - } - duk_push_string(thr, "(?:)"); /* .source handled by switch-case */ - re_flags = 0; - } else { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); - } - - /* [ regexp source ] */ - - switch (magic) { - case 0: { /* global */ - duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_GLOBAL)); - break; - } - case 1: { /* ignoreCase */ - duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_IGNORE_CASE)); - break; - } - case 2: { /* multiline */ - duk_push_boolean(thr, (re_flags & DUK_RE_FLAG_MULTILINE)); - break; - } -#if 0 - /* Don't provide until implemented to avoid interfering with feature - * detection in user code. - */ - case 3: /* sticky */ - case 4: { /* unicode */ - duk_push_false(thr); - break; - } -#endif - default: { /* source */ - /* leave 'source' on top */ - break; - } - } - - return 1; -} - -#endif /* DUK_USE_REGEXP_SUPPORT */ -#line 1 "duk_bi_string.c" -/* - * String built-ins - * - * Most String built-ins must only accept strings (or String objects). - * Symbols, represented internally as strings, must be generally rejected. - * The duk_push_this_coercible_to_string() helper does this automatically. - */ - -/* XXX: There are several limitations in the current implementation for - * strings with >= 0x80000000UL characters. In some cases one would need - * to be able to represent the range [-0xffffffff,0xffffffff] and so on. - * Generally character and byte length are assumed to fit into signed 32 - * bits (< 0x80000000UL). Places with issues are not marked explicitly - * below in all cases, look for signed type usage (duk_int_t etc) for - * offsets/lengths. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_STRING_BUILTIN) - -/* - * Helpers - */ - -DUK_LOCAL duk_hstring *duk__str_tostring_notregexp(duk_hthread *thr, duk_idx_t idx) { - duk_hstring *h; - - if (duk_get_class_number(thr, idx) == DUK_HOBJECT_CLASS_REGEXP) { - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - h = duk_to_hstring(thr, idx); - DUK_ASSERT(h != NULL); - - return h; -} - -DUK_LOCAL duk_int_t duk__str_search_shared(duk_hthread *thr, duk_hstring *h_this, duk_hstring *h_search, duk_int_t start_cpos, duk_bool_t backwards) { - duk_int_t cpos; - duk_int_t bpos; - const duk_uint8_t *p_start, *p_end, *p; - const duk_uint8_t *q_start; - duk_int_t q_blen; - duk_uint8_t firstbyte; - duk_uint8_t t; - - cpos = start_cpos; - - /* Empty searchstring always matches; cpos must be clamped here. - * (If q_blen were < 0 due to clamped coercion, it would also be - * caught here.) - */ - q_start = DUK_HSTRING_GET_DATA(h_search); - q_blen = (duk_int_t) DUK_HSTRING_GET_BYTELEN(h_search); - if (q_blen <= 0) { - return cpos; - } - DUK_ASSERT(q_blen > 0); - - bpos = (duk_int_t) duk_heap_strcache_offset_char2byte(thr, h_this, (duk_uint32_t) cpos); - - p_start = DUK_HSTRING_GET_DATA(h_this); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_this); - p = p_start + bpos; - - /* This loop is optimized for size. For speed, there should be - * two separate loops, and we should ensure that memcmp() can be - * used without an extra "will searchstring fit" check. Doing - * the preconditioning for 'p' and 'p_end' is easy but cpos - * must be updated if 'p' is wound back (backward scanning). - */ - - firstbyte = q_start[0]; /* leading byte of match string */ - while (p <= p_end && p >= p_start) { - t = *p; - - /* For Ecmascript strings, this check can only match for - * initial UTF-8 bytes (not continuation bytes). For other - * strings all bets are off. - */ - - if ((t == firstbyte) && ((duk_size_t) (p_end - p) >= (duk_size_t) q_blen)) { - DUK_ASSERT(q_blen > 0); /* no issues with memcmp() zero size, even if broken */ - if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { - return cpos; - } - } - - /* track cpos while scanning */ - if (backwards) { - /* when going backwards, we decrement cpos 'early'; - * 'p' may point to a continuation byte of the char - * at offset 'cpos', but that's OK because we'll - * backtrack all the way to the initial byte. - */ - if ((t & 0xc0) != 0x80) { - cpos--; - } - p--; - } else { - if ((t & 0xc0) != 0x80) { - cpos++; - } - p++; - } - } - - /* Not found. Empty string case is handled specially above. */ - return -1; -} - -/* - * Constructor - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_constructor(duk_hthread *thr) { - duk_hstring *h; - duk_uint_t flags; - - /* String constructor needs to distinguish between an argument not given at all - * vs. given as 'undefined'. We're a vararg function to handle this properly. - */ - - /* XXX: copy current activation flags to thr, including current magic, - * is_constructor_call etc. This takes a few bytes in duk_hthread but - * makes call sites smaller (there are >30 is_constructor_call and get - * current magic call sites. - */ - - if (duk_get_top(thr) == 0) { - duk_push_hstring_empty(thr); - } else { - h = duk_to_hstring_acceptsymbol(thr, 0); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h) && !duk_is_constructor_call(thr))) { - duk_push_symbol_descriptive_string(thr, h); - duk_replace(thr, 0); - } - } - duk_to_string(thr, 0); /* catches symbol argument for constructor call */ - DUK_ASSERT(duk_is_string(thr, 0)); - duk_set_top(thr, 1); /* Top may be 1 or larger. */ - - if (duk_is_constructor_call(thr)) { - /* String object internal value is immutable */ - flags = DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING); - duk_push_object_helper(thr, flags, DUK_BIDX_STRING_PROTOTYPE); - duk_dup_0(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); - } - /* Note: unbalanced stack on purpose */ - - return 1; -} - -DUK_LOCAL duk_ret_t duk__construct_from_codepoints(duk_hthread *thr, duk_bool_t nonbmp) { - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; - duk_idx_t i, n; - duk_ucodepoint_t cp; - - /* XXX: It would be nice to build the string directly but ToUint16() - * coercion is needed so a generic helper would not be very - * helpful (perhaps coerce the value stack first here and then - * build a string from a duk_tval number sequence in one go?). - */ - - n = duk_get_top(thr); - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(thr, bw, (duk_size_t) n); /* initial estimate for ASCII only codepoints */ - - for (i = 0; i < n; i++) { - /* XXX: could improve bufwriter handling to write multiple codepoints - * with one ensure call but the relative benefit would be quite small. - */ - - if (nonbmp) { - /* ES2015 requires that (1) SameValue(cp, ToInteger(cp)) and - * (2) cp >= 0 and cp <= 0x10ffff. This check does not - * implement the steps exactly but the outcome should be - * the same. - */ - duk_int32_t i32 = 0; - if (!duk_is_whole_get_int32(duk_to_number(thr, i), &i32) || - i32 < 0 || i32 > 0x10ffffL) { - DUK_DCERROR_RANGE_INVALID_ARGS(thr); - } - DUK_ASSERT(i32 >= 0 && i32 <= 0x10ffffL); - cp = (duk_ucodepoint_t) i32; - DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp); - } else { -#if defined(DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT) - /* ToUint16() coercion is mandatory in the E5.1 specification, but - * this non-compliant behavior makes more sense because we support - * non-BMP codepoints. Don't use CESU-8 because that'd create - * surrogate pairs. - */ - cp = (duk_ucodepoint_t) duk_to_uint32(thr, i); - DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp); -#else - cp = (duk_ucodepoint_t) duk_to_uint16(thr, i); - DUK_ASSERT(cp >= 0 && cp <= 0x10ffffL); - DUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp); -#endif - } - } - - DUK_BW_COMPACT(thr, bw); - (void) duk_buffer_to_string(thr, -1); /* Safe, extended UTF-8 or CESU-8 encoded. */ - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_char_code(duk_hthread *thr) { - return duk__construct_from_codepoints(thr, 0 /*nonbmp*/); -} - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_code_point(duk_hthread *thr) { - return duk__construct_from_codepoints(thr, 1 /*nonbmp*/); -} -#endif - -/* - * toString(), valueOf() - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_to_string(duk_hthread *thr) { - duk_tval *tv; - - duk_push_this(thr); - tv = duk_require_tval(thr, -1); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_IS_STRING(tv)) { - /* return as is */ - } else if (DUK_TVAL_IS_OBJECT(tv)) { - duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - - /* Must be a "string object", i.e. class "String" */ - if (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_STRING) { - goto type_error; - } - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE); - DUK_ASSERT(duk_is_string(thr, -1)); - } else { - goto type_error; - } - - (void) duk_require_hstring_notsymbol(thr, -1); /* Reject symbols (and wrapped symbols). */ - return 1; - - type_error: - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} - -/* - * Character and charcode access - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_at(duk_hthread *thr) { - duk_int_t pos; - - /* XXX: faster implementation */ - - (void) duk_push_this_coercible_to_string(thr); - pos = duk_to_int(thr, 0); - duk_substring(thr, -1, (duk_size_t) pos, (duk_size_t) (pos + 1)); - return 1; -} - -/* Magic: 0=charCodeAt, 1=codePointAt */ -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_code_at(duk_hthread *thr) { - duk_int_t pos; - duk_hstring *h; - duk_bool_t clamped; - duk_uint32_t cp; - duk_int_t magic; - - /* XXX: faster implementation */ - - DUK_DDD(DUK_DDDPRINT("arg=%!T", (duk_tval *) duk_get_tval(thr, 0))); - - h = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h != NULL); - - pos = duk_to_int_clamped_raw(thr, - 0 /*index*/, - 0 /*min(incl)*/, - (duk_int_t) DUK_HSTRING_GET_CHARLEN(h) - 1 /*max(incl)*/, - &clamped /*out_clamped*/); -#if defined(DUK_USE_ES6) - magic = duk_get_current_magic(thr); -#else - DUK_ASSERT(duk_get_current_magic(thr) == 0); - magic = 0; -#endif - if (clamped) { - /* For out-of-bounds indices .charCodeAt() returns NaN and - * .codePointAt() returns undefined. - */ - if (magic != 0) { - return 0; - } - duk_push_nan(thr); - } else { - DUK_ASSERT(pos >= 0); - cp = (duk_uint32_t) duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) pos, (duk_bool_t) magic /*surrogate_aware*/); - duk_push_u32(thr, cp); - } - return 1; -} - -/* - * substring(), substr(), slice() - */ - -/* XXX: any chance of merging these three similar but still slightly - * different algorithms so that footprint would be reduced? - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substring(duk_hthread *thr) { - duk_hstring *h; - duk_int_t start_pos, end_pos; - duk_int_t len; - - h = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h != NULL); - len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); - - /* [ start end str ] */ - - start_pos = duk_to_int_clamped(thr, 0, 0, len); - if (duk_is_undefined(thr, 1)) { - end_pos = len; - } else { - end_pos = duk_to_int_clamped(thr, 1, 0, len); - } - DUK_ASSERT(start_pos >= 0 && start_pos <= len); - DUK_ASSERT(end_pos >= 0 && end_pos <= len); - - if (start_pos > end_pos) { - duk_int_t tmp = start_pos; - start_pos = end_pos; - end_pos = tmp; - } - - DUK_ASSERT(end_pos >= start_pos); - - duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); - return 1; -} - -#if defined(DUK_USE_SECTION_B) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_substr(duk_hthread *thr) { - duk_hstring *h; - duk_int_t start_pos, end_pos; - duk_int_t len; - - /* Unlike non-obsolete String calls, substr() algorithm in E5.1 - * specification will happily coerce undefined and null to strings - * ("undefined" and "null"). - */ - duk_push_this(thr); - h = duk_to_hstring_m1(thr); /* Reject Symbols. */ - DUK_ASSERT(h != NULL); - len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); - - /* [ start length str ] */ - - /* The implementation for computing of start_pos and end_pos differs - * from the standard algorithm, but is intended to result in the exactly - * same behavior. This is not always obvious. - */ - - /* combines steps 2 and 5; -len ensures max() not needed for step 5 */ - start_pos = duk_to_int_clamped(thr, 0, -len, len); - if (start_pos < 0) { - start_pos = len + start_pos; - } - DUK_ASSERT(start_pos >= 0 && start_pos <= len); - - /* combines steps 3, 6; step 7 is not needed */ - if (duk_is_undefined(thr, 1)) { - end_pos = len; - } else { - DUK_ASSERT(start_pos <= len); - end_pos = start_pos + duk_to_int_clamped(thr, 1, 0, len - start_pos); - } - DUK_ASSERT(start_pos >= 0 && start_pos <= len); - DUK_ASSERT(end_pos >= 0 && end_pos <= len); - DUK_ASSERT(end_pos >= start_pos); - - duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); - return 1; -} -#endif /* DUK_USE_SECTION_B */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_slice(duk_hthread *thr) { - duk_hstring *h; - duk_int_t start_pos, end_pos; - duk_int_t len; - - h = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h != NULL); - len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); - - /* [ start end str ] */ - - start_pos = duk_to_int_clamped(thr, 0, -len, len); - if (start_pos < 0) { - start_pos = len + start_pos; - } - if (duk_is_undefined(thr, 1)) { - end_pos = len; - } else { - end_pos = duk_to_int_clamped(thr, 1, -len, len); - if (end_pos < 0) { - end_pos = len + end_pos; - } - } - DUK_ASSERT(start_pos >= 0 && start_pos <= len); - DUK_ASSERT(end_pos >= 0 && end_pos <= len); - - if (end_pos < start_pos) { - end_pos = start_pos; - } - - DUK_ASSERT(end_pos >= start_pos); - - duk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos); - return 1; -} - -/* - * Case conversion - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_hthread *thr) { - duk_small_int_t uppercase = duk_get_current_magic(thr); - - (void) duk_push_this_coercible_to_string(thr); - duk_unicode_case_convert_string(thr, (duk_bool_t) uppercase); - return 1; -} - -/* - * indexOf() and lastIndexOf() - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_hthread *thr) { - duk_hstring *h_this; - duk_hstring *h_search; - duk_int_t clen_this; - duk_int_t cpos; - duk_small_uint_t is_lastindexof = (duk_small_uint_t) duk_get_current_magic(thr); /* 0=indexOf, 1=lastIndexOf */ - - h_this = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h_this != NULL); - clen_this = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h_this); - - h_search = duk_to_hstring(thr, 0); - DUK_ASSERT(h_search != NULL); - - duk_to_number(thr, 1); - if (duk_is_nan(thr, 1) && is_lastindexof) { - /* indexOf: NaN should cause pos to be zero. - * lastIndexOf: NaN should cause pos to be +Infinity - * (and later be clamped to len). - */ - cpos = clen_this; - } else { - cpos = duk_to_int_clamped(thr, 1, 0, clen_this); - } - - cpos = duk__str_search_shared(thr, h_this, h_search, cpos, is_lastindexof /*backwards*/); - duk_push_int(thr, cpos); - return 1; -} - -/* - * replace() - */ - -/* XXX: the current implementation works but is quite clunky; it compiles - * to almost 1,4kB of x86 code so it needs to be simplified (better approach, - * shared helpers, etc). Some ideas for refactoring: - * - * - a primitive to convert a string into a regexp matcher (reduces matching - * code at the cost of making matching much slower) - * - use replace() as a basic helper for match() and split(), which are both - * much simpler - * - API call to get_prop and to_boolean - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_replace(duk_hthread *thr) { - duk_hstring *h_input; - duk_hstring *h_match; - duk_hstring *h_search; - duk_hobject *h_re; - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_bool_t is_regexp; - duk_bool_t is_global; -#endif - duk_bool_t is_repl_func; - duk_uint32_t match_start_coff, match_start_boff; -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_int_t match_caps; -#endif - duk_uint32_t prev_match_end_boff; - const duk_uint8_t *r_start, *r_end, *r; /* repl string scan */ - duk_size_t tmp_sz; - - DUK_ASSERT_TOP(thr, 2); - h_input = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h_input != NULL); - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* input size is good output starting point */ - - DUK_ASSERT_TOP(thr, 4); - - /* stack[0] = search value - * stack[1] = replace value - * stack[2] = input string - * stack[3] = result buffer - */ - - h_re = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP); - if (h_re) { -#if defined(DUK_USE_REGEXP_SUPPORT) - is_regexp = 1; - is_global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL); - - if (is_global) { - /* start match from beginning */ - duk_push_int(thr, 0); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - } -#else /* DUK_USE_REGEXP_SUPPORT */ - DUK_DCERROR_UNSUPPORTED(thr); -#endif /* DUK_USE_REGEXP_SUPPORT */ - } else { - duk_to_string(thr, 0); /* rejects symbols */ -#if defined(DUK_USE_REGEXP_SUPPORT) - is_regexp = 0; - is_global = 0; -#endif - } - - if (duk_is_function(thr, 1)) { - is_repl_func = 1; - r_start = NULL; - r_end = NULL; - } else { - duk_hstring *h_repl; - - is_repl_func = 0; - h_repl = duk_to_hstring(thr, 1); /* reject symbols */ - DUK_ASSERT(h_repl != NULL); - r_start = DUK_HSTRING_GET_DATA(h_repl); - r_end = r_start + DUK_HSTRING_GET_BYTELEN(h_repl); - } - - prev_match_end_boff = 0; - - for (;;) { - /* - * If matching with a regexp: - * - non-global RegExp: lastIndex not touched on a match, zeroed - * on a non-match - * - global RegExp: on match, lastIndex will be updated by regexp - * executor to point to next char after the matching part (so that - * characters in the matching part are not matched again) - * - * If matching with a string: - * - always non-global match, find first occurrence - * - * We need: - * - The character offset of start-of-match for the replacer function - * - The byte offsets for start-of-match and end-of-match to implement - * the replacement values $&, $`, and $', and to copy non-matching - * input string portions (including header and trailer) verbatim. - * - * NOTE: the E5.1 specification is a bit vague how the RegExp should - * behave in the replacement process; e.g. is matching done first for - * all matches (in the global RegExp case) before any replacer calls - * are made? See: test-bi-string-proto-replace.js for discussion. - */ - - DUK_ASSERT_TOP(thr, 4); - -#if defined(DUK_USE_REGEXP_SUPPORT) - if (is_regexp) { - duk_dup_0(thr); - duk_dup_2(thr); - duk_regexp_match(thr); /* [ ... regexp input ] -> [ res_obj ] */ - if (!duk_is_object(thr, -1)) { - duk_pop(thr); - break; - } - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); - DUK_ASSERT(duk_is_number(thr, -1)); - match_start_coff = duk_get_uint(thr, -1); - duk_pop(thr); - - duk_get_prop_index(thr, -1, 0); - DUK_ASSERT(duk_is_string(thr, -1)); - h_match = duk_known_hstring(thr, -1); - duk_pop(thr); /* h_match is borrowed, remains reachable through match_obj */ - - if (DUK_HSTRING_GET_BYTELEN(h_match) == 0) { - /* This should be equivalent to match() algorithm step 8.f.iii.2: - * detect an empty match and allow it, but don't allow it twice. - */ - duk_uint32_t last_index; - - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - last_index = (duk_uint32_t) duk_get_uint(thr, -1); - DUK_DDD(DUK_DDDPRINT("empty match, bump lastIndex: %ld -> %ld", - (long) last_index, (long) (last_index + 1))); - duk_pop(thr); - duk_push_uint(thr, (duk_uint_t) (last_index + 1)); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - } - - DUK_ASSERT(duk_get_length(thr, -1) <= DUK_INT_MAX); /* string limits */ - match_caps = (duk_int_t) duk_get_length(thr, -1); - } else { -#else /* DUK_USE_REGEXP_SUPPORT */ - { /* unconditionally */ -#endif /* DUK_USE_REGEXP_SUPPORT */ - const duk_uint8_t *p_start, *p_end, *p; /* input string scan */ - const duk_uint8_t *q_start; /* match string */ - duk_size_t q_blen; - -#if defined(DUK_USE_REGEXP_SUPPORT) - DUK_ASSERT(!is_global); /* single match always */ -#endif - - p_start = DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start; - - h_search = duk_known_hstring(thr, 0); - q_start = DUK_HSTRING_GET_DATA(h_search); - q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_search); - - p_end -= q_blen; /* ensure full memcmp() fits in while */ - - match_start_coff = 0; - - while (p <= p_end) { - DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input)); - if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { - duk_dup_0(thr); - h_match = duk_known_hstring(thr, -1); -#if defined(DUK_USE_REGEXP_SUPPORT) - match_caps = 0; -#endif - goto found; - } - - /* track utf-8 non-continuation bytes */ - if ((p[0] & 0xc0) != 0x80) { - match_start_coff++; - } - p++; - } - - /* not found */ - break; - } - found: - - /* stack[0] = search value - * stack[1] = replace value - * stack[2] = input string - * stack[3] = result buffer - * stack[4] = regexp match OR match string - */ - - match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff); - - tmp_sz = (duk_size_t) (match_start_boff - prev_match_end_boff); - DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz); - - prev_match_end_boff = match_start_boff + DUK_HSTRING_GET_BYTELEN(h_match); - - if (is_repl_func) { - duk_idx_t idx_args; - duk_hstring *h_repl; - - /* regexp res_obj is at index 4 */ - - duk_dup_1(thr); - idx_args = duk_get_top(thr); - -#if defined(DUK_USE_REGEXP_SUPPORT) - if (is_regexp) { - duk_int_t idx; - duk_require_stack(thr, match_caps + 2); - for (idx = 0; idx < match_caps; idx++) { - /* match followed by capture(s) */ - duk_get_prop_index(thr, 4, (duk_uarridx_t) idx); - } - } else { -#else /* DUK_USE_REGEXP_SUPPORT */ - { /* unconditionally */ -#endif /* DUK_USE_REGEXP_SUPPORT */ - /* match == search string, by definition */ - duk_dup_0(thr); - } - duk_push_uint(thr, (duk_uint_t) match_start_coff); - duk_dup_2(thr); - - /* [ ... replacer match [captures] match_char_offset input ] */ - - duk_call(thr, duk_get_top(thr) - idx_args); - h_repl = duk_to_hstring_m1(thr); /* -> [ ... repl_value ] */ - DUK_ASSERT(h_repl != NULL); - - DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_repl); - - duk_pop(thr); /* repl_value */ - } else { - r = r_start; - - while (r < r_end) { - duk_int_t ch1; - duk_int_t ch2; -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_int_t ch3; -#endif - duk_size_t left; - - ch1 = *r++; - if (ch1 != DUK_ASC_DOLLAR) { - goto repl_write; - } - DUK_ASSERT(r <= r_end); - left = (duk_size_t) (r_end - r); - - if (left <= 0) { - goto repl_write; - } - - ch2 = r[0]; - switch (ch2) { - case DUK_ASC_DOLLAR: { - ch1 = (1 << 8) + DUK_ASC_DOLLAR; - goto repl_write; - } - case DUK_ASC_AMP: { - DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_match); - r++; - continue; - } - case DUK_ASC_GRAVE: { - tmp_sz = (duk_size_t) match_start_boff; - DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input), tmp_sz); - r++; - continue; - } - case DUK_ASC_SINGLEQUOTE: { - duk_uint32_t match_end_boff; - - /* Use match charlen instead of bytelen, just in case the input and - * match codepoint encodings would have different lengths. - */ - /* XXX: charlen computed here, and also in char2byte helper. */ - match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, - h_input, - match_start_coff + (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_match)); - - tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - match_end_boff); - DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + match_end_boff, tmp_sz); - r++; - continue; - } - default: { -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_int_t capnum, captmp, capadv; - /* XXX: optional check, match_caps is zero if no regexp, - * so dollar will be interpreted literally anyway. - */ - - if (!is_regexp) { - goto repl_write; - } - - if (!(ch2 >= DUK_ASC_0 && ch2 <= DUK_ASC_9)) { - goto repl_write; - } - capnum = ch2 - DUK_ASC_0; - capadv = 1; - - if (left >= 2) { - ch3 = r[1]; - if (ch3 >= DUK_ASC_0 && ch3 <= DUK_ASC_9) { - captmp = capnum * 10 + (ch3 - DUK_ASC_0); - if (captmp < match_caps) { - capnum = captmp; - capadv = 2; - } - } - } - - if (capnum > 0 && capnum < match_caps) { - DUK_ASSERT(is_regexp != 0); /* match_caps == 0 without regexps */ - - /* regexp res_obj is at offset 4 */ - duk_get_prop_index(thr, 4, (duk_uarridx_t) capnum); - if (duk_is_string(thr, -1)) { - duk_hstring *h_tmp_str; - - h_tmp_str = duk_known_hstring(thr, -1); - - DUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_tmp_str); - } else { - /* undefined -> skip (replaced with empty) */ - } - duk_pop(thr); - r += capadv; - continue; - } else { - goto repl_write; - } -#else /* DUK_USE_REGEXP_SUPPORT */ - goto repl_write; /* unconditionally */ -#endif /* DUK_USE_REGEXP_SUPPORT */ - } /* default case */ - } /* switch (ch2) */ - - repl_write: - /* ch1 = (r_increment << 8) + byte */ - - DUK_BW_WRITE_ENSURE_U8(thr, bw, (duk_uint8_t) (ch1 & 0xff)); - r += ch1 >> 8; - } /* while repl */ - } /* if (is_repl_func) */ - - duk_pop(thr); /* pop regexp res_obj or match string */ - -#if defined(DUK_USE_REGEXP_SUPPORT) - if (!is_global) { -#else - { /* unconditionally; is_global==0 */ -#endif - break; - } - } - - /* trailer */ - tmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff); - DUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz); - - DUK_ASSERT_TOP(thr, 4); - DUK_BW_COMPACT(thr, bw); - (void) duk_buffer_to_string(thr, -1); /* Safe if inputs are safe. */ - return 1; -} - -/* - * split() - */ - -/* XXX: very messy now, but works; clean up, remove unused variables (nomimally - * used so compiler doesn't complain). - */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_split(duk_hthread *thr) { - duk_hstring *h_input; - duk_hstring *h_sep; - duk_uint32_t limit; - duk_uint32_t arr_idx; -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_bool_t is_regexp; -#endif - duk_bool_t matched; /* set to 1 if any match exists (needed for empty input special case) */ - duk_uint32_t prev_match_end_coff, prev_match_end_boff; - duk_uint32_t match_start_boff, match_start_coff; - duk_uint32_t match_end_boff, match_end_coff; - - h_input = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h_input != NULL); - - duk_push_array(thr); - - if (duk_is_undefined(thr, 1)) { - limit = 0xffffffffUL; - } else { - limit = duk_to_uint32(thr, 1); - } - - if (limit == 0) { - return 1; - } - - /* If the separator is a RegExp, make a "clone" of it. The specification - * algorithm calls [[Match]] directly for specific indices; we emulate this - * by tweaking lastIndex and using a "force global" variant of duk_regexp_match() - * which will use global-style matching even when the RegExp itself is non-global. - */ - - if (duk_is_undefined(thr, 0)) { - /* The spec algorithm first does "R = ToString(separator)" before checking - * whether separator is undefined. Since this is side effect free, we can - * skip the ToString() here. - */ - duk_dup_2(thr); - duk_put_prop_index(thr, 3, 0); - return 1; - } else if (duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP) != NULL) { -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR); - duk_dup_0(thr); - duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */ - duk_replace(thr, 0); - /* lastIndex is initialized to zero by new RegExp() */ - is_regexp = 1; -#else - DUK_DCERROR_UNSUPPORTED(thr); -#endif - } else { - duk_to_string(thr, 0); -#if defined(DUK_USE_REGEXP_SUPPORT) - is_regexp = 0; -#endif - } - - /* stack[0] = separator (string or regexp) - * stack[1] = limit - * stack[2] = input string - * stack[3] = result array - */ - - prev_match_end_boff = 0; - prev_match_end_coff = 0; - arr_idx = 0; - matched = 0; - - for (;;) { - /* - * The specification uses RegExp [[Match]] to attempt match at specific - * offsets. We don't have such a primitive, so we use an actual RegExp - * and tweak lastIndex. Since the RegExp may be non-global, we use a - * special variant which forces global-like behavior for matching. - */ - - DUK_ASSERT_TOP(thr, 4); - -#if defined(DUK_USE_REGEXP_SUPPORT) - if (is_regexp) { - duk_dup_0(thr); - duk_dup_2(thr); - duk_regexp_match_force_global(thr); /* [ ... regexp input ] -> [ res_obj ] */ - if (!duk_is_object(thr, -1)) { - duk_pop(thr); - break; - } - matched = 1; - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); - DUK_ASSERT(duk_is_number(thr, -1)); - match_start_coff = duk_get_uint(thr, -1); - match_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff); - duk_pop(thr); - - if (match_start_coff == DUK_HSTRING_GET_CHARLEN(h_input)) { - /* don't allow an empty match at the end of the string */ - duk_pop(thr); - break; - } - - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - DUK_ASSERT(duk_is_number(thr, -1)); - match_end_coff = duk_get_uint(thr, -1); - match_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_end_coff); - duk_pop(thr); - - /* empty match -> bump and continue */ - if (prev_match_end_boff == match_end_boff) { - duk_push_uint(thr, (duk_uint_t) (match_end_coff + 1)); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - duk_pop(thr); - continue; - } - } else { -#else /* DUK_USE_REGEXP_SUPPORT */ - { /* unconditionally */ -#endif /* DUK_USE_REGEXP_SUPPORT */ - const duk_uint8_t *p_start, *p_end, *p; /* input string scan */ - const duk_uint8_t *q_start; /* match string */ - duk_size_t q_blen, q_clen; - - p_start = DUK_HSTRING_GET_DATA(h_input); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); - p = p_start + prev_match_end_boff; - - h_sep = duk_known_hstring(thr, 0); /* symbol already rejected above */ - q_start = DUK_HSTRING_GET_DATA(h_sep); - q_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sep); - q_clen = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_sep); - - p_end -= q_blen; /* ensure full memcmp() fits in while */ - - match_start_coff = prev_match_end_coff; - - if (q_blen == 0) { - /* Handle empty separator case: it will always match, and always - * triggers the check in step 13.c.iii initially. Note that we - * must skip to either end of string or start of first codepoint, - * skipping over any continuation bytes! - * - * Don't allow an empty string to match at the end of the input. - */ - - matched = 1; /* empty separator can always match */ - - match_start_coff++; - p++; - while (p < p_end) { - if ((p[0] & 0xc0) != 0x80) { - goto found; - } - p++; - } - goto not_found; - } - - DUK_ASSERT(q_blen > 0 && q_clen > 0); - while (p <= p_end) { - DUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input)); - DUK_ASSERT(q_blen > 0); /* no issues with empty memcmp() */ - if (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) { - /* never an empty match, so step 13.c.iii can't be triggered */ - goto found; - } - - /* track utf-8 non-continuation bytes */ - if ((p[0] & 0xc0) != 0x80) { - match_start_coff++; - } - p++; - } - - not_found: - /* not found */ - break; - - found: - matched = 1; - match_start_boff = (duk_uint32_t) (p - p_start); - match_end_coff = (duk_uint32_t) (match_start_coff + q_clen); /* constrained by string length */ - match_end_boff = (duk_uint32_t) (match_start_boff + q_blen); /* ditto */ - - /* empty match (may happen with empty separator) -> bump and continue */ - if (prev_match_end_boff == match_end_boff) { - prev_match_end_boff++; - prev_match_end_coff++; - continue; - } - } /* if (is_regexp) */ - - /* stack[0] = separator (string or regexp) - * stack[1] = limit - * stack[2] = input string - * stack[3] = result array - * stack[4] = regexp res_obj (if is_regexp) - */ - - DUK_DDD(DUK_DDDPRINT("split; match_start b=%ld,c=%ld, match_end b=%ld,c=%ld, prev_end b=%ld,c=%ld", - (long) match_start_boff, (long) match_start_coff, - (long) match_end_boff, (long) match_end_coff, - (long) prev_match_end_boff, (long) prev_match_end_coff)); - - duk_push_lstring(thr, - (const char *) (DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff), - (duk_size_t) (match_start_boff - prev_match_end_boff)); - duk_put_prop_index(thr, 3, arr_idx); - arr_idx++; - if (arr_idx >= limit) { - goto hit_limit; - } - -#if defined(DUK_USE_REGEXP_SUPPORT) - if (is_regexp) { - duk_size_t i, len; - - len = duk_get_length(thr, 4); - for (i = 1; i < len; i++) { - DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* cannot have >4G captures */ - duk_get_prop_index(thr, 4, (duk_uarridx_t) i); - duk_put_prop_index(thr, 3, arr_idx); - arr_idx++; - if (arr_idx >= limit) { - goto hit_limit; - } - } - - duk_pop(thr); - /* lastIndex already set up for next match */ - } else { -#else /* DUK_USE_REGEXP_SUPPORT */ - { /* unconditionally */ -#endif /* DUK_USE_REGEXP_SUPPORT */ - /* no action */ - } - - prev_match_end_boff = match_end_boff; - prev_match_end_coff = match_end_coff; - continue; - } /* for */ - - /* Combined step 11 (empty string special case) and 14-15. */ - - DUK_DDD(DUK_DDDPRINT("split trailer; prev_end b=%ld,c=%ld", - (long) prev_match_end_boff, (long) prev_match_end_coff)); - - if (DUK_HSTRING_GET_BYTELEN(h_input) > 0 || !matched) { - /* Add trailer if: - * a) non-empty input - * b) empty input and no (zero size) match found (step 11) - */ - - duk_push_lstring(thr, - (const char *) DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, - (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff)); - duk_put_prop_index(thr, 3, arr_idx); - /* No arr_idx update or limit check */ - } - - return 1; - - hit_limit: -#if defined(DUK_USE_REGEXP_SUPPORT) - if (is_regexp) { - duk_pop(thr); - } -#endif - - return 1; -} - -/* - * Various - */ - -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_LOCAL void duk__to_regexp_helper(duk_hthread *thr, duk_idx_t idx, duk_bool_t force_new) { - duk_hobject *h; - - /* Shared helper for match() steps 3-4, search() steps 3-4. */ - - DUK_ASSERT(idx >= 0); - - if (force_new) { - goto do_new; - } - - h = duk_get_hobject_with_class(thr, idx, DUK_HOBJECT_CLASS_REGEXP); - if (!h) { - goto do_new; - } - return; - - do_new: - duk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR); - duk_dup(thr, idx); - duk_new(thr, 1); /* [ ... RegExp val ] -> [ ... res ] */ - duk_replace(thr, idx); -} -#endif /* DUK_USE_REGEXP_SUPPORT */ - -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_search(duk_hthread *thr) { - /* Easiest way to implement the search required by the specification - * is to do a RegExp test() with lastIndex forced to zero. To avoid - * side effects on the argument, "clone" the RegExp if a RegExp was - * given as input. - * - * The global flag of the RegExp should be ignored; setting lastIndex - * to zero (which happens when "cloning" the RegExp) should have an - * equivalent effect. - */ - - DUK_ASSERT_TOP(thr, 1); - (void) duk_push_this_coercible_to_string(thr); /* at index 1 */ - duk__to_regexp_helper(thr, 0 /*index*/, 1 /*force_new*/); - - /* stack[0] = regexp - * stack[1] = string - */ - - /* Avoid using RegExp.prototype methods, as they're writable and - * configurable and may have been changed. - */ - - duk_dup_0(thr); - duk_dup_1(thr); /* [ ... re_obj input ] */ - duk_regexp_match(thr); /* -> [ ... res_obj ] */ - - if (!duk_is_object(thr, -1)) { - duk_push_int(thr, -1); - return 1; - } - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX); - DUK_ASSERT(duk_is_number(thr, -1)); - return 1; -} -#endif /* DUK_USE_REGEXP_SUPPORT */ - -#if defined(DUK_USE_REGEXP_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_match(duk_hthread *thr) { - duk_bool_t global; - duk_int_t prev_last_index; - duk_int_t this_index; - duk_int_t arr_idx; - - DUK_ASSERT_TOP(thr, 1); - (void) duk_push_this_coercible_to_string(thr); - duk__to_regexp_helper(thr, 0 /*index*/, 0 /*force_new*/); - global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL); - DUK_ASSERT_TOP(thr, 2); - - /* stack[0] = regexp - * stack[1] = string - */ - - if (!global) { - duk_regexp_match(thr); /* -> [ res_obj ] */ - return 1; /* return 'res_obj' */ - } - - /* Global case is more complex. */ - - /* [ regexp string ] */ - - duk_push_int(thr, 0); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - duk_push_array(thr); - - /* [ regexp string res_arr ] */ - - prev_last_index = 0; - arr_idx = 0; - - for (;;) { - DUK_ASSERT_TOP(thr, 3); - - duk_dup_0(thr); - duk_dup_1(thr); - duk_regexp_match(thr); /* -> [ ... regexp string ] -> [ ... res_obj ] */ - - if (!duk_is_object(thr, -1)) { - duk_pop(thr); - break; - } - - duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - DUK_ASSERT(duk_is_number(thr, -1)); - this_index = duk_get_int(thr, -1); - duk_pop(thr); - - if (this_index == prev_last_index) { - this_index++; - duk_push_int(thr, this_index); - duk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX); - } - prev_last_index = this_index; - - duk_get_prop_index(thr, -1, 0); /* match string */ - duk_put_prop_index(thr, 2, (duk_uarridx_t) arr_idx); - arr_idx++; - duk_pop(thr); /* res_obj */ - } - - if (arr_idx == 0) { - duk_push_null(thr); - } - - return 1; /* return 'res_arr' or 'null' */ -} -#endif /* DUK_USE_REGEXP_SUPPORT */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_concat(duk_hthread *thr) { - /* duk_concat() coerces arguments with ToString() in correct order */ - (void) duk_push_this_coercible_to_string(thr); - duk_insert(thr, 0); /* this is relatively expensive */ - duk_concat(thr, duk_get_top(thr)); - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_trim(duk_hthread *thr) { - DUK_ASSERT_TOP(thr, 0); - (void) duk_push_this_coercible_to_string(thr); - duk_trim(thr, 0); - DUK_ASSERT_TOP(thr, 1); - return 1; -} - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_repeat(duk_hthread *thr) { - duk_hstring *h_input; - duk_size_t input_blen; - duk_size_t result_len; - duk_int_t count_signed; - duk_uint_t count; - const duk_uint8_t *src; - duk_uint8_t *buf; - duk_uint8_t *p; - duk_double_t d; -#if !defined(DUK_USE_PREFER_SIZE) - duk_size_t copy_size; - duk_uint8_t *p_end; -#endif - - DUK_ASSERT_TOP(thr, 1); - h_input = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h_input != NULL); - input_blen = DUK_HSTRING_GET_BYTELEN(h_input); - - /* Count is ToNumber() coerced; +Infinity must be always rejected - * (even if input string is zero length), as well as negative values - * and -Infinity. -Infinity doesn't require an explicit check - * because duk_get_int() clamps it to DUK_INT_MIN which gets rejected - * as a negative value (regardless of input string length). - */ - d = duk_to_number(thr, 0); - if (duk_double_is_posinf(d)) { - goto fail_range; - } - count_signed = duk_get_int(thr, 0); - if (count_signed < 0) { - goto fail_range; - } - count = (duk_uint_t) count_signed; - - /* Overflow check for result length. */ - result_len = count * input_blen; - if (count != 0 && result_len / count != input_blen) { - goto fail_range; - } - - /* Temporary fixed buffer, later converted to string. */ - buf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, result_len); - src = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - -#if defined(DUK_USE_PREFER_SIZE) - p = buf; - while (count-- > 0) { - DUK_MEMCPY((void *) p, (const void *) src, input_blen); /* copy size may be zero */ - p += input_blen; - } -#else /* DUK_USE_PREFER_SIZE */ - /* Take advantage of already copied pieces to speed up the process - * especially for small repeated strings. - */ - p = buf; - p_end = p + result_len; - copy_size = input_blen; - for (;;) { - duk_size_t remain = (duk_size_t) (p_end - p); - DUK_DDD(DUK_DDDPRINT("remain=%ld, copy_size=%ld, input_blen=%ld, result_len=%ld", - (long) remain, (long) copy_size, (long) input_blen, - (long) result_len)); - if (remain <= copy_size) { - /* If result_len is zero, this case is taken and does - * a zero size copy. - */ - DUK_MEMCPY((void *) p, (const void *) src, remain); - break; - } else { - DUK_MEMCPY((void *) p, (const void *) src, copy_size); - p += copy_size; - } - - src = (const duk_uint8_t *) buf; /* Use buf as source for larger copies. */ - copy_size = (duk_size_t) (p - buf); - } -#endif /* DUK_USE_PREFER_SIZE */ - - /* XXX: It would be useful to be able to create a duk_hstring with - * a certain byte size whose data area wasn't initialized and which - * wasn't in the string table yet. This would allow a string to be - * constructed directly without a buffer temporary and when it was - * finished, it could be injected into the string table. Currently - * this isn't possible because duk_hstrings are only tracked by the - * intern table (they are not in heap_allocated). - */ - - duk_buffer_to_string(thr, -1); /* Safe if input is safe. */ - return 1; - - fail_range: - DUK_DCERROR_RANGE_INVALID_ARGS(thr); -} -#endif /* DUK_USE_ES6 */ - -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_locale_compare(duk_hthread *thr) { - duk_hstring *h1; - duk_hstring *h2; - duk_size_t h1_len, h2_len, prefix_len; - duk_small_int_t ret = 0; - duk_small_int_t rc; - - /* The current implementation of localeCompare() is simply a codepoint - * by codepoint comparison, implemented with a simple string compare - * because UTF-8 should preserve codepoint ordering (assuming valid - * shortest UTF-8 encoding). - * - * The specification requires that the return value must be related - * to the sort order: e.g. negative means that 'this' comes before - * 'that' in sort order. We assume an ascending sort order. - */ - - /* XXX: could share code with duk_js_ops.c, duk_js_compare_helper */ - - h1 = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h1 != NULL); - - h2 = duk_to_hstring(thr, 0); - DUK_ASSERT(h2 != NULL); - - h1_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1); - h2_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2); - prefix_len = (h1_len <= h2_len ? h1_len : h2_len); - - /* Zero size compare not an issue with DUK_MEMCMP. */ - rc = (duk_small_int_t) DUK_MEMCMP((const void *) DUK_HSTRING_GET_DATA(h1), - (const void *) DUK_HSTRING_GET_DATA(h2), - (size_t) prefix_len); - - if (rc < 0) { - ret = -1; - goto done; - } else if (rc > 0) { - ret = 1; - goto done; - } - - /* prefix matches, lengths matter now */ - if (h1_len > h2_len) { - ret = 1; - goto done; - } else if (h1_len == h2_len) { - DUK_ASSERT(ret == 0); - goto done; - } - ret = -1; - goto done; - - done: - duk_push_int(thr, (duk_int_t) ret); - return 1; -} - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_hthread *thr) { - duk_int_t magic; - duk_hstring *h; - duk_hstring *h_search; - duk_size_t blen_search; - const duk_uint8_t *p_cmp_start; - duk_bool_t result; - - h = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h != NULL); - - h_search = duk__str_tostring_notregexp(thr, 0); - DUK_ASSERT(h_search != NULL); - - magic = duk_get_current_magic(thr); - - p_cmp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - blen_search = DUK_HSTRING_GET_BYTELEN(h_search); - - if (duk_is_undefined(thr, 1)) { - if (magic) { - p_cmp_start += DUK_HSTRING_GET_BYTELEN(h) - blen_search; - } else { - /* p_cmp_start already OK */ - } - } else { - duk_int_t len; - duk_int_t pos; - - DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= DUK_INT_MAX); - len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); - pos = duk_to_int_clamped(thr, 1, 0, len); - DUK_ASSERT(pos >= 0 && pos <= len); - - if (magic) { - p_cmp_start -= blen_search; /* Conceptually subtracted last, but do already here. */ - } - DUK_ASSERT(pos >= 0 && pos <= len); - - p_cmp_start += duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) pos); - } - - /* The main comparison can be done using a memcmp() rather than - * doing codepoint comparisons: for CESU-8 strings there is a - * canonical representation for every codepoint. But we do need - * to deal with the char/byte offset translation to find the - * comparison range. - */ - - result = 0; - if (p_cmp_start >= DUK_HSTRING_GET_DATA(h) && - (duk_size_t) (p_cmp_start - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h)) + blen_search <= DUK_HSTRING_GET_BYTELEN(h)) { - if (DUK_MEMCMP((const void *) p_cmp_start, - (const void *) DUK_HSTRING_GET_DATA(h_search), - (size_t) blen_search) == 0) { - result = 1; - } - } - - duk_push_boolean(thr, result); - return 1; -} -#endif /* DUK_USE_ES6 */ - -#if defined(DUK_USE_ES6) -DUK_INTERNAL duk_ret_t duk_bi_string_prototype_includes(duk_hthread *thr) { - duk_hstring *h; - duk_hstring *h_search; - duk_int_t len; - duk_int_t pos; - - h = duk_push_this_coercible_to_string(thr); - DUK_ASSERT(h != NULL); - - h_search = duk__str_tostring_notregexp(thr, 0); - DUK_ASSERT(h_search != NULL); - - len = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h); - pos = duk_to_int_clamped(thr, 1, 0, len); - DUK_ASSERT(pos >= 0 && pos <= len); - - pos = duk__str_search_shared(thr, h, h_search, pos, 0 /*backwards*/); - duk_push_boolean(thr, pos >= 0); - return 1; -} -#endif /* DUK_USE_ES6 */ -#endif /* DUK_USE_STRING_BUILTIN */ -#line 1 "duk_bi_symbol.c" -/* - * Symbol built-in - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_SYMBOL_BUILTIN) - -/* - * Constructor - */ - -DUK_INTERNAL duk_ret_t duk_bi_symbol_constructor_shared(duk_hthread *thr) { - const duk_uint8_t *desc; - duk_size_t len; - duk_uint8_t *buf; - duk_uint8_t *p; - duk_int_t magic; - - magic = duk_get_current_magic(thr); - if (duk_is_undefined(thr, 0) && (magic == 0)) { - /* Symbol() accepts undefined and empty string, but they are - * treated differently. - */ - desc = NULL; - len = 0; - } else { - /* Symbol.for() coerces undefined to 'undefined' */ - desc = (const duk_uint8_t *) duk_to_lstring(thr, 0, &len); - } - - /* Maximum symbol data length: - * +1 initial byte (0x80 or 0x81) - * +len description - * +1 0xff after description, before unique suffix - * +17 autogenerated unique suffix: 'ffffffff-ffffffff' is longest - * +1 0xff after unique suffix for symbols with undefined description - */ - buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, 1 + len + 1 + 17 + 1); - p = buf + 1; - DUK_ASSERT(desc != NULL || len == 0); /* may be NULL if len is 0 */ - DUK_MEMCPY((void *) p, (const void *) desc, len); - p += len; - if (magic == 0) { - /* Symbol(): create unique symbol. Use two 32-bit values - * to avoid dependency on 64-bit types and 64-bit integer - * formatting (at least for now). - */ - if (++thr->heap->sym_counter[0] == 0) { - thr->heap->sym_counter[1]++; - } - p += DUK_SPRINTF((char *) p, "\xFF" "%lx-%lx", - (unsigned long) thr->heap->sym_counter[1], - (unsigned long) thr->heap->sym_counter[0]); - if (desc == NULL) { - /* Special case for 'undefined' description, trailing - * 0xff distinguishes from empty string description, - * but needs minimal special case handling elsewhere. - */ - *p++ = 0xff; - } - buf[0] = 0x81; - } else { - /* Symbol.for(): create a global symbol */ - buf[0] = 0x80; - } - - duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf)); - DUK_DDD(DUK_DDDPRINT("created symbol: %!T", duk_get_tval(thr, -1))); - return 1; -} - -DUK_LOCAL duk_hstring *duk__auto_unbox_symbol(duk_hthread *thr, duk_tval *tv_arg) { - duk_tval *tv; - duk_tval tv_val; - duk_hobject *h_obj; - duk_hstring *h_str; - - DUK_ASSERT(tv_arg != NULL); - - /* XXX: add internal helper: duk_auto_unbox_tval(thr, tv, mask); */ - /* XXX: add internal helper: duk_auto_unbox(thr, tv, idx); */ - - tv = tv_arg; - if (DUK_TVAL_IS_OBJECT(tv)) { - h_obj = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h_obj != NULL); - if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_SYMBOL) { - if (!duk_hobject_get_internal_value(thr->heap, h_obj, &tv_val)) { - return NULL; - } - tv = &tv_val; - } else { - return NULL; - } - } - - if (!DUK_TVAL_IS_STRING(tv)) { - return NULL; - } - h_str = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h_str != NULL); - - /* Here symbol is more expected than not. */ - if (DUK_UNLIKELY(!DUK_HSTRING_HAS_SYMBOL(h_str))) { - return NULL; - } - - return h_str; -} - -DUK_INTERNAL duk_ret_t duk_bi_symbol_tostring_shared(duk_hthread *thr) { - duk_hstring *h_str; - - h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr)); - if (h_str == NULL) { - return DUK_RET_TYPE_ERROR; - } - - if (duk_get_current_magic(thr) == 0) { - /* .toString() */ - duk_push_symbol_descriptive_string(thr, h_str); - } else { - /* .valueOf() */ - duk_push_hstring(thr, h_str); - } - return 1; -} - -DUK_INTERNAL duk_ret_t duk_bi_symbol_key_for(duk_hthread *thr) { - duk_hstring *h; - const duk_uint8_t *p; - - /* Argument must be a symbol but not checked here. The initial byte - * check will catch non-symbol strings. - */ - h = duk_require_hstring(thr, 0); - DUK_ASSERT(h != NULL); - - p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - DUK_ASSERT(p != NULL); - - /* Even for zero length strings there's at least one NUL byte so - * we can safely check the initial byte. - */ - if (p[0] == 0x80) { - /* Global symbol, return its key (bytes just after the initial byte). */ - duk_push_lstring(thr, (const char *) (p + 1), (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h) - 1)); - return 1; - } else if (p[0] == 0x81 || p[0] == 0x82 || p[0] == 0xff) { - /* Local symbol or hidden symbol, return undefined. */ - return 0; - } - - /* Covers normal strings and unknown initial bytes. */ - return DUK_RET_TYPE_ERROR; -} - -DUK_INTERNAL duk_ret_t duk_bi_symbol_toprimitive(duk_hthread *thr) { - duk_hstring *h_str; - - h_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr)); - if (h_str == NULL) { - return DUK_RET_TYPE_ERROR; - } - duk_push_hstring(thr, h_str); - return 1; -} - -#endif /* DUK_USE_SYMBOL_BUILTIN */ -#line 1 "duk_bi_thread.c" -/* - * Thread builtins - */ - -/* #include duk_internal.h -> already included */ - -/* - * Constructor - */ - -#if defined(DUK_USE_COROUTINE_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_thread_constructor(duk_hthread *thr) { - duk_hthread *new_thr; - duk_hobject *func; - - /* Check that the argument is callable; this is not 100% because we - * don't allow native functions to be a thread's initial function. - * Resume will reject such functions in any case. - */ - /* XXX: need a duk_require_func_promote_lfunc() */ - func = duk_require_hobject_promote_lfunc(thr, 0); - DUK_ASSERT(func != NULL); - duk_require_callable(thr, 0); - - duk_push_thread(thr); - new_thr = (duk_hthread *) duk_known_hobject(thr, -1); - new_thr->state = DUK_HTHREAD_STATE_INACTIVE; - - /* push initial function call to new thread stack; this is - * picked up by resume(). - */ - duk_push_hobject(new_thr, func); - - return 1; /* return thread */ -} -#endif - -/* - * Resume a thread. - * - * The thread must be in resumable state, either (a) new thread which hasn't - * yet started, or (b) a thread which has previously yielded. This method - * must be called from an Ecmascript function. - * - * Args: - * - thread - * - value - * - isError (defaults to false) - * - * Note: yield and resume handling is currently asymmetric. - */ - -#if defined(DUK_USE_COROUTINE_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_thread_resume(duk_hthread *ctx) { - duk_hthread *thr = (duk_hthread *) ctx; - duk_hthread *thr_resume; - duk_hobject *caller_func; - duk_small_uint_t is_error; - - DUK_DDD(DUK_DDDPRINT("Duktape.Thread.resume(): thread=%!T, value=%!T, is_error=%!T", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1), - (duk_tval *) duk_get_tval(thr, 2))); - - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); - DUK_ASSERT(thr->heap->curr_thread == thr); - - thr_resume = duk_require_hthread(thr, 0); - is_error = (duk_small_uint_t) duk_to_boolean(thr, 2); - duk_set_top(thr, 2); - - /* [ thread value ] */ - - /* - * Thread state and calling context checks - */ - - if (thr->callstack_top < 2) { - DUK_DD(DUK_DDPRINT("resume state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.resume)")); - goto state_error; - } - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */ - DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */ - - caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent); - if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) { - DUK_DD(DUK_DDPRINT("resume state invalid: caller must be Ecmascript code")); - goto state_error; - } - - /* Note: there is no requirement that: 'thr->callstack_preventcount == 1' - * like for yield. - */ - - if (thr_resume->state != DUK_HTHREAD_STATE_INACTIVE && - thr_resume->state != DUK_HTHREAD_STATE_YIELDED) { - DUK_DD(DUK_DDPRINT("resume state invalid: target thread must be INACTIVE or YIELDED")); - goto state_error; - } - - DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE || - thr_resume->state == DUK_HTHREAD_STATE_YIELDED); - - /* Further state-dependent pre-checks */ - - if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) { - /* no pre-checks now, assume a previous yield() has left things in - * tip-top shape (longjmp handler will assert for these). - */ - } else { - duk_hobject *h_fun; - - DUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE); - - /* The initial function must be an Ecmascript function (but - * can be bound). We must make sure of that before we longjmp - * because an error in the RESUME handler call processing will - * not be handled very cleanly. - */ - if ((thr_resume->callstack_top != 0) || - (thr_resume->valstack_top - thr_resume->valstack != 1)) { - goto state_error; - } - - duk_push_tval(thr, DUK_GET_TVAL_NEGIDX(thr_resume, -1)); - duk_resolve_nonbound_function(thr); - h_fun = duk_require_hobject(thr, -1); /* reject lightfuncs on purpose */ - if (!DUK_HOBJECT_IS_CALLABLE(h_fun) || !DUK_HOBJECT_IS_COMPFUNC(h_fun)) { - goto state_error; - } - duk_pop(thr); - } - - /* - * The error object has been augmented with a traceback and other - * info from its creation point -- usually another thread. The - * error handler is called here right before throwing, but it also - * runs in the resumer's thread. It might be nice to get a traceback - * from the resumee but this is not the case now. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - if (is_error) { - DUK_ASSERT_TOP(thr, 2); /* value (error) is at stack top */ - duk_err_augment_error_throw(thr); /* in resumer's context */ - } -#endif - -#if defined(DUK_USE_DEBUG) - if (is_error) { - DUK_DDD(DUK_DDDPRINT("RESUME ERROR: thread=%!T, value=%!T", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1))); - } else if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) { - DUK_DDD(DUK_DDDPRINT("RESUME NORMAL: thread=%!T, value=%!T", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1))); - } else { - DUK_DDD(DUK_DDDPRINT("RESUME INITIAL: thread=%!T, value=%!T", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1))); - } -#endif - - thr->heap->lj.type = DUK_LJ_TYPE_RESUME; - - /* lj value2: thread */ - DUK_ASSERT(thr->valstack_bottom < thr->valstack_top); - DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value2, &thr->valstack_bottom[0]); /* side effects */ - - /* lj value1: value */ - DUK_ASSERT(thr->valstack_bottom + 1 < thr->valstack_top); - DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[1]); /* side effects */ - DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1); - - thr->heap->lj.iserror = is_error; - - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */ - duk_err_longjmp(thr); /* execution resumes in bytecode executor */ - DUK_UNREACHABLE(); - /* Never here, fall through to error (from compiler point of view). */ - - state_error: - DUK_DCERROR_TYPE_INVALID_STATE(thr); -} -#endif - -/* - * Yield the current thread. - * - * The thread must be in yieldable state: it must have a resumer, and there - * must not be any yield-preventing calls (native calls and constructor calls, - * currently) in the thread's call stack (otherwise a resume would not be - * possible later). This method must be called from an Ecmascript function. - * - * Args: - * - value - * - isError (defaults to false) - * - * Note: yield and resume handling is currently asymmetric. - */ - -#if defined(DUK_USE_COROUTINE_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_thread_yield(duk_hthread *thr) { - duk_hobject *caller_func; - duk_small_uint_t is_error; - - DUK_DDD(DUK_DDDPRINT("Duktape.Thread.yield(): value=%!T, is_error=%!T", - (duk_tval *) duk_get_tval(thr, 0), - (duk_tval *) duk_get_tval(thr, 1))); - - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); - DUK_ASSERT(thr->heap->curr_thread == thr); - - is_error = (duk_small_uint_t) duk_to_boolean(thr, 1); - duk_set_top(thr, 1); - - /* [ value ] */ - - /* - * Thread state and calling context checks - */ - - if (!thr->resumer) { - DUK_DD(DUK_DDPRINT("yield state invalid: current thread must have a resumer")); - goto state_error; - } - DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED); - - if (thr->callstack_top < 2) { - DUK_DD(DUK_DDPRINT("yield state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.yield)")); - goto state_error; - } - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); /* us */ - DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL); /* caller */ - - caller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent); - if (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) { - DUK_DD(DUK_DDPRINT("yield state invalid: caller must be Ecmascript code")); - goto state_error; - } - - DUK_ASSERT(thr->callstack_preventcount >= 1); /* should never be zero, because we (Duktape.Thread.yield) are on the stack */ - if (thr->callstack_preventcount != 1) { - /* Note: the only yield-preventing call is Duktape.Thread.yield(), hence check for 1, not 0 */ - DUK_DD(DUK_DDPRINT("yield state invalid: there must be no yield-preventing calls in current thread callstack (preventcount is %ld)", - (long) thr->callstack_preventcount)); - goto state_error; - } - - /* - * The error object has been augmented with a traceback and other - * info from its creation point -- usually the current thread. - * The error handler, however, is called right before throwing - * and runs in the yielder's thread. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - if (is_error) { - DUK_ASSERT_TOP(thr, 1); /* value (error) is at stack top */ - duk_err_augment_error_throw(thr); /* in yielder's context */ - } -#endif - -#if defined(DUK_USE_DEBUG) - if (is_error) { - DUK_DDD(DUK_DDDPRINT("YIELD ERROR: value=%!T", - (duk_tval *) duk_get_tval(thr, 0))); - } else { - DUK_DDD(DUK_DDDPRINT("YIELD NORMAL: value=%!T", - (duk_tval *) duk_get_tval(thr, 0))); - } -#endif - - /* - * Process yield - * - * After longjmp(), processing continues in bytecode executor longjmp - * handler, which will e.g. update thr->resumer to NULL. - */ - - thr->heap->lj.type = DUK_LJ_TYPE_YIELD; - - /* lj value1: value */ - DUK_ASSERT(thr->valstack_bottom < thr->valstack_top); - DUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[0]); /* side effects */ - DUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1); - - thr->heap->lj.iserror = is_error; - - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* call is from executor, so we know we have a jmpbuf */ - duk_err_longjmp(thr); /* execution resumes in bytecode executor */ - DUK_UNREACHABLE(); - /* Never here, fall through to error (from compiler point of view). */ - - state_error: - DUK_DCERROR_TYPE_INVALID_STATE(thr); -} -#endif - -#if defined(DUK_USE_COROUTINE_SUPPORT) -DUK_INTERNAL duk_ret_t duk_bi_thread_current(duk_hthread *thr) { - duk_push_current_thread(thr); - return 1; -} -#endif -#line 1 "duk_bi_thrower.c" -/* - * Type error thrower, E5 Section 13.2.3. - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL duk_ret_t duk_bi_type_error_thrower(duk_hthread *thr) { - DUK_DCERROR_TYPE_INVALID_ARGS(thr); -} -#line 1 "duk_debug_fixedbuffer.c" -/* - * Fixed buffer helper useful for debugging, requires no allocation - * which is critical for debugging. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_DEBUG) - -DUK_INTERNAL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length) { - duk_size_t avail; - duk_size_t copylen; - - avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset)); - if (length > avail) { - copylen = avail; - fb->truncated = 1; - } else { - copylen = length; - } - DUK_MEMCPY(fb->buffer + fb->offset, buffer, copylen); - fb->offset += copylen; -} - -DUK_INTERNAL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x) { - duk_fb_put_bytes(fb, (const duk_uint8_t *) &x, 1); -} - -DUK_INTERNAL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x) { - duk_fb_put_bytes(fb, (const duk_uint8_t *) x, (duk_size_t) DUK_STRLEN(x)); -} - -DUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) { - duk_size_t avail; - va_list ap; - - va_start(ap, fmt); - avail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset)); - if (avail > 0) { - duk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap); - if (res < 0) { - /* error */ - } else if ((duk_size_t) res >= avail) { - /* (maybe) truncated */ - fb->offset += avail; - if ((duk_size_t) res > avail) { - /* actual chars dropped (not just NUL term) */ - fb->truncated = 1; - } - } else { - /* normal */ - fb->offset += (duk_size_t) res; - } - } - va_end(ap); -} - -DUK_INTERNAL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size) { - char buf[64+1]; - duk_debug_format_funcptr(buf, sizeof(buf), fptr, fptr_size); - buf[sizeof(buf) - 1] = (char) 0; - duk_fb_put_cstring(fb, buf); -} - -DUK_INTERNAL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb) { - return (fb->offset >= fb->length); -} - -#endif /* DUK_USE_DEBUG */ -#line 1 "duk_debug_vsnprintf.c" -/* - * Custom formatter for debug printing, allowing Duktape specific data - * structures (such as tagged values and heap objects) to be printed with - * a nice format string. Because debug printing should not affect execution - * state, formatting here must be independent of execution (see implications - * below) and must not allocate memory. - * - * Custom format tags begin with a '%!' to safely distinguish them from - * standard format tags. The following conversions are supported: - * - * %!T tagged value (duk_tval *) - * %!O heap object (duk_heaphdr *) - * %!I decoded bytecode instruction - * %!C bytecode instruction opcode name (arg is long) - * - * Everything is serialized in a JSON-like manner. The default depth is one - * level, internal prototype is not followed, and internal properties are not - * serialized. The following modifiers change this behavior: - * - * @ print pointers - * # print binary representations (where applicable) - * d deep traversal of own properties (not prototype) - * p follow prototype chain (useless without 'd') - * i include internal properties (other than prototype) - * x hexdump buffers - * h heavy formatting - * - * For instance, the following serializes objects recursively, but does not - * follow the prototype chain nor print internal properties: "%!dO". - * - * Notes: - * - * * Standard snprintf return value semantics seem to vary. This - * implementation returns the number of bytes it actually wrote - * (excluding the null terminator). If retval == buffer size, - * output was truncated (except for corner cases). - * - * * Output format is intentionally different from Ecmascript - * formatting requirements, as formatting here serves debugging - * of internals. - * - * * Depth checking (and updating) is done in each type printer - * separately, to allow them to call each other freely. - * - * * Some pathological structures might take ages to print (e.g. - * self recursion with 100 properties pointing to the object - * itself). To guard against these, each printer also checks - * whether the output buffer is full; if so, early exit. - * - * * Reference loops are detected using a loop stack. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_DEBUG) - -/* #include stdio.h -> already included */ -/* #include stdarg.h -> already included */ -#include - -/* list of conversion specifiers that terminate a format tag; - * this is unfortunately guesswork. - */ -#define DUK__ALLOWED_STANDARD_SPECIFIERS "diouxXeEfFgGaAcsCSpnm" - -/* maximum length of standard format tag that we support */ -#define DUK__MAX_FORMAT_TAG_LENGTH 32 - -/* heapobj recursion depth when deep printing is selected */ -#define DUK__DEEP_DEPTH_LIMIT 8 - -/* maximum recursion depth for loop detection stacks */ -#define DUK__LOOP_STACK_DEPTH 256 - -/* must match bytecode defines now; build autogenerate? */ -DUK_LOCAL const char * const duk__bc_optab[256] = { - "LDREG", "STREG", "JUMP", "LDCONST", "LDINT", "LDINTX", "LDTHIS", "LDUNDEF", - "LDNULL", "LDTRUE", "LDFALSE", "GETVAR", "BNOT", "LNOT", "UNM", "UNP", - "EQ_RR", "EQ_CR", "EQ_RC", "EQ_CC", "NEQ_RR", "NEQ_CR", "NEQ_RC", "NEQ_CC", - "SEQ_RR", "SEQ_CR", "SEQ_RC", "SEQ_CC", "SNEQ_RR", "SNEQ_CR", "SNEQ_RC", "SNEQ_CC", - - "GT_RR", "GT_CR", "GT_RC", "GT_CC", "GE_RR", "GE_CR", "GE_RC", "GE_CC", - "LT_RR", "LT_CR", "LT_RC", "LT_CC", "LE_RR", "LE_CR", "LE_RC", "LE_CC", - "IFTRUE_R", "IFTRUE_C", "IFFALSE_R", "IFFALSE_C", "ADD_RR", "ADD_CR", "ADD_RC", "ADD_CC", - "SUB_RR", "SUB_CR", "SUB_RC", "SUB_CC", "MUL_RR", "MUL_CR", "MUL_RC", "MUL_CC", - - "DIV_RR", "DIV_CR", "DIV_RC", "DIV_CC", "MOD_RR", "MOD_CR", "MOD_RC", "MOD_CC", - "EXP_RR", "EXP_CR", "EXP_RC", "EXP_CC", "BAND_RR", "BAND_CR", "BAND_RC", "BAND_CC", - "BOR_RR", "BOR_CR", "BOR_RC", "BOR_CC", "BXOR_RR", "BXOR_CR", "BXOR_RC", "BXOR_CC", - "BASL_RR", "BASL_CR", "BASL_RC", "BASL_CC", "BLSR_RR", "BLSR_CR", "BLSR_RC", "BLSR_CC", - - "BASR_RR", "BASR_CR", "BASR_RC", "BASR_CC", "INSTOF_RR", "INSTOF_CR", "INSTOF_RC", "INSTOF_CC", - "IN_RR", "IN_CR", "IN_RC", "IN_CC", "GETPROP_RR", "GETPROP_CR", "GETPROP_RC", "GETPROP_CC", - "PUTPROP_RR", "PUTPROP_CR", "PUTPROP_RC", "PUTPROP_CC", "DELPROP_RR", "DELPROP_CR", "DELPROP_RC", "DELPROP_CC", - "PREINCR", "PREDECR", "POSTINCR", "POSTDECR", "PREINCV", "PREDECV", "POSTINCV", "POSTDECV", - - "PREINCP_RR", "PREINCP_CR", "PREINCP_RC", "PREINCP_CC", "PREDECP_RR", "PREDECP_CR", "PREDECP_RC", "PREDECP_CC", - "POSTINCP_RR", "POSTINCP_CR", "POSTINCP_RC", "POSTINCP_CC", "POSTDECP_RR", "POSTDECP_CR", "POSTDECP_RC", "POSTDECP_CC", - "DECLVAR_RR", "DECLVAR_CR", "DECLVAR_RC", "DECLVAR_CC", "REGEXP_RR", "REGEXP_RC", "REGEXP_CR", "REGEXP_CC", - "CLOSURE", "TYPEOF", "TYPEOFID", "PUTVAR", "DELVAR", "RETREG", "RETUNDEF", "RETCONST", - - "RETCONSTN", "LABEL", "ENDLABEL", "BREAK", "CONTINUE", "TRYCATCH", "ENDTRY", "ENDCATCH", - "ENDFIN", "THROW", "INVLHS", "CSREG", "CSVAR_RR", "CSVAR_CR", "CSVAR_RC", "CSVAR_CC", - "CALL0", "CALL1", "CALL2", "CALL3", "CALL4", "CALL5", "CALL6", "CALL7", - "CALL8", "CALL9", "CALL10", "CALL11", "CALL12", "CALL13", "CALL14", "CALL15", - - "NEWOBJ", "NEWARR", "MPUTOBJ", "MPUTOBJI", "INITSET", "INITGET", "MPUTARR", "MPUTARRI", - "SETALEN", "INITENUM", "NEXTENUM", "NEWTARGET", "DEBUGGER", "NOP", "INVALID", "UNUSED207", - "GETPROPC_RR", "GETPROPC_CR", "GETPROPC_RC", "GETPROPC_CC", "UNUSED212", "UNUSED213", "UNUSED214", "UNUSED215", - "UNUSED216", "UNUSED217", "UNUSED218", "UNUSED219", "UNUSED220", "UNUSED221", "UNUSED222", "UNUSED223", - - "UNUSED224", "UNUSED225", "UNUSED226", "UNUSED227", "UNUSED228", "UNUSED229", "UNUSED230", "UNUSED231", - "UNUSED232", "UNUSED233", "UNUSED234", "UNUSED235", "UNUSED236", "UNUSED237", "UNUSED238", "UNUSED239", - "UNUSED240", "UNUSED241", "UNUSED242", "UNUSED243", "UNUSED244", "UNUSED245", "UNUSED246", "UNUSED247", - "UNUSED248", "UNUSED249", "UNUSED250", "UNUSED251", "UNUSED252", "UNUSED253", "UNUSED254", "UNUSED255" -}; - -typedef struct duk__dprint_state duk__dprint_state; -struct duk__dprint_state { - duk_fixedbuffer *fb; - - /* loop_stack_index could be perhaps be replaced by 'depth', but it's nice - * to not couple these two mechanisms unnecessarily. - */ - duk_hobject *loop_stack[DUK__LOOP_STACK_DEPTH]; - duk_int_t loop_stack_index; - duk_int_t loop_stack_limit; - - duk_int_t depth; - duk_int_t depth_limit; - - duk_bool_t pointer; - duk_bool_t heavy; - duk_bool_t binary; - duk_bool_t follow_proto; - duk_bool_t internal; - duk_bool_t hexdump; -}; - -/* helpers */ -DUK_LOCAL_DECL void duk__print_hstring(duk__dprint_state *st, duk_hstring *k, duk_bool_t quotes); -DUK_LOCAL_DECL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h); -DUK_LOCAL_DECL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h); -DUK_LOCAL_DECL void duk__print_tval(duk__dprint_state *st, duk_tval *tv); -DUK_LOCAL_DECL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins); -DUK_LOCAL_DECL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h); -DUK_LOCAL_DECL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h); -DUK_LOCAL_DECL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h); - -DUK_LOCAL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h) { - duk_fixedbuffer *fb = st->fb; - - if (st->heavy) { - duk_fb_sprintf(fb, "(%p)", (void *) h); - } - - if (!h) { - return; - } - - if (st->binary) { - duk_size_t i; - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); - for (i = 0; i < (duk_size_t) sizeof(*h); i++) { - duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]); - } - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); - } - -#if defined(DUK_USE_REFERENCE_COUNTING) /* currently implicitly also DUK_USE_DOUBLE_LINKED_HEAP */ - if (st->heavy) { - duk_fb_sprintf(fb, "[h_next=%p,h_prev=%p,h_refcount=%lu,h_flags=%08lx,type=%ld," - "reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", - (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), - (void *) DUK_HEAPHDR_GET_PREV(NULL, h), - (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(h), - (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), - (long) DUK_HEAPHDR_GET_TYPE(h), - (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); - } -#else - if (st->heavy) { - duk_fb_sprintf(fb, "[h_next=%p,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", - (void *) DUK_HEAPHDR_GET_NEXT(NULL, h), - (unsigned long) DUK_HEAPHDR_GET_FLAGS(h), - (long) DUK_HEAPHDR_GET_TYPE(h), - (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0)); - } -#endif -} - -DUK_LOCAL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h) { - duk_fixedbuffer *fb = st->fb; - - if (st->heavy) { - duk_fb_sprintf(fb, "(%p)", (void *) h); - } - - if (!h) { - return; - } - - if (st->binary) { - duk_size_t i; - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); - for (i = 0; i < (duk_size_t) sizeof(*h); i++) { - duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)h)[i]); - } - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); - } - -#if defined(DUK_USE_REFERENCE_COUNTING) - if (st->heavy) { - duk_fb_sprintf(fb, "[h_refcount=%lu,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", - (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h), - (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h), - (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h), - (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0)); - } -#else - if (st->heavy) { - duk_fb_sprintf(fb, "[h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]", - (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h), - (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h), - (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0), - (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0)); - } -#endif -} - -DUK_LOCAL void duk__print_hstring(duk__dprint_state *st, duk_hstring *h, duk_bool_t quotes) { - duk_fixedbuffer *fb = st->fb; - const duk_uint8_t *p; - const duk_uint8_t *p_end; - - /* terminal type: no depth check */ - - if (duk_fb_is_full(fb)) { - return; - } - - duk__print_shared_heaphdr_string(st, &h->hdr); - - if (!h) { - duk_fb_put_cstring(fb, "NULL"); - return; - } - - p = DUK_HSTRING_GET_DATA(h); - p_end = p + DUK_HSTRING_GET_BYTELEN(h); - - if (p_end > p && p[0] == DUK_ASC_UNDERSCORE) { - /* If property key begins with underscore, encode it with - * forced quotes (e.g. "_Foo") to distinguish it from encoded - * internal properties (e.g. \x82Bar -> _Bar). - */ - quotes = 1; - } - - if (quotes) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE); - } - while (p < p_end) { - duk_uint8_t ch = *p++; - - /* two special escapes: '\' and '"', other printables as is */ - if (ch == '\\') { - duk_fb_sprintf(fb, "\\\\"); - } else if (ch == '"') { - duk_fb_sprintf(fb, "\\\""); - } else if (ch >= 0x20 && ch <= 0x7e) { - duk_fb_put_byte(fb, ch); - } else if (ch == 0x82 && !quotes) { - /* encode \x82Bar as _Bar if no quotes are - * applied, this is for readable internal keys. - */ - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_UNDERSCORE); - } else { - duk_fb_sprintf(fb, "\\x%02lx", (unsigned long) ch); - } - } - if (quotes) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE); - } -#if defined(DUK_USE_REFERENCE_COUNTING) - /* XXX: limit to quoted strings only, to save keys from being cluttered? */ - duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr)); -#endif -} - -#define DUK__COMMA() do { \ - if (first) { \ - first = 0; \ - } else { \ - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); \ - } \ - } while (0) - -DUK_LOCAL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h) { - duk_fixedbuffer *fb = st->fb; - duk_uint_fast32_t i; - duk_tval *tv; - duk_hstring *key; - duk_bool_t first = 1; - const char *brace1 = "{"; - const char *brace2 = "}"; - duk_bool_t pushed_loopstack = 0; - - if (duk_fb_is_full(fb)) { - return; - } - - duk__print_shared_heaphdr(st, &h->hdr); - - if (h && DUK_HOBJECT_HAS_ARRAY_PART(h)) { - brace1 = "["; - brace2 = "]"; - } - - if (!h) { - duk_fb_put_cstring(fb, "NULL"); - goto finished; - } - - if (st->depth >= st->depth_limit) { - const char *subtype = "generic"; - - if (DUK_HOBJECT_IS_COMPFUNC(h)) { - subtype = "compfunc"; - } else if (DUK_HOBJECT_IS_NATFUNC(h)) { - subtype = "natfunc"; - } else if (DUK_HOBJECT_IS_THREAD(h)) { - subtype = "thread"; - } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { - subtype = "bufobj"; - } else if (DUK_HOBJECT_IS_ARRAY(h)) { - subtype = "array"; - } - duk_fb_sprintf(fb, "%sobject/%s %p%s", (const char *) brace1, subtype, (void *) h, (const char *) brace2); - return; - } - - for (i = 0; i < (duk_uint_fast32_t) st->loop_stack_index; i++) { - if (st->loop_stack[i] == h) { - duk_fb_sprintf(fb, "%sLOOP:%p%s", (const char *) brace1, (void *) h, (const char *) brace2); - return; - } - } - - /* after this, return paths should 'goto finished' for decrement */ - st->depth++; - - if (st->loop_stack_index >= st->loop_stack_limit) { - duk_fb_sprintf(fb, "%sOUT-OF-LOOP-STACK%s", (const char *) brace1, (const char *) brace2); - goto finished; - } - st->loop_stack[st->loop_stack_index++] = h; - pushed_loopstack = 1; - - /* - * Notation: double underscore used for internal properties which are not - * stored in the property allocation (e.g. '__valstack'). - */ - - duk_fb_put_cstring(fb, brace1); - - if (DUK_HOBJECT_GET_PROPS(NULL, h)) { - duk_uint32_t a_limit; - - a_limit = DUK_HOBJECT_GET_ASIZE(h); - if (st->internal) { - /* dump all allocated entries, unused entries print as 'unused', - * note that these may extend beyond current 'length' and look - * a bit funny. - */ - } else { - /* leave out trailing 'unused' elements */ - while (a_limit > 0) { - tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, a_limit - 1); - if (!DUK_TVAL_IS_UNUSED(tv)) { - break; - } - a_limit--; - } - } - - for (i = 0; i < a_limit; i++) { - tv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, i); - DUK__COMMA(); - duk__print_tval(st, tv); - } - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(h); i++) { - key = DUK_HOBJECT_E_GET_KEY(NULL, h, i); - if (!key) { - continue; - } - if (!st->internal && DUK_HSTRING_HAS_HIDDEN(key)) { - continue; - } - DUK__COMMA(); - duk__print_hstring(st, key, 0); - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COLON); - if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(NULL, h, i)) { - duk_fb_sprintf(fb, "[get:%p,set:%p]", - (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.get, - (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.set); - } else { - tv = &DUK_HOBJECT_E_GET_VALUE(NULL, h, i).v; - duk__print_tval(st, tv); - } - if (st->heavy) { - duk_fb_sprintf(fb, "<%02lx>", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(NULL, h, i)); - } - } - } - if (st->internal) { - if (DUK_HOBJECT_IS_ARRAY(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__array:true"); - } - if (DUK_HOBJECT_HAS_EXTENSIBLE(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__extensible:true"); - } - if (DUK_HOBJECT_HAS_CONSTRUCTABLE(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__constructable:true"); - } - if (DUK_HOBJECT_HAS_BOUNDFUNC(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__boundfunc:true"); - } - if (DUK_HOBJECT_HAS_COMPFUNC(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__compfunc:true"); - } - if (DUK_HOBJECT_HAS_NATFUNC(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__natfunc:true"); - } - if (DUK_HOBJECT_HAS_BUFOBJ(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__bufobj:true"); - } - if (DUK_HOBJECT_IS_THREAD(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__thread:true"); - } - if (DUK_HOBJECT_HAS_ARRAY_PART(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__array_part:true"); - } - if (DUK_HOBJECT_HAS_STRICT(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__strict:true"); - } - if (DUK_HOBJECT_HAS_NOTAIL(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__notail:true"); - } - if (DUK_HOBJECT_HAS_NEWENV(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__newenv:true"); - } - if (DUK_HOBJECT_HAS_NAMEBINDING(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__namebinding:true"); - } - if (DUK_HOBJECT_HAS_CREATEARGS(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__createargs:true"); - } - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_array:true"); - } - if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_stringobj:true"); - } - if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_arguments:true"); - } - if (DUK_HOBJECT_IS_BUFOBJ(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_bufobj:true"); - } - if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)) { - DUK__COMMA(); duk_fb_sprintf(fb, "__exotic_proxyobj:true"); - } - } - - if (st->internal && DUK_HOBJECT_IS_ARRAY(h)) { - duk_harray *a = (duk_harray *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) a->length); - DUK__COMMA(); duk_fb_sprintf(fb, "__length_nonwritable:%ld", (long) a->length_nonwritable); - } else if (st->internal && DUK_HOBJECT_IS_COMPFUNC(h)) { - duk_hcompfunc *f = (duk_hcompfunc *) h; - DUK__COMMA(); duk_fb_put_cstring(fb, "__data:"); - duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f)); - DUK__COMMA(); duk_fb_put_cstring(fb, "__lexenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_LEXENV(NULL, f)); - DUK__COMMA(); duk_fb_put_cstring(fb, "__varenv:"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_VARENV(NULL, f)); - DUK__COMMA(); duk_fb_sprintf(fb, "__nregs:%ld", (long) f->nregs); - DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - DUK__COMMA(); duk_fb_sprintf(fb, "__start_line:%ld", (long) f->start_line); - DUK__COMMA(); duk_fb_sprintf(fb, "__end_line:%ld", (long) f->end_line); -#endif - DUK__COMMA(); duk_fb_put_cstring(fb, "__data:"); - duk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f)); - } else if (st->internal && DUK_HOBJECT_IS_NATFUNC(h)) { - duk_hnatfunc *f = (duk_hnatfunc *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__func:"); - duk_fb_put_funcptr(fb, (duk_uint8_t *) &f->func, sizeof(f->func)); - DUK__COMMA(); duk_fb_sprintf(fb, "__nargs:%ld", (long) f->nargs); - DUK__COMMA(); duk_fb_sprintf(fb, "__magic:%ld", (long) f->magic); - } else if (st->internal && DUK_HOBJECT_IS_DECENV(h)) { - duk_hdecenv *e = (duk_hdecenv *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__thread:"); duk__print_hobject(st, (duk_hobject *) e->thread); - DUK__COMMA(); duk_fb_sprintf(fb, "__varmap:"); duk__print_hobject(st, (duk_hobject *) e->varmap); - DUK__COMMA(); duk_fb_sprintf(fb, "__regbase_byteoff:%ld", (long) e->regbase_byteoff); - } else if (st->internal && DUK_HOBJECT_IS_OBJENV(h)) { - duk_hobjenv *e = (duk_hobjenv *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__target:"); duk__print_hobject(st, (duk_hobject *) e->target); - DUK__COMMA(); duk_fb_sprintf(fb, "__has_this:%ld", (long) e->has_this); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - } else if (st->internal && DUK_HOBJECT_IS_BUFOBJ(h)) { - duk_hbufobj *b = (duk_hbufobj *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__buf:"); - duk__print_hbuffer(st, (duk_hbuffer *) b->buf); - DUK__COMMA(); duk_fb_sprintf(fb, "__buf_prop:"); - duk__print_hobject(st, (duk_hobject *) b->buf_prop); - DUK__COMMA(); duk_fb_sprintf(fb, "__offset:%ld", (long) b->offset); - DUK__COMMA(); duk_fb_sprintf(fb, "__length:%ld", (long) b->length); - DUK__COMMA(); duk_fb_sprintf(fb, "__shift:%ld", (long) b->shift); - DUK__COMMA(); duk_fb_sprintf(fb, "__elemtype:%ld", (long) b->elem_type); -#endif - } else if (st->internal && DUK_HOBJECT_IS_PROXY(h)) { - duk_hproxy *p = (duk_hproxy *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__target:"); - duk__print_hobject(st, p->target); - DUK__COMMA(); duk_fb_sprintf(fb, "__handler:"); - duk__print_hobject(st, p->handler); - } else if (st->internal && DUK_HOBJECT_IS_THREAD(h)) { - duk_hthread *t = (duk_hthread *) h; - DUK__COMMA(); duk_fb_sprintf(fb, "__ptr_curr_pc:%p", (void *) t->ptr_curr_pc); - DUK__COMMA(); duk_fb_sprintf(fb, "__heap:%p", (void *) t->heap); - DUK__COMMA(); duk_fb_sprintf(fb, "__strict:%ld", (long) t->strict); - DUK__COMMA(); duk_fb_sprintf(fb, "__state:%ld", (long) t->state); - DUK__COMMA(); duk_fb_sprintf(fb, "__unused1:%ld", (long) t->unused1); - DUK__COMMA(); duk_fb_sprintf(fb, "__unused2:%ld", (long) t->unused2); - DUK__COMMA(); duk_fb_sprintf(fb, "__valstack:%p", (void *) t->valstack); - DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_end:%p/%ld", (void *) t->valstack_end, (long) (t->valstack_end - t->valstack)); - DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_alloc_end:%p/%ld", (void *) t->valstack_alloc_end, (long) (t->valstack_alloc_end - t->valstack)); - DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_bottom:%p/%ld", (void *) t->valstack_bottom, (long) (t->valstack_bottom - t->valstack)); - DUK__COMMA(); duk_fb_sprintf(fb, "__valstack_top:%p/%ld", (void *) t->valstack_top, (long) (t->valstack_top - t->valstack)); - DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_curr:%p", (void *) t->callstack_curr); - DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_top:%ld", (long) t->callstack_top); - DUK__COMMA(); duk_fb_sprintf(fb, "__callstack_preventcount:%ld", (long) t->callstack_preventcount); - DUK__COMMA(); duk_fb_sprintf(fb, "__resumer:"); duk__print_hobject(st, (duk_hobject *) t->resumer); - DUK__COMMA(); duk_fb_sprintf(fb, "__compile_ctx:%p", (void *) t->compile_ctx); -#if defined(DUK_USE_INTERRUPT_COUNTER) - DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_counter:%ld", (long) t->interrupt_counter); - DUK__COMMA(); duk_fb_sprintf(fb, "__interrupt_init:%ld", (long) t->interrupt_init); -#endif - - /* XXX: print built-ins array? */ - - } -#if defined(DUK_USE_REFERENCE_COUNTING) - if (st->internal) { - DUK__COMMA(); duk_fb_sprintf(fb, "__refcount:%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h)); - } -#endif - if (st->internal) { - DUK__COMMA(); duk_fb_sprintf(fb, "__class:%ld", (long) DUK_HOBJECT_GET_CLASS_NUMBER(h)); - } - - DUK__COMMA(); duk_fb_sprintf(fb, "__heapptr:%p", (void *) h); /* own pointer */ - - /* prototype should be last, for readability */ - if (DUK_HOBJECT_GET_PROTOTYPE(NULL, h)) { - if (st->follow_proto) { - DUK__COMMA(); duk_fb_put_cstring(fb, "__prototype:"); duk__print_hobject(st, DUK_HOBJECT_GET_PROTOTYPE(NULL, h)); - } else { - DUK__COMMA(); duk_fb_sprintf(fb, "__prototype:%p", (void *) DUK_HOBJECT_GET_PROTOTYPE(NULL, h)); - } - } - - duk_fb_put_cstring(fb, brace2); - -#if defined(DUK_USE_HOBJECT_HASH_PART) - if (st->heavy && DUK_HOBJECT_GET_HSIZE(h) > 0) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE); - for (i = 0; i < DUK_HOBJECT_GET_HSIZE(h); i++) { - duk_uint_t h_idx = DUK_HOBJECT_H_GET_INDEX(NULL, h, i); - if (i > 0) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); - } - if (h_idx == DUK_HOBJECT_HASHIDX_UNUSED) { - duk_fb_sprintf(fb, "u"); - } else if (h_idx == DUK_HOBJECT_HASHIDX_DELETED) { - duk_fb_sprintf(fb, "d"); - } else { - duk_fb_sprintf(fb, "%ld", (long) h_idx); - } - } - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE); - } -#endif - - finished: - st->depth--; - if (pushed_loopstack) { - st->loop_stack_index--; - st->loop_stack[st->loop_stack_index] = NULL; - } -} - -DUK_LOCAL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h) { - duk_fixedbuffer *fb = st->fb; - duk_size_t i, n; - duk_uint8_t *p; - - if (duk_fb_is_full(fb)) { - return; - } - - /* terminal type: no depth check */ - - if (!h) { - duk_fb_put_cstring(fb, "NULL"); - return; - } - - if (DUK_HBUFFER_HAS_DYNAMIC(h)) { - if (DUK_HBUFFER_HAS_EXTERNAL(h)) { - duk_hbuffer_external *g = (duk_hbuffer_external *) h; - duk_fb_sprintf(fb, "buffer:external:%p:%ld", - (void *) DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(NULL, g), - (long) DUK_HBUFFER_EXTERNAL_GET_SIZE(g)); - } else { - duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h; - duk_fb_sprintf(fb, "buffer:dynamic:%p:%ld", - (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(NULL, g), - (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(g)); - } - } else { - duk_fb_sprintf(fb, "buffer:fixed:%ld", (long) DUK_HBUFFER_GET_SIZE(h)); - } - -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_fb_sprintf(fb, "/%lu", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr)); -#endif - - if (st->hexdump) { - duk_fb_sprintf(fb, "=["); - n = DUK_HBUFFER_GET_SIZE(h); - p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(NULL, h); - for (i = 0; i < n; i++) { - duk_fb_sprintf(fb, "%02lx", (unsigned long) p[i]); - } - duk_fb_sprintf(fb, "]"); - } -} - -DUK_LOCAL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h) { - duk_fixedbuffer *fb = st->fb; - - if (duk_fb_is_full(fb)) { - return; - } - - if (!h) { - duk_fb_put_cstring(fb, "NULL"); - return; - } - - switch (DUK_HEAPHDR_GET_TYPE(h)) { - case DUK_HTYPE_STRING: - duk__print_hstring(st, (duk_hstring *) h, 1); - break; - case DUK_HTYPE_OBJECT: - duk__print_hobject(st, (duk_hobject *) h); - break; - case DUK_HTYPE_BUFFER: - duk__print_hbuffer(st, (duk_hbuffer *) h); - break; - default: - duk_fb_sprintf(fb, "[unknown htype %ld]", (long) DUK_HEAPHDR_GET_TYPE(h)); - break; - } -} - -DUK_LOCAL void duk__print_tval(duk__dprint_state *st, duk_tval *tv) { - duk_fixedbuffer *fb = st->fb; - - if (duk_fb_is_full(fb)) { - return; - } - - /* depth check is done when printing an actual type */ - - if (st->heavy) { - duk_fb_sprintf(fb, "(%p)", (void *) tv); - } - - if (!tv) { - duk_fb_put_cstring(fb, "NULL"); - return; - } - - if (st->binary) { - duk_size_t i; - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET); - for (i = 0; i < (duk_size_t) sizeof(*tv); i++) { - duk_fb_sprintf(fb, "%02lx", (unsigned long) ((duk_uint8_t *)tv)[i]); - } - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET); - } - - if (st->heavy) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE); - } - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: { - duk_fb_put_cstring(fb, "undefined"); - break; - } - case DUK_TAG_UNUSED: { - duk_fb_put_cstring(fb, "unused"); - break; - } - case DUK_TAG_NULL: { - duk_fb_put_cstring(fb, "null"); - break; - } - case DUK_TAG_BOOLEAN: { - duk_fb_put_cstring(fb, DUK_TVAL_GET_BOOLEAN(tv) ? "true" : "false"); - break; - } - case DUK_TAG_STRING: { - /* Note: string is a terminal heap object, so no depth check here */ - duk__print_hstring(st, DUK_TVAL_GET_STRING(tv), 1); - break; - } - case DUK_TAG_OBJECT: { - duk__print_hobject(st, DUK_TVAL_GET_OBJECT(tv)); - break; - } - case DUK_TAG_BUFFER: { - duk__print_hbuffer(st, DUK_TVAL_GET_BUFFER(tv)); - break; - } - case DUK_TAG_POINTER: { - duk_fb_sprintf(fb, "pointer:%p", (void *) DUK_TVAL_GET_POINTER(tv)); - break; - } - case DUK_TAG_LIGHTFUNC: { - duk_c_function func; - duk_small_uint_t lf_flags; - - DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); - duk_fb_sprintf(fb, "lightfunc:"); - duk_fb_put_funcptr(fb, (duk_uint8_t *) &func, sizeof(func)); - duk_fb_sprintf(fb, ":%04lx", (long) lf_flags); - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - duk_fb_sprintf(fb, "%.18g_F", (double) DUK_TVAL_GET_NUMBER(tv)); - break; -#endif - default: { - /* IEEE double is approximately 16 decimal digits; print a couple extra */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - duk_fb_sprintf(fb, "%.18g", (double) DUK_TVAL_GET_NUMBER(tv)); - break; - } - } - if (st->heavy) { - duk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE); - } -} - -DUK_LOCAL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins) { - duk_fixedbuffer *fb = st->fb; - duk_small_int_t op; - const char *op_name; - - op = (duk_small_int_t) DUK_DEC_OP(ins); - op_name = duk__bc_optab[op]; - - /* XXX: option to fix opcode length so it lines up nicely */ - - if (op == DUK_OP_JUMP) { - duk_int_t diff1 = (duk_int_t) (DUK_DEC_ABC(ins) - DUK_BC_JUMP_BIAS); /* from next pc */ - duk_int_t diff2 = diff1 + 1; /* from curr pc */ - - duk_fb_sprintf(fb, "%s %ld (to pc%c%ld)", - (const char *) op_name, (long) diff1, - (int) (diff2 >= 0 ? '+' : '-'), /* char format: use int */ - (long) (diff2 >= 0 ? diff2 : -diff2)); - } else { - duk_fb_sprintf(fb, "%s %ld, %ld, %ld", - (const char *) op_name, (long) DUK_DEC_A(ins), - (long) DUK_DEC_B(ins), (long) DUK_DEC_C(ins)); - } -} - -DUK_LOCAL void duk__print_opcode(duk__dprint_state *st, duk_small_int_t opcode) { - duk_fixedbuffer *fb = st->fb; - - if (opcode < DUK_BC_OP_MIN || opcode > DUK_BC_OP_MAX) { - duk_fb_sprintf(fb, "?(%ld)", (long) opcode); - } else { - duk_fb_sprintf(fb, "%s", (const char *) duk__bc_optab[opcode]); - } -} - -DUK_INTERNAL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap) { - duk_fixedbuffer fb; - const char *p = format; - const char *p_end = p + DUK_STRLEN(format); - duk_int_t retval; - - DUK_MEMZERO(&fb, sizeof(fb)); - fb.buffer = (duk_uint8_t *) str; - fb.length = size; - fb.offset = 0; - fb.truncated = 0; - - while (p < p_end) { - char ch = *p++; - const char *p_begfmt = NULL; - duk_bool_t got_exclamation = 0; - duk_bool_t got_long = 0; /* %lf, %ld etc */ - duk__dprint_state st; - - if (ch != DUK_ASC_PERCENT) { - duk_fb_put_byte(&fb, (duk_uint8_t) ch); - continue; - } - - /* - * Format tag parsing. Since we don't understand all the - * possible format tags allowed, we just scan for a terminating - * specifier and keep track of relevant modifiers that we do - * understand. See man 3 printf. - */ - - DUK_MEMZERO(&st, sizeof(st)); - st.fb = &fb; - st.depth = 0; - st.depth_limit = 1; - st.loop_stack_index = 0; - st.loop_stack_limit = DUK__LOOP_STACK_DEPTH; - - p_begfmt = p - 1; - while (p < p_end) { - ch = *p++; - - if (ch == DUK_ASC_STAR) { - /* unsupported: would consume multiple args */ - goto format_error; - } else if (ch == DUK_ASC_PERCENT) { - duk_fb_put_byte(&fb, (duk_uint8_t) DUK_ASC_PERCENT); - break; - } else if (ch == DUK_ASC_EXCLAMATION) { - got_exclamation = 1; - } else if (!got_exclamation && ch == DUK_ASC_LC_L) { - got_long = 1; - } else if (got_exclamation && ch == DUK_ASC_LC_D) { - st.depth_limit = DUK__DEEP_DEPTH_LIMIT; - } else if (got_exclamation && ch == DUK_ASC_LC_P) { - st.follow_proto = 1; - } else if (got_exclamation && ch == DUK_ASC_LC_I) { - st.internal = 1; - } else if (got_exclamation && ch == DUK_ASC_LC_X) { - st.hexdump = 1; - } else if (got_exclamation && ch == DUK_ASC_LC_H) { - st.heavy = 1; - } else if (got_exclamation && ch == DUK_ASC_ATSIGN) { - st.pointer = 1; - } else if (got_exclamation && ch == DUK_ASC_HASH) { - st.binary = 1; - } else if (got_exclamation && ch == DUK_ASC_UC_T) { - duk_tval *t = va_arg(ap, duk_tval *); - if (st.pointer && !st.heavy) { - duk_fb_sprintf(&fb, "(%p)", (void *) t); - } - duk__print_tval(&st, t); - break; - } else if (got_exclamation && ch == DUK_ASC_UC_O) { - duk_heaphdr *t = va_arg(ap, duk_heaphdr *); - if (st.pointer && !st.heavy) { - duk_fb_sprintf(&fb, "(%p)", (void *) t); - } - duk__print_heaphdr(&st, t); - break; - } else if (got_exclamation && ch == DUK_ASC_UC_I) { - duk_instr_t t = va_arg(ap, duk_instr_t); - duk__print_instr(&st, t); - break; - } else if (got_exclamation && ch == DUK_ASC_UC_C) { - long t = va_arg(ap, long); - duk__print_opcode(&st, (duk_small_int_t) t); - break; - } else if (!got_exclamation && strchr(DUK__ALLOWED_STANDARD_SPECIFIERS, (int) ch)) { - char fmtbuf[DUK__MAX_FORMAT_TAG_LENGTH]; - duk_size_t fmtlen; - - DUK_ASSERT(p >= p_begfmt); - fmtlen = (duk_size_t) (p - p_begfmt); - if (fmtlen >= sizeof(fmtbuf)) { - /* format is too large, abort */ - goto format_error; - } - DUK_MEMZERO(fmtbuf, sizeof(fmtbuf)); - DUK_MEMCPY(fmtbuf, p_begfmt, fmtlen); - - /* assume exactly 1 arg, which is why '*' is forbidden; arg size still - * depends on type though. - */ - - if (ch == DUK_ASC_LC_F || ch == DUK_ASC_LC_G || ch == DUK_ASC_LC_E) { - /* %f and %lf both consume a 'long' */ - double arg = va_arg(ap, double); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_D && got_long) { - /* %ld */ - long arg = va_arg(ap, long); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_D) { - /* %d; only 16 bits are guaranteed */ - int arg = va_arg(ap, int); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_U && got_long) { - /* %lu */ - unsigned long arg = va_arg(ap, unsigned long); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_U) { - /* %u; only 16 bits are guaranteed */ - unsigned int arg = va_arg(ap, unsigned int); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_X && got_long) { - /* %lx */ - unsigned long arg = va_arg(ap, unsigned long); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_X) { - /* %x; only 16 bits are guaranteed */ - unsigned int arg = va_arg(ap, unsigned int); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else if (ch == DUK_ASC_LC_S) { - /* %s */ - const char *arg = va_arg(ap, const char *); - if (arg == NULL) { - /* '%s' and NULL is not portable, so special case - * it for debug printing. - */ - duk_fb_sprintf(&fb, "NULL"); - } else { - duk_fb_sprintf(&fb, fmtbuf, arg); - } - } else if (ch == DUK_ASC_LC_P) { - /* %p */ - void *arg = va_arg(ap, void *); - if (arg == NULL) { - /* '%p' and NULL is portable, but special case it - * anyway to get a standard NULL marker in logs. - */ - duk_fb_sprintf(&fb, "NULL"); - } else { - duk_fb_sprintf(&fb, fmtbuf, arg); - } - } else if (ch == DUK_ASC_LC_C) { - /* '%c', passed concretely as int */ - int arg = va_arg(ap, int); - duk_fb_sprintf(&fb, fmtbuf, arg); - } else { - /* Should not happen. */ - duk_fb_sprintf(&fb, "INVALID-FORMAT(%s)", (const char *) fmtbuf); - } - break; - } else { - /* ignore */ - } - } - } - goto done; - - format_error: - duk_fb_put_cstring(&fb, "FMTERR"); - /* fall through */ - - done: - retval = (duk_int_t) fb.offset; - duk_fb_put_byte(&fb, (duk_uint8_t) 0); - - /* return total chars written excluding terminator */ - return retval; -} - -#if 0 /*unused*/ -DUK_INTERNAL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...) { - duk_int_t retval; - va_list ap; - va_start(ap, format); - retval = duk_debug_vsnprintf(str, size, format, ap); - va_end(ap); - return retval; -} -#endif - -/* Formatting function pointers is tricky: there is no standard pointer for - * function pointers and the size of a function pointer may depend on the - * specific pointer type. This helper formats a function pointer based on - * its memory layout to get something useful on most platforms. - */ -DUK_INTERNAL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size) { - duk_size_t i; - duk_uint8_t *p = (duk_uint8_t *) buf; - duk_uint8_t *p_end = (duk_uint8_t *) (buf + buf_size - 1); - - DUK_MEMZERO(buf, buf_size); - - for (i = 0; i < fptr_size; i++) { - duk_int_t left = (duk_int_t) (p_end - p); - duk_uint8_t ch; - if (left <= 0) { - break; - } - - /* Quite approximate but should be useful for little and big endian. */ -#if defined(DUK_USE_INTEGER_BE) - ch = fptr[i]; -#else - ch = fptr[fptr_size - 1 - i]; -#endif - p += DUK_SNPRINTF((char *) p, (duk_size_t) left, "%02lx", (unsigned long) ch); - } -} - -#endif /* DUK_USE_DEBUG */ - -/* automatic undefs */ -#undef DUK__ALLOWED_STANDARD_SPECIFIERS -#undef DUK__COMMA -#undef DUK__DEEP_DEPTH_LIMIT -#undef DUK__LOOP_STACK_DEPTH -#undef DUK__MAX_FORMAT_TAG_LENGTH -#line 1 "duk_debugger.c" -/* - * Duktape debugger - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - -/* - * Assert helpers - */ - -#if defined(DUK_USE_ASSERTIONS) -#define DUK__DBG_TPORT_ENTER() do { \ - DUK_ASSERT(heap->dbg_calling_transport == 0); \ - heap->dbg_calling_transport = 1; \ - } while (0) -#define DUK__DBG_TPORT_EXIT() do { \ - DUK_ASSERT(heap->dbg_calling_transport == 1); \ - heap->dbg_calling_transport = 0; \ - } while (0) -#else -#define DUK__DBG_TPORT_ENTER() do {} while (0) -#define DUK__DBG_TPORT_EXIT() do {} while (0) -#endif - -/* - * Helper structs - */ - -typedef union { - void *p; - duk_uint_t b[1]; - /* Use b[] to access the size of the union, which is strictly not - * correct. Can't use fixed size unless there's feature detection - * for pointer byte size. - */ -} duk__ptr_union; - -/* - * Detach handling - */ - -#define DUK__SET_CONN_BROKEN(thr,reason) do { \ - /* For now shared handler is fine. */ \ - duk__debug_do_detach1((thr)->heap, (reason)); \ - } while (0) - -DUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) { - /* Can be called multiple times with no harm. Mark the transport - * bad (dbg_read_cb == NULL) and clear state except for the detached - * callback and the udata field. The detached callback is delayed - * to the message loop so that it can be called between messages; - * this avoids corner cases related to immediate debugger reattach - * inside the detached callback. - */ - - if (heap->dbg_detaching) { - DUK_D(DUK_DPRINT("debugger already detaching, ignore detach1")); - return; - } - - DUK_D(DUK_DPRINT("debugger transport detaching, marking transport broken")); - - heap->dbg_detaching = 1; /* prevent multiple in-progress detaches */ - - if (heap->dbg_write_cb != NULL) { - duk_hthread *thr; - - thr = heap->heap_thread; - DUK_ASSERT(thr != NULL); - - duk_debug_write_notify(thr, DUK_DBG_CMD_DETACHING); - duk_debug_write_int(thr, reason); - duk_debug_write_eom(thr); - } - - heap->dbg_read_cb = NULL; - heap->dbg_write_cb = NULL; - heap->dbg_peek_cb = NULL; - heap->dbg_read_flush_cb = NULL; - heap->dbg_write_flush_cb = NULL; - heap->dbg_request_cb = NULL; - /* heap->dbg_detached_cb: keep */ - /* heap->dbg_udata: keep */ - /* heap->dbg_processing: keep on purpose to avoid debugger re-entry in detaching state */ - heap->dbg_state_dirty = 0; - heap->dbg_force_restart = 0; - heap->dbg_pause_flags = 0; - heap->dbg_pause_act = NULL; - heap->dbg_pause_startline = 0; - heap->dbg_have_next_byte = 0; - duk_debug_clear_paused(heap); /* XXX: some overlap with field inits above */ - heap->dbg_state_dirty = 0; /* XXX: clear_paused sets dirty; rework? */ - - /* Ensure there are no stale active breakpoint pointers. - * Breakpoint list is currently kept - we could empty it - * here but we'd need to handle refcounts correctly, and - * we'd need a 'thr' reference for that. - * - * XXX: clear breakpoint on either attach or detach? - */ - heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; -} - -DUK_LOCAL void duk__debug_do_detach2(duk_heap *heap) { - duk_debug_detached_function detached_cb; - void *detached_udata; - duk_hthread *thr; - - thr = heap->heap_thread; - if (thr == NULL) { - DUK_ASSERT(heap->dbg_detached_cb == NULL); - return; - } - - /* Safe to call multiple times. */ - - detached_cb = heap->dbg_detached_cb; - detached_udata = heap->dbg_udata; - heap->dbg_detached_cb = NULL; - heap->dbg_udata = NULL; - - if (detached_cb) { - /* Careful here: state must be wiped before the call - * so that we can cleanly handle a re-attach from - * inside the callback. - */ - DUK_D(DUK_DPRINT("detached during message loop, delayed call to detached_cb")); - detached_cb(thr, detached_udata); - } - - heap->dbg_detaching = 0; -} - -DUK_INTERNAL void duk_debug_do_detach(duk_heap *heap) { - duk__debug_do_detach1(heap, 0); - duk__debug_do_detach2(heap); -} - -/* Called on a read/write error: NULL all callbacks except the detached - * callback so that we never accidentally call them after a read/write - * error has been indicated. This is especially important for the transport - * I/O callbacks to fulfill guaranteed callback semantics. - */ -DUK_LOCAL void duk__debug_null_most_callbacks(duk_hthread *thr) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - - heap = thr->heap; - DUK_D(DUK_DPRINT("transport read/write error, NULL all callbacks expected detached")); - heap->dbg_read_cb = NULL; - heap->dbg_write_cb = NULL; /* this is especially critical to avoid another write call in detach1() */ - heap->dbg_peek_cb = NULL; - heap->dbg_read_flush_cb = NULL; - heap->dbg_write_flush_cb = NULL; - heap->dbg_request_cb = NULL; - /* keep heap->dbg_detached_cb */ -} - -/* - * Pause handling - */ - -DUK_LOCAL void duk__debug_set_pause_state(duk_hthread *thr, duk_heap *heap, duk_small_uint_t pause_flags) { - duk_uint_fast32_t line; - - line = duk_debug_curr_line(thr); - if (line == 0) { - /* No line info for current function. */ - duk_small_uint_t updated_flags; - - updated_flags = pause_flags & ~(DUK_PAUSE_FLAG_LINE_CHANGE); - DUK_D(DUK_DPRINT("no line info for current activation, disable line-based pause flags: 0x%08lx -> 0x%08lx", - (long) pause_flags, (long) updated_flags)); - pause_flags = updated_flags; - } - - heap->dbg_pause_flags = pause_flags; - heap->dbg_pause_act = thr->callstack_curr; - heap->dbg_pause_startline = (duk_uint32_t) line; - heap->dbg_state_dirty = 1; - - DUK_D(DUK_DPRINT("set state for automatic pause triggers, flags=0x%08lx, act=%p, startline=%ld", - (long) heap->dbg_pause_flags, (void *) heap->dbg_pause_act, - (long) heap->dbg_pause_startline)); -} - -/* - * Debug connection peek and flush primitives - */ - -DUK_INTERNAL duk_bool_t duk_debug_read_peek(duk_hthread *thr) { - duk_heap *heap; - duk_bool_t ret; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_read_cb == NULL) { - DUK_D(DUK_DPRINT("attempt to peek in detached state, return zero (= no data)")); - return 0; - } - if (heap->dbg_peek_cb == NULL) { - DUK_DD(DUK_DDPRINT("no peek callback, return zero (= no data)")); - return 0; - } - - DUK__DBG_TPORT_ENTER(); - ret = (duk_bool_t) (heap->dbg_peek_cb(heap->dbg_udata) > 0); - DUK__DBG_TPORT_EXIT(); - return ret; -} - -DUK_INTERNAL void duk_debug_read_flush(duk_hthread *thr) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_read_cb == NULL) { - DUK_D(DUK_DPRINT("attempt to read flush in detached state, ignore")); - return; - } - if (heap->dbg_read_flush_cb == NULL) { - DUK_DD(DUK_DDPRINT("no read flush callback, ignore")); - return; - } - - DUK__DBG_TPORT_ENTER(); - heap->dbg_read_flush_cb(heap->dbg_udata); - DUK__DBG_TPORT_EXIT(); -} - -DUK_INTERNAL void duk_debug_write_flush(duk_hthread *thr) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_read_cb == NULL) { - DUK_D(DUK_DPRINT("attempt to write flush in detached state, ignore")); - return; - } - if (heap->dbg_write_flush_cb == NULL) { - DUK_DD(DUK_DDPRINT("no write flush callback, ignore")); - return; - } - - DUK__DBG_TPORT_ENTER(); - heap->dbg_write_flush_cb(heap->dbg_udata); - DUK__DBG_TPORT_EXIT(); -} - -/* - * Debug connection skip primitives - */ - -/* Skip fully. */ -DUK_INTERNAL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length) { - duk_uint8_t dummy[64]; - duk_size_t now; - - DUK_ASSERT(thr != NULL); - - while (length > 0) { - now = (length > sizeof(dummy) ? sizeof(dummy) : length); - duk_debug_read_bytes(thr, dummy, now); - length -= now; - } -} - -DUK_INTERNAL void duk_debug_skip_byte(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - - (void) duk_debug_read_byte(thr); -} - -/* - * Debug connection read primitives - */ - -/* Peek ahead in the stream one byte. */ -DUK_INTERNAL uint8_t duk_debug_peek_byte(duk_hthread *thr) { - /* It is important not to call this if the last byte read was an EOM. - * Reading ahead in this scenario would cause unnecessary blocking if - * another message is not available. - */ - - duk_uint8_t x; - - x = duk_debug_read_byte(thr); - thr->heap->dbg_have_next_byte = 1; - thr->heap->dbg_next_byte = x; - return x; -} - -/* Read fully. */ -DUK_INTERNAL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length) { - duk_heap *heap; - duk_uint8_t *p; - duk_size_t left; - duk_size_t got; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_read_cb == NULL) { - DUK_D(DUK_DPRINT("attempt to read %ld bytes in detached state, return zero data", (long) length)); - goto fail; - } - - /* NOTE: length may be zero */ - p = data; - if (length >= 1 && heap->dbg_have_next_byte) { - heap->dbg_have_next_byte = 0; - *p++ = heap->dbg_next_byte; - } - for (;;) { - left = (duk_size_t) ((data + length) - p); - if (left == 0) { - break; - } - DUK_ASSERT(heap->dbg_read_cb != NULL); - DUK_ASSERT(left >= 1); -#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE) - left = 1; -#endif - DUK__DBG_TPORT_ENTER(); - got = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left); - DUK__DBG_TPORT_EXIT(); - - if (got == 0 || got > left) { - DUK_D(DUK_DPRINT("connection error during read, return zero data")); - duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */ - DUK__SET_CONN_BROKEN(thr, 1); - goto fail; - } - p += got; - } - return; - - fail: - DUK_MEMZERO((void *) data, (size_t) length); -} - -DUK_INTERNAL duk_uint8_t duk_debug_read_byte(duk_hthread *thr) { - duk_uint8_t x; - - x = 0; /* just in case callback is broken and won't write 'x' */ - duk_debug_read_bytes(thr, &x, 1); - return x; -} - -DUK_LOCAL duk_uint32_t duk__debug_read_uint32_raw(duk_hthread *thr) { - duk_uint8_t buf[4]; - - DUK_ASSERT(thr != NULL); - - duk_debug_read_bytes(thr, buf, 4); - return ((duk_uint32_t) buf[0] << 24) | - ((duk_uint32_t) buf[1] << 16) | - ((duk_uint32_t) buf[2] << 8) | - (duk_uint32_t) buf[3]; -} - -DUK_LOCAL duk_int32_t duk__debug_read_int32_raw(duk_hthread *thr) { - return (duk_int32_t) duk__debug_read_uint32_raw(thr); -} - -DUK_LOCAL duk_uint16_t duk__debug_read_uint16_raw(duk_hthread *thr) { - duk_uint8_t buf[2]; - - DUK_ASSERT(thr != NULL); - - duk_debug_read_bytes(thr, buf, 2); - return ((duk_uint16_t) buf[0] << 8) | - (duk_uint16_t) buf[1]; -} - -DUK_INTERNAL duk_int32_t duk_debug_read_int(duk_hthread *thr) { - duk_small_uint_t x; - duk_small_uint_t t; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - if (x >= 0xc0) { - t = duk_debug_read_byte(thr); - return (duk_int32_t) (((x - 0xc0) << 8) + t); - } else if (x >= 0x80) { - return (duk_int32_t) (x - 0x80); - } else if (x == DUK_DBG_IB_INT4) { - return (duk_int32_t) duk__debug_read_uint32_raw(thr); - } - - DUK_D(DUK_DPRINT("debug connection error: failed to decode int")); - DUK__SET_CONN_BROKEN(thr, 1); - return 0; -} - -DUK_LOCAL duk_hstring *duk__debug_read_hstring_raw(duk_hthread *thr, duk_uint32_t len) { - duk_uint8_t buf[31]; - duk_uint8_t *p; - - if (len <= sizeof(buf)) { - duk_debug_read_bytes(thr, buf, (duk_size_t) len); - duk_push_lstring(thr, (const char *) buf, (duk_size_t) len); - } else { - p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */ - DUK_ASSERT(p != NULL); - duk_debug_read_bytes(thr, p, (duk_size_t) len); - (void) duk_buffer_to_string(thr, -1); /* Safety relies on debug client, which is OK. */ - } - - return duk_require_hstring(thr, -1); -} - -DUK_INTERNAL duk_hstring *duk_debug_read_hstring(duk_hthread *thr) { - duk_small_uint_t x; - duk_uint32_t len; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - if (x >= 0x60 && x <= 0x7f) { - /* For short strings, use a fixed temp buffer. */ - len = (duk_uint32_t) (x - 0x60); - } else if (x == DUK_DBG_IB_STR2) { - len = (duk_uint32_t) duk__debug_read_uint16_raw(thr); - } else if (x == DUK_DBG_IB_STR4) { - len = (duk_uint32_t) duk__debug_read_uint32_raw(thr); - } else { - goto fail; - } - - return duk__debug_read_hstring_raw(thr, len); - - fail: - DUK_D(DUK_DPRINT("debug connection error: failed to decode int")); - DUK__SET_CONN_BROKEN(thr, 1); - duk_push_hstring_empty(thr); /* always push some string */ - return duk_require_hstring(thr, -1); -} - -DUK_LOCAL duk_hbuffer *duk__debug_read_hbuffer_raw(duk_hthread *thr, duk_uint32_t len) { - duk_uint8_t *p; - - p = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len); /* zero for paranoia */ - DUK_ASSERT(p != NULL); - duk_debug_read_bytes(thr, p, (duk_size_t) len); - - return duk_require_hbuffer(thr, -1); -} - -DUK_LOCAL void *duk__debug_read_pointer_raw(duk_hthread *thr) { - duk_small_uint_t x; - duk__ptr_union pu; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - if (x != sizeof(pu)) { - goto fail; - } - duk_debug_read_bytes(thr, (duk_uint8_t *) &pu.p, sizeof(pu)); -#if defined(DUK_USE_INTEGER_LE) - duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); -#endif - return (void *) pu.p; - - fail: - DUK_D(DUK_DPRINT("debug connection error: failed to decode pointer")); - DUK__SET_CONN_BROKEN(thr, 1); - return (void *) NULL; -} - -DUK_LOCAL duk_double_t duk__debug_read_double_raw(duk_hthread *thr) { - duk_double_union du; - - DUK_ASSERT(sizeof(du.uc) == 8); - duk_debug_read_bytes(thr, (duk_uint8_t *) du.uc, sizeof(du.uc)); - DUK_DBLUNION_DOUBLE_NTOH(&du); - return du.d; -} - -#if 0 -DUK_INTERNAL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr) { - duk_small_uint_t x; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - if (x != DUK_DBG_IB_HEAPPTR) { - goto fail; - } - - return (duk_heaphdr *) duk__debug_read_pointer_raw(thr); - - fail: - DUK_D(DUK_DPRINT("debug connection error: failed to decode heapptr")); - DUK__SET_CONN_BROKEN(thr, 1); - return NULL; -} -#endif - -DUK_INTERNAL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr) { - duk_small_uint_t x; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - switch (x) { - case DUK_DBG_IB_OBJECT: - case DUK_DBG_IB_POINTER: - case DUK_DBG_IB_HEAPPTR: - /* Accept any pointer-like value; for 'object' dvalue, read - * and ignore the class number. - */ - if (x == DUK_DBG_IB_OBJECT) { - duk_debug_skip_byte(thr); - } - break; - default: - goto fail; - } - - return (duk_heaphdr *) duk__debug_read_pointer_raw(thr); - - fail: - DUK_D(DUK_DPRINT("debug connection error: failed to decode any pointer (object, pointer, heapptr)")); - DUK__SET_CONN_BROKEN(thr, 1); - return NULL; -} - -DUK_INTERNAL duk_tval *duk_debug_read_tval(duk_hthread *thr) { - duk_uint8_t x; - duk_uint_t t; - duk_uint32_t len; - - DUK_ASSERT(thr != NULL); - - x = duk_debug_read_byte(thr); - - if (x >= 0xc0) { - t = (duk_uint_t) (x - 0xc0); - t = (t << 8) + duk_debug_read_byte(thr); - duk_push_uint(thr, (duk_uint_t) t); - goto return_ptr; - } - if (x >= 0x80) { - duk_push_uint(thr, (duk_uint_t) (x - 0x80)); - goto return_ptr; - } - if (x >= 0x60) { - len = (duk_uint32_t) (x - 0x60); - duk__debug_read_hstring_raw(thr, len); - goto return_ptr; - } - - switch (x) { - case DUK_DBG_IB_INT4: { - duk_int32_t i = duk__debug_read_int32_raw(thr); - duk_push_i32(thr, i); - break; - } - case DUK_DBG_IB_STR4: { - len = duk__debug_read_uint32_raw(thr); - duk__debug_read_hstring_raw(thr, len); - break; - } - case DUK_DBG_IB_STR2: { - len = duk__debug_read_uint16_raw(thr); - duk__debug_read_hstring_raw(thr, len); - break; - } - case DUK_DBG_IB_BUF4: { - len = duk__debug_read_uint32_raw(thr); - duk__debug_read_hbuffer_raw(thr, len); - break; - } - case DUK_DBG_IB_BUF2: { - len = duk__debug_read_uint16_raw(thr); - duk__debug_read_hbuffer_raw(thr, len); - break; - } - case DUK_DBG_IB_UNDEFINED: { - duk_push_undefined(thr); - break; - } - case DUK_DBG_IB_NULL: { - duk_push_null(thr); - break; - } - case DUK_DBG_IB_TRUE: { - duk_push_true(thr); - break; - } - case DUK_DBG_IB_FALSE: { - duk_push_false(thr); - break; - } - case DUK_DBG_IB_NUMBER: { - duk_double_t d; - d = duk__debug_read_double_raw(thr); - duk_push_number(thr, d); - break; - } - case DUK_DBG_IB_OBJECT: { - duk_heaphdr *h; - duk_debug_skip_byte(thr); - h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr); - duk_push_heapptr(thr, (void *) h); - break; - } - case DUK_DBG_IB_POINTER: { - void *ptr; - ptr = duk__debug_read_pointer_raw(thr); - duk_push_pointer(thr, ptr); - break; - } - case DUK_DBG_IB_LIGHTFUNC: { - /* XXX: Not needed for now, so not implemented. Note that - * function pointers may have different size/layout than - * a void pointer. - */ - DUK_D(DUK_DPRINT("reading lightfunc values unimplemented")); - goto fail; - } - case DUK_DBG_IB_HEAPPTR: { - duk_heaphdr *h; - h = (duk_heaphdr *) duk__debug_read_pointer_raw(thr); - duk_push_heapptr(thr, (void *) h); - break; - } - case DUK_DBG_IB_UNUSED: /* unused: not accepted in inbound messages */ - default: - goto fail; - } - - return_ptr: - return DUK_GET_TVAL_NEGIDX(thr, -1); - - fail: - DUK_D(DUK_DPRINT("debug connection error: failed to decode tval")); - DUK__SET_CONN_BROKEN(thr, 1); - return NULL; -} - -/* - * Debug connection write primitives - */ - -/* Write fully. */ -DUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length) { - duk_heap *heap; - const duk_uint8_t *p; - duk_size_t left; - duk_size_t got; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(length == 0 || data != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_write_cb == NULL) { - DUK_D(DUK_DPRINT("attempt to write %ld bytes in detached state, ignore", (long) length)); - return; - } - if (length == 0) { - /* Avoid doing an actual write callback with length == 0, - * because that's reserved for a write flush. - */ - return; - } - DUK_ASSERT(data != NULL); - - p = data; - for (;;) { - left = (duk_size_t) ((data + length) - p); - if (left == 0) { - break; - } - DUK_ASSERT(heap->dbg_write_cb != NULL); - DUK_ASSERT(left >= 1); -#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE) - left = 1; -#endif - DUK__DBG_TPORT_ENTER(); - got = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left); - DUK__DBG_TPORT_EXIT(); - - if (got == 0 || got > left) { - duk__debug_null_most_callbacks(thr); /* avoid calling write callback in detach1() */ - DUK_D(DUK_DPRINT("connection error during write")); - DUK__SET_CONN_BROKEN(thr, 1); - return; - } - p += got; - } -} - -DUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) { - duk_debug_write_bytes(thr, (const duk_uint8_t *) &x, 1); -} - -DUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) { - duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED); -} - -DUK_INTERNAL void duk_debug_write_undefined(duk_hthread *thr) { - duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED); -} - -#if defined(DUK_USE_DEBUGGER_INSPECT) -DUK_INTERNAL void duk_debug_write_null(duk_hthread *thr) { - duk_debug_write_byte(thr, DUK_DBG_IB_NULL); -} -#endif - -DUK_INTERNAL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val) { - duk_debug_write_byte(thr, val ? DUK_DBG_IB_TRUE : DUK_DBG_IB_FALSE); -} - -/* Write signed 32-bit integer. */ -DUK_INTERNAL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x) { - duk_uint8_t buf[5]; - duk_size_t len; - - DUK_ASSERT(thr != NULL); - - if (x >= 0 && x <= 0x3fL) { - buf[0] = (duk_uint8_t) (0x80 + x); - len = 1; - } else if (x >= 0 && x <= 0x3fffL) { - buf[0] = (duk_uint8_t) (0xc0 + (x >> 8)); - buf[1] = (duk_uint8_t) (x & 0xff); - len = 2; - } else { - /* Signed integers always map to 4 bytes now. */ - buf[0] = (duk_uint8_t) DUK_DBG_IB_INT4; - buf[1] = (duk_uint8_t) ((x >> 24) & 0xff); - buf[2] = (duk_uint8_t) ((x >> 16) & 0xff); - buf[3] = (duk_uint8_t) ((x >> 8) & 0xff); - buf[4] = (duk_uint8_t) (x & 0xff); - len = 5; - } - duk_debug_write_bytes(thr, buf, len); -} - -/* Write unsigned 32-bit integer. */ -DUK_INTERNAL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x) { - /* The debugger protocol doesn't support a plain integer encoding for - * the full 32-bit unsigned range (only 32-bit signed). For now, - * unsigned 32-bit values simply written as signed ones. This is not - * a concrete issue except for 32-bit heaphdr fields. Proper solutions - * would be to (a) write such integers as IEEE doubles or (b) add an - * unsigned 32-bit dvalue. - */ - if (x >= 0x80000000UL) { - DUK_D(DUK_DPRINT("writing unsigned integer 0x%08lx as signed integer", - (long) x)); - } - duk_debug_write_int(thr, (duk_int32_t) x); -} - -DUK_INTERNAL void duk_debug_write_strbuf(duk_hthread *thr, const char *data, duk_size_t length, duk_uint8_t marker_base) { - duk_uint8_t buf[5]; - duk_size_t buflen; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(length == 0 || data != NULL); - - if (length <= 0x1fUL && marker_base == DUK_DBG_IB_STR4) { - /* For strings, special form for short lengths. */ - buf[0] = (duk_uint8_t) (0x60 + length); - buflen = 1; - } else if (length <= 0xffffUL) { - buf[0] = (duk_uint8_t) (marker_base + 1); - buf[1] = (duk_uint8_t) (length >> 8); - buf[2] = (duk_uint8_t) (length & 0xff); - buflen = 3; - } else { - buf[0] = (duk_uint8_t) marker_base; - buf[1] = (duk_uint8_t) (length >> 24); - buf[2] = (duk_uint8_t) ((length >> 16) & 0xff); - buf[3] = (duk_uint8_t) ((length >> 8) & 0xff); - buf[4] = (duk_uint8_t) (length & 0xff); - buflen = 5; - } - - duk_debug_write_bytes(thr, (const duk_uint8_t *) buf, buflen); - duk_debug_write_bytes(thr, (const duk_uint8_t *) data, length); -} - -DUK_INTERNAL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length) { - duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_STR4); -} - -DUK_INTERNAL void duk_debug_write_cstring(duk_hthread *thr, const char *data) { - DUK_ASSERT(thr != NULL); - - duk_debug_write_string(thr, - data, - data ? DUK_STRLEN(data) : 0); -} - -DUK_INTERNAL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h) { - DUK_ASSERT(thr != NULL); - - /* XXX: differentiate null pointer from empty string? */ - duk_debug_write_string(thr, - (h != NULL ? (const char *) DUK_HSTRING_GET_DATA(h) : NULL), - (h != NULL ? (duk_size_t) DUK_HSTRING_GET_BYTELEN(h) : 0)); -} - -DUK_LOCAL void duk__debug_write_hstring_safe_top(duk_hthread *thr) { - duk_debug_write_hstring(thr, duk_safe_to_hstring(thr, -1)); -} - -DUK_INTERNAL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length) { - duk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_BUF4); -} - -DUK_INTERNAL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h) { - DUK_ASSERT(thr != NULL); - - duk_debug_write_buffer(thr, - (h != NULL ? (const char *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h) : NULL), - (h != NULL ? (duk_size_t) DUK_HBUFFER_GET_SIZE(h) : 0)); -} - -DUK_LOCAL void duk__debug_write_pointer_raw(duk_hthread *thr, void *ptr, duk_uint8_t ibyte) { - duk_uint8_t buf[2]; - duk__ptr_union pu; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(sizeof(ptr) >= 1 && sizeof(ptr) <= 16); - /* ptr may be NULL */ - - buf[0] = ibyte; - buf[1] = sizeof(pu); - duk_debug_write_bytes(thr, buf, 2); - pu.p = (void *) ptr; -#if defined(DUK_USE_INTEGER_LE) - duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); -#endif - duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu)); -} - -DUK_INTERNAL void duk_debug_write_pointer(duk_hthread *thr, void *ptr) { - duk__debug_write_pointer_raw(thr, ptr, DUK_DBG_IB_POINTER); -} - -#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT) -DUK_INTERNAL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h) { - duk__debug_write_pointer_raw(thr, (void *) h, DUK_DBG_IB_HEAPPTR); -} -#endif /* DUK_USE_DEBUGGER_DUMPHEAP || DUK_USE_DEBUGGER_INSPECT */ - -DUK_INTERNAL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj) { - duk_uint8_t buf[3]; - duk__ptr_union pu; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(sizeof(obj) >= 1 && sizeof(obj) <= 16); - DUK_ASSERT(obj != NULL); - - buf[0] = DUK_DBG_IB_OBJECT; - buf[1] = (duk_uint8_t) DUK_HOBJECT_GET_CLASS_NUMBER(obj); - buf[2] = sizeof(pu); - duk_debug_write_bytes(thr, buf, 3); - pu.p = (void *) obj; -#if defined(DUK_USE_INTEGER_LE) - duk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu)); -#endif - duk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu)); -} - -DUK_INTERNAL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv) { - duk_c_function lf_func; - duk_small_uint_t lf_flags; - duk_uint8_t buf[4]; - duk_double_union du1; - duk_double_union du2; - duk_int32_t i32; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: - duk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED); - break; - case DUK_TAG_UNUSED: - duk_debug_write_byte(thr, DUK_DBG_IB_UNUSED); - break; - case DUK_TAG_NULL: - duk_debug_write_byte(thr, DUK_DBG_IB_NULL); - break; - case DUK_TAG_BOOLEAN: - DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || - DUK_TVAL_GET_BOOLEAN(tv) == 1); - duk_debug_write_boolean(thr, DUK_TVAL_GET_BOOLEAN(tv)); - break; - case DUK_TAG_POINTER: - duk_debug_write_pointer(thr, (void *) DUK_TVAL_GET_POINTER(tv)); - break; - case DUK_TAG_LIGHTFUNC: - DUK_TVAL_GET_LIGHTFUNC(tv, lf_func, lf_flags); - buf[0] = DUK_DBG_IB_LIGHTFUNC; - buf[1] = (duk_uint8_t) (lf_flags >> 8); - buf[2] = (duk_uint8_t) (lf_flags & 0xff); - buf[3] = sizeof(lf_func); - duk_debug_write_bytes(thr, buf, 4); - duk_debug_write_bytes(thr, (const duk_uint8_t *) &lf_func, sizeof(lf_func)); - break; - case DUK_TAG_STRING: - duk_debug_write_hstring(thr, DUK_TVAL_GET_STRING(tv)); - break; - case DUK_TAG_OBJECT: - duk_debug_write_hobject(thr, DUK_TVAL_GET_OBJECT(tv)); - break; - case DUK_TAG_BUFFER: - duk_debug_write_hbuffer(thr, DUK_TVAL_GET_BUFFER(tv)); - break; -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: - /* Numbers are normalized to big (network) endian. We can - * (but are not required) to use integer dvalues when there's - * no loss of precision. - * - * XXX: share check with other code; this check is slow but - * reliable and doesn't require careful exponent/mantissa - * mask tricks as in the fastint downgrade code. - */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - du1.d = DUK_TVAL_GET_NUMBER(tv); - i32 = (duk_int32_t) du1.d; - du2.d = (duk_double_t) i32; - - DUK_DD(DUK_DDPRINT("i32=%ld du1=%02x%02x%02x%02x%02x%02x%02x%02x " - "du2=%02x%02x%02x%02x%02x%02x%02x%02x", - (long) i32, - (unsigned int) du1.uc[0], (unsigned int) du1.uc[1], - (unsigned int) du1.uc[2], (unsigned int) du1.uc[3], - (unsigned int) du1.uc[4], (unsigned int) du1.uc[5], - (unsigned int) du1.uc[6], (unsigned int) du1.uc[7], - (unsigned int) du2.uc[0], (unsigned int) du2.uc[1], - (unsigned int) du2.uc[2], (unsigned int) du2.uc[3], - (unsigned int) du2.uc[4], (unsigned int) du2.uc[5], - (unsigned int) du2.uc[6], (unsigned int) du2.uc[7])); - - if (DUK_MEMCMP((const void *) du1.uc, (const void *) du2.uc, sizeof(du1.uc)) == 0) { - duk_debug_write_int(thr, i32); - } else { - DUK_DBLUNION_DOUBLE_HTON(&du1); - duk_debug_write_byte(thr, DUK_DBG_IB_NUMBER); - duk_debug_write_bytes(thr, (const duk_uint8_t *) du1.uc, sizeof(du1.uc)); - } - } -} - -#if defined(DUK_USE_DEBUGGER_DUMPHEAP) -/* Variant for writing duk_tvals so that any heap allocated values are - * written out as tagged heap pointers. - */ -DUK_LOCAL void duk__debug_write_tval_heapptr(duk_hthread *thr, duk_tval *tv) { - if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { - duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); - duk_debug_write_heapptr(thr, h); - } else { - duk_debug_write_tval(thr, tv); - } -} -#endif /* DUK_USE_DEBUGGER_DUMPHEAP */ - -/* - * Debug connection message write helpers - */ - -#if 0 /* unused */ -DUK_INTERNAL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command) { - duk_debug_write_byte(thr, DUK_DBG_IB_REQUEST); - duk_debug_write_int(thr, command); -} -#endif - -DUK_INTERNAL void duk_debug_write_reply(duk_hthread *thr) { - duk_debug_write_byte(thr, DUK_DBG_IB_REPLY); -} - -DUK_INTERNAL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg) { - /* Allow NULL 'msg' */ - duk_debug_write_byte(thr, DUK_DBG_IB_ERROR); - duk_debug_write_int(thr, (duk_int32_t) err_code); - duk_debug_write_cstring(thr, msg); - duk_debug_write_eom(thr); -} - -DUK_INTERNAL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command) { - duk_debug_write_byte(thr, DUK_DBG_IB_NOTIFY); - duk_debug_write_int(thr, (duk_int32_t) command); -} - -DUK_INTERNAL void duk_debug_write_eom(duk_hthread *thr) { - duk_debug_write_byte(thr, DUK_DBG_IB_EOM); - - /* As an initial implementation, write flush after every EOM (and the - * version identifier). A better implementation would flush only when - * Duktape is finished processing messages so that a flush only happens - * after all outbound messages are finished on that occasion. - */ - duk_debug_write_flush(thr); -} - -/* - * Status message and helpers - */ - -DUK_INTERNAL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr) { - duk_activation *act; - duk_uint_fast32_t line; - duk_uint_fast32_t pc; - - act = thr->callstack_curr; - if (act == NULL) { - return 0; - } - - /* We're conceptually between two opcodes; act->pc indicates the next - * instruction to be executed. This is usually the correct pc/line to - * indicate in Status. (For the 'debugger' statement this now reports - * the pc/line after the debugger statement because the debugger opcode - * has already been executed.) - */ - - pc = duk_hthread_get_act_curr_pc(thr, act); - - /* XXX: this should be optimized to be a raw query and avoid valstack - * operations if possible. - */ - duk_push_tval(thr, &act->tv_func); - line = duk_hobject_pc2line_query(thr, -1, pc); - duk_pop(thr); - return line; -} - -DUK_INTERNAL void duk_debug_send_status(duk_hthread *thr) { - duk_activation *act; - - duk_debug_write_notify(thr, DUK_DBG_CMD_STATUS); - duk_debug_write_int(thr, (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ? 1 : 0)); - - act = thr->callstack_curr; - if (act == NULL) { - duk_debug_write_undefined(thr); - duk_debug_write_undefined(thr); - duk_debug_write_int(thr, 0); - duk_debug_write_int(thr, 0); - } else { - duk_push_tval(thr, &act->tv_func); - duk_get_prop_string(thr, -1, "fileName"); - duk__debug_write_hstring_safe_top(thr); - duk_get_prop_string(thr, -2, "name"); - duk__debug_write_hstring_safe_top(thr); - duk_pop_3(thr); - /* Report next pc/line to be executed. */ - duk_debug_write_uint(thr, (duk_uint32_t) duk_debug_curr_line(thr)); - duk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act)); - } - - duk_debug_write_eom(thr); -} - -#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) -DUK_INTERNAL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal) { - /* - * NFY EOM - */ - - duk_activation *act; - duk_uint32_t pc; - - DUK_ASSERT(thr->valstack_top > thr->valstack); /* At least: ... [err] */ - - duk_debug_write_notify(thr, DUK_DBG_CMD_THROW); - duk_debug_write_int(thr, (duk_int32_t) fatal); - - /* Report thrown value to client coerced to string */ - duk_dup_top(thr); - duk__debug_write_hstring_safe_top(thr); - duk_pop(thr); - - if (duk_is_error(thr, -1)) { - /* Error instance, use augmented error data directly */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); - duk__debug_write_hstring_safe_top(thr); - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER); - duk_debug_write_uint(thr, duk_get_uint(thr, -1)); - duk_pop_2(thr); - } else { - /* For anything other than an Error instance, we calculate the - * error location directly from the current activation if one - * exists. - */ - act = thr->callstack_curr; - if (act != NULL) { - duk_push_tval(thr, &act->tv_func); - duk_get_prop_string(thr, -1, "fileName"); - duk__debug_write_hstring_safe_top(thr); - pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr, act); - duk_debug_write_uint(thr, (duk_uint32_t) duk_hobject_pc2line_query(thr, -2, pc)); - duk_pop_2(thr); - } else { - /* Can happen if duk_throw() is called on an empty - * callstack. - */ - duk_debug_write_cstring(thr, ""); - duk_debug_write_uint(thr, 0); - } - } - - duk_debug_write_eom(thr); -} -#endif /* DUK_USE_DEBUGGER_THROW_NOTIFY */ - -/* - * Debug message processing - */ - -/* Skip dvalue. */ -DUK_LOCAL duk_bool_t duk__debug_skip_dvalue(duk_hthread *thr) { - duk_uint8_t x; - duk_uint32_t len; - - x = duk_debug_read_byte(thr); - - if (x >= 0xc0) { - duk_debug_skip_byte(thr); - return 0; - } - if (x >= 0x80) { - return 0; - } - if (x >= 0x60) { - duk_debug_skip_bytes(thr, (duk_size_t) (x - 0x60)); - return 0; - } - switch(x) { - case DUK_DBG_IB_EOM: - return 1; /* Return 1: got EOM */ - case DUK_DBG_IB_REQUEST: - case DUK_DBG_IB_REPLY: - case DUK_DBG_IB_ERROR: - case DUK_DBG_IB_NOTIFY: - break; - case DUK_DBG_IB_INT4: - (void) duk__debug_read_uint32_raw(thr); - break; - case DUK_DBG_IB_STR4: - case DUK_DBG_IB_BUF4: - len = duk__debug_read_uint32_raw(thr); - duk_debug_skip_bytes(thr, len); - break; - case DUK_DBG_IB_STR2: - case DUK_DBG_IB_BUF2: - len = duk__debug_read_uint16_raw(thr); - duk_debug_skip_bytes(thr, len); - break; - case DUK_DBG_IB_UNUSED: - case DUK_DBG_IB_UNDEFINED: - case DUK_DBG_IB_NULL: - case DUK_DBG_IB_TRUE: - case DUK_DBG_IB_FALSE: - break; - case DUK_DBG_IB_NUMBER: - duk_debug_skip_bytes(thr, 8); - break; - case DUK_DBG_IB_OBJECT: - duk_debug_skip_byte(thr); - len = duk_debug_read_byte(thr); - duk_debug_skip_bytes(thr, len); - break; - case DUK_DBG_IB_POINTER: - case DUK_DBG_IB_HEAPPTR: - len = duk_debug_read_byte(thr); - duk_debug_skip_bytes(thr, len); - break; - case DUK_DBG_IB_LIGHTFUNC: - duk_debug_skip_bytes(thr, 2); - len = duk_debug_read_byte(thr); - duk_debug_skip_bytes(thr, len); - break; - default: - goto fail; - } - - return 0; - - fail: - DUK__SET_CONN_BROKEN(thr, 1); - return 1; /* Pretend like we got EOM */ -} - -/* Skip dvalues to EOM. */ -DUK_LOCAL void duk__debug_skip_to_eom(duk_hthread *thr) { - for (;;) { - if (duk__debug_skip_dvalue(thr)) { - break; - } - } -} - -/* Read and validate a call stack index. If index is invalid, write out an - * error message and return zero. - */ -DUK_LOCAL duk_int32_t duk__debug_read_validate_csindex(duk_hthread *thr) { - duk_int32_t level; - level = duk_debug_read_int(thr); - if (level >= 0 || -level > (duk_int32_t) thr->callstack_top) { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); - return 0; /* zero indicates failure */ - } - return level; -} - -/* Read a call stack index and lookup the corresponding duk_activation. - * If index is invalid, write out an error message and return NULL. - */ -DUK_LOCAL duk_activation *duk__debug_read_level_get_activation(duk_hthread *thr) { - duk_activation *act; - duk_int32_t level; - - level = duk_debug_read_int(thr); - act = duk_hthread_get_activation_for_level(thr, level); - if (act == NULL) { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); - } - return act; -} - -/* - * Simple commands - */ - -DUK_LOCAL void duk__debug_handle_basic_info(duk_hthread *thr, duk_heap *heap) { - DUK_UNREF(heap); - DUK_D(DUK_DPRINT("debug command Version")); - - duk_debug_write_reply(thr); - duk_debug_write_int(thr, DUK_VERSION); - duk_debug_write_cstring(thr, DUK_GIT_DESCRIBE); - duk_debug_write_cstring(thr, DUK_USE_TARGET_INFO); -#if defined(DUK_USE_DOUBLE_LE) - duk_debug_write_int(thr, 1); -#elif defined(DUK_USE_DOUBLE_ME) - duk_debug_write_int(thr, 2); -#elif defined(DUK_USE_DOUBLE_BE) - duk_debug_write_int(thr, 3); -#else - duk_debug_write_int(thr, 0); -#endif - duk_debug_write_int(thr, (duk_int_t) sizeof(void *)); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_trigger_status(duk_hthread *thr, duk_heap *heap) { - DUK_UNREF(heap); - DUK_D(DUK_DPRINT("debug command TriggerStatus")); - - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); - heap->dbg_state_dirty = 1; -} - -DUK_LOCAL void duk__debug_handle_pause(duk_hthread *thr, duk_heap *heap) { - DUK_D(DUK_DPRINT("debug command Pause")); - duk_debug_set_paused(heap); - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_resume(duk_hthread *thr, duk_heap *heap) { - duk_small_uint_t pause_flags; - - DUK_D(DUK_DPRINT("debug command Resume")); - - duk_debug_clear_paused(heap); - - pause_flags = 0; -#if 0 /* manual testing */ - pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE; - pause_flags |= DUK_PAUSE_FLAG_CAUGHT_ERROR; - pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; -#endif -#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT) - pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; -#endif - - duk__debug_set_pause_state(thr, heap, pause_flags); - - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_step(duk_hthread *thr, duk_heap *heap, duk_int32_t cmd) { - duk_small_uint_t pause_flags; - - DUK_D(DUK_DPRINT("debug command StepInto/StepOver/StepOut: %d", (int) cmd)); - - if (cmd == DUK_DBG_CMD_STEPINTO) { - pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE | - DUK_PAUSE_FLAG_FUNC_ENTRY | - DUK_PAUSE_FLAG_FUNC_EXIT; - } else if (cmd == DUK_DBG_CMD_STEPOVER) { - pause_flags = DUK_PAUSE_FLAG_LINE_CHANGE | - DUK_PAUSE_FLAG_FUNC_EXIT; - } else { - DUK_ASSERT(cmd == DUK_DBG_CMD_STEPOUT); - pause_flags = DUK_PAUSE_FLAG_FUNC_EXIT; - } -#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT) - pause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR; -#endif - - /* If current activation doesn't have line information, line-based - * pause flags are automatically disabled. As a result, e.g. - * StepInto will then pause on (native) function entry or exit. - */ - duk_debug_clear_paused(heap); - duk__debug_set_pause_state(thr, heap, pause_flags); - - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_list_break(duk_hthread *thr, duk_heap *heap) { - duk_small_int_t i; - - DUK_D(DUK_DPRINT("debug command ListBreak")); - duk_debug_write_reply(thr); - for (i = 0; i < (duk_small_int_t) heap->dbg_breakpoint_count; i++) { - duk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename); - duk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line); - } - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_add_break(duk_hthread *thr, duk_heap *heap) { - duk_hstring *filename; - duk_uint32_t linenumber; - duk_small_int_t idx; - - DUK_UNREF(heap); - - filename = duk_debug_read_hstring(thr); - linenumber = (duk_uint32_t) duk_debug_read_int(thr); - DUK_D(DUK_DPRINT("debug command AddBreak: %!O:%ld", (duk_hobject *) filename, (long) linenumber)); - idx = duk_debug_add_breakpoint(thr, filename, linenumber); - if (idx >= 0) { - duk_debug_write_reply(thr); - duk_debug_write_int(thr, (duk_int32_t) idx); - duk_debug_write_eom(thr); - } else { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_TOOMANY, "no space for breakpoint"); - } -} - -DUK_LOCAL void duk__debug_handle_del_break(duk_hthread *thr, duk_heap *heap) { - duk_small_uint_t idx; - - DUK_UNREF(heap); - - DUK_D(DUK_DPRINT("debug command DelBreak")); - idx = (duk_small_uint_t) duk_debug_read_int(thr); - if (duk_debug_remove_breakpoint(thr, idx)) { - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); - } else { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid breakpoint index"); - } -} - -DUK_LOCAL void duk__debug_handle_get_var(duk_hthread *thr, duk_heap *heap) { - duk_activation *act; - duk_hstring *str; - duk_bool_t rc; - - DUK_UNREF(heap); - DUK_D(DUK_DPRINT("debug command GetVar")); - - act = duk__debug_read_level_get_activation(thr); - if (act == NULL) { - return; - } - str = duk_debug_read_hstring(thr); /* push to stack */ - DUK_ASSERT(str != NULL); - - rc = duk_js_getvar_activation(thr, act, str, 0); - - duk_debug_write_reply(thr); - if (rc) { - duk_debug_write_int(thr, 1); - DUK_ASSERT(duk_get_tval(thr, -2) != NULL); - duk_debug_write_tval(thr, duk_get_tval(thr, -2)); - } else { - duk_debug_write_int(thr, 0); - duk_debug_write_unused(thr); - } - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_put_var(duk_hthread *thr, duk_heap *heap) { - duk_activation *act; - duk_hstring *str; - duk_tval *tv; - - DUK_UNREF(heap); - DUK_D(DUK_DPRINT("debug command PutVar")); - - act = duk__debug_read_level_get_activation(thr); - if (act == NULL) { - return; - } - str = duk_debug_read_hstring(thr); /* push to stack */ - DUK_ASSERT(str != NULL); - tv = duk_debug_read_tval(thr); - if (tv == NULL) { - /* detached */ - return; - } - - duk_js_putvar_activation(thr, act, str, tv, 0); - - /* XXX: Current putvar implementation doesn't have a success flag, - * add one and send to debug client? - */ - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_get_call_stack(duk_hthread *thr, duk_heap *heap) { - duk_hthread *curr_thr = thr; - duk_activation *curr_act; - duk_uint_fast32_t pc; - duk_uint_fast32_t line; - - DUK_ASSERT(thr != NULL); - DUK_UNREF(heap); - - duk_debug_write_reply(thr); - while (curr_thr != NULL) { - for (curr_act = curr_thr->callstack_curr; curr_act != NULL; curr_act = curr_act->parent) { - /* PC/line semantics here are: - * - For callstack top we're conceptually between two - * opcodes and current PC indicates next line to - * execute, so report that (matches Status). - * - For other activations we're conceptually still - * executing the instruction at PC-1, so report that - * (matches error stacktrace behavior). - * - See: https://github.com/svaarala/duktape/issues/281 - */ - - /* XXX: optimize to use direct reads, i.e. avoid - * value stack operations. - */ - duk_push_tval(thr, &curr_act->tv_func); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); - duk__debug_write_hstring_safe_top(thr); - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); - duk__debug_write_hstring_safe_top(thr); - pc = duk_hthread_get_act_curr_pc(thr, curr_act); - if (curr_act != curr_thr->callstack_curr && pc > 0) { - pc--; - } - line = duk_hobject_pc2line_query(thr, -3, pc); - duk_debug_write_uint(thr, (duk_uint32_t) line); - duk_debug_write_uint(thr, (duk_uint32_t) pc); - duk_pop_3(thr); - } - curr_thr = curr_thr->resumer; - } - /* SCANBUILD: warning about 'thr' potentially being NULL here, - * warning is incorrect because thr != NULL always here. - */ - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_get_locals(duk_hthread *thr, duk_heap *heap) { - duk_activation *act; - duk_hstring *varname; - - DUK_UNREF(heap); - - act = duk__debug_read_level_get_activation(thr); - if (act == NULL) { - return; - } - - duk_debug_write_reply(thr); - - /* XXX: several nice-to-have improvements here: - * - Use direct reads avoiding value stack operations - * - Avoid triggering getters, indicate getter values to debug client - * - If side effects are possible, add error catching - */ - - duk_push_tval(thr, &act->tv_func); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VARMAP); - if (duk_is_object(thr, -1)) { - duk_enum(thr, -1, 0 /*enum_flags*/); - while (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) { - varname = duk_known_hstring(thr, -1); - - duk_js_getvar_activation(thr, act, varname, 0 /*throw_flag*/); - /* [ ... func varmap enum key value this ] */ - duk_debug_write_hstring(thr, duk_get_hstring(thr, -3)); - duk_debug_write_tval(thr, duk_get_tval(thr, -2)); - duk_pop_3(thr); /* -> [ ... func varmap enum ] */ - } - } else { - DUK_D(DUK_DPRINT("varmap is not an object in GetLocals, ignore")); - } - - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_eval(duk_hthread *thr, duk_heap *heap) { - duk_small_uint_t call_flags; - duk_int_t call_ret; - duk_small_int_t eval_err; - duk_bool_t direct_eval; - duk_int32_t level; - duk_idx_t idx_func; - - DUK_UNREF(heap); - - DUK_D(DUK_DPRINT("debug command Eval")); - - /* The eval code is executed within the lexical environment of a specified - * activation. For now, use global object eval() function, with the eval - * considered a 'direct call to eval'. - * - * Callstack index for debug commands only affects scope -- the callstack - * as seen by, e.g. Duktape.act() will be the same regardless. - */ - - /* nargs == 2 so we can pass a callstack index to eval(). */ - idx_func = duk_get_top(thr); - duk_push_c_function(thr, duk_bi_global_object_eval, 2 /*nargs*/); - duk_push_undefined(thr); /* 'this' binding shouldn't matter here */ - - /* Read callstack index, if non-null. */ - if (duk_debug_peek_byte(thr) == DUK_DBG_IB_NULL) { - direct_eval = 0; - level = -1; /* Not needed, but silences warning. */ - (void) duk_debug_read_byte(thr); - } else { - direct_eval = 1; - level = duk__debug_read_validate_csindex(thr); - if (level == 0) { - return; - } - } - - DUK_ASSERT(!direct_eval || - (level < 0 && -level <= (duk_int32_t) thr->callstack_top)); - - (void) duk_debug_read_hstring(thr); - if (direct_eval) { - duk_push_int(thr, level - 1); /* compensate for eval() call */ - } - - /* [ ... eval "eval" eval_input level? ] */ - - call_flags = 0; - if (direct_eval) { - duk_activation *act; - duk_hobject *fun; - - act = duk_hthread_get_activation_for_level(thr, level); - if (act != NULL) { - fun = DUK_ACT_GET_FUNC(act); - if (fun != NULL && DUK_HOBJECT_IS_COMPFUNC(fun)) { - /* Direct eval requires that there's a current - * activation and it is an Ecmascript function. - * When Eval is executed from e.g. cooperate API - * call we'll need to do an indirect eval instead. - */ - call_flags |= DUK_CALL_FLAG_DIRECT_EVAL; - } - } - } - - call_ret = duk_pcall_method_flags(thr, duk_get_top(thr) - (idx_func + 2), call_flags); - - if (call_ret == DUK_EXEC_SUCCESS) { - eval_err = 0; - /* Use result value as is. */ - } else { - /* For errors a string coerced result is most informative - * right now, as the debug client doesn't have the capability - * to traverse the error object. - */ - eval_err = 1; - duk_safe_to_string(thr, -1); - } - - /* [ ... result ] */ - - duk_debug_write_reply(thr); - duk_debug_write_int(thr, (duk_int32_t) eval_err); - DUK_ASSERT(duk_get_tval(thr, -1) != NULL); - duk_debug_write_tval(thr, duk_get_tval(thr, -1)); - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_detach(duk_hthread *thr, duk_heap *heap) { - DUK_UNREF(heap); - DUK_D(DUK_DPRINT("debug command Detach")); - - duk_debug_write_reply(thr); - duk_debug_write_eom(thr); - - DUK_D(DUK_DPRINT("debug connection detached, mark broken")); - DUK__SET_CONN_BROKEN(thr, 0); /* not an error */ -} - -DUK_LOCAL void duk__debug_handle_apprequest(duk_hthread *thr, duk_heap *heap) { - duk_idx_t old_top; - - DUK_D(DUK_DPRINT("debug command AppRequest")); - - old_top = duk_get_top(thr); /* save stack top */ - - if (heap->dbg_request_cb != NULL) { - duk_idx_t nrets; - duk_idx_t nvalues = 0; - duk_idx_t top, idx; - - /* Read tvals from the message and push them onto the valstack, - * then call the request callback to process the request. - */ - while (duk_debug_peek_byte(thr) != DUK_DBG_IB_EOM) { - duk_tval *tv; - if (!duk_check_stack(thr, 1)) { - DUK_D(DUK_DPRINT("failed to allocate space for request dvalue(s)")); - goto fail; - } - tv = duk_debug_read_tval(thr); /* push to stack */ - if (tv == NULL) { - /* detached */ - return; - } - nvalues++; - } - DUK_ASSERT(duk_get_top(thr) == old_top + nvalues); - - /* Request callback should push values for reply to client onto valstack */ - DUK_D(DUK_DPRINT("calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld", - (long) nvalues, (long) old_top, (long) duk_get_top(thr))); - nrets = heap->dbg_request_cb(thr, heap->dbg_udata, nvalues); - DUK_D(DUK_DPRINT("returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld", - (long) nvalues, (long) nrets, (long) old_top, (long) duk_get_top(thr))); - if (nrets >= 0) { - DUK_ASSERT(duk_get_top(thr) >= old_top + nrets); - if (duk_get_top(thr) < old_top + nrets) { - DUK_D(DUK_DPRINT("AppRequest callback doesn't match value stack configuration, " - "top=%ld < old_top=%ld + nrets=%ld; " - "this might mean it's unsafe to continue!", - (long) duk_get_top(thr), (long) old_top, (long) nrets)); - goto fail; - } - - /* Reply with tvals pushed by request callback */ - duk_debug_write_byte(thr, DUK_DBG_IB_REPLY); - top = duk_get_top(thr); - for (idx = top - nrets; idx < top; idx++) { - duk_debug_write_tval(thr, DUK_GET_TVAL_POSIDX(thr, idx)); - } - duk_debug_write_eom(thr); - } else { - DUK_ASSERT(duk_get_top(thr) >= old_top + 1); - if (duk_get_top(thr) < old_top + 1) { - DUK_D(DUK_DPRINT("request callback return value doesn't match value stack configuration")); - goto fail; - } - duk_debug_write_error_eom(thr, DUK_DBG_ERR_APPLICATION, duk_get_string(thr, -1)); - } - - duk_set_top(thr, old_top); /* restore stack top */ - } else { - DUK_D(DUK_DPRINT("no request callback, treat AppRequest as unsupported")); - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "AppRequest unsupported by target"); - } - - return; - - fail: - duk_set_top(thr, old_top); /* restore stack top */ - DUK__SET_CONN_BROKEN(thr, 1); -} - -/* - * DumpHeap command - */ - -#if defined(DUK_USE_DEBUGGER_DUMPHEAP) -/* XXX: this has some overlap with object inspection; remove this and make - * DumpHeap return lists of heapptrs instead? - */ -DUK_LOCAL void duk__debug_dump_heaphdr(duk_hthread *thr, duk_heap *heap, duk_heaphdr *hdr) { - DUK_UNREF(heap); - - duk_debug_write_heapptr(thr, hdr); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_TYPE(hdr)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_FLAGS_RAW(hdr)); -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_REFCOUNT(hdr)); -#else - duk_debug_write_int(thr, (duk_int32_t) -1); -#endif - - switch (DUK_HEAPHDR_GET_TYPE(hdr)) { - case DUK_HTYPE_STRING: { - duk_hstring *h = (duk_hstring *) hdr; - - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_BYTELEN(h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_CHARLEN(h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_HASH(h)); - duk_debug_write_hstring(thr, h); - break; - } - case DUK_HTYPE_OBJECT: { - duk_hobject *h = (duk_hobject *) hdr; - duk_hstring *k; - duk_uint_fast32_t i; - - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_CLASS_NUMBER(h)); - duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ESIZE(h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ENEXT(h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ASIZE(h)); - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_HSIZE(h)); - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_E_GET_FLAGS(heap, h, i)); - k = DUK_HOBJECT_E_GET_KEY(heap, h, i); - duk_debug_write_heapptr(thr, (duk_heaphdr *) k); - if (k == NULL) { - duk_debug_write_int(thr, 0); /* isAccessor */ - duk_debug_write_unused(thr); - continue; - } - if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) { - duk_debug_write_int(thr, 1); /* isAccessor */ - duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get); - duk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set); - } else { - duk_debug_write_int(thr, 0); /* isAccessor */ - - duk__debug_write_tval_heapptr(thr, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v); - } - } - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) { - /* Note: array dump will include elements beyond - * 'length'. - */ - duk__debug_write_tval_heapptr(thr, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)); - } - break; - } - case DUK_HTYPE_BUFFER: { - duk_hbuffer *h = (duk_hbuffer *) hdr; - - duk_debug_write_uint(thr, (duk_uint32_t) DUK_HBUFFER_GET_SIZE(h)); - duk_debug_write_buffer(thr, (const char *) DUK_HBUFFER_GET_DATA_PTR(heap, h), (duk_size_t) DUK_HBUFFER_GET_SIZE(h)); - break; - } - default: { - DUK_D(DUK_DPRINT("invalid htype: %d", (int) DUK_HEAPHDR_GET_TYPE(hdr))); - } - } -} - -DUK_LOCAL void duk__debug_dump_heap_allocated(duk_hthread *thr, duk_heap *heap) { - duk_heaphdr *hdr; - - hdr = heap->heap_allocated; - while (hdr != NULL) { - duk__debug_dump_heaphdr(thr, heap, hdr); - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } -} - -DUK_LOCAL void duk__debug_dump_strtab(duk_hthread *thr, duk_heap *heap) { - duk_uint32_t i; - duk_hstring *h; - - for (i = 0; i < heap->st_size; i++) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - h = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]); -#else - h = heap->strtable[i]; -#endif - while (h != NULL) { - duk__debug_dump_heaphdr(thr, heap, (duk_heaphdr *) h); - h = h->hdr.h_next; - } - } -} - -DUK_LOCAL void duk__debug_handle_dump_heap(duk_hthread *thr, duk_heap *heap) { - DUK_D(DUK_DPRINT("debug command DumpHeap")); - - duk_debug_write_reply(thr); - duk__debug_dump_heap_allocated(thr, heap); - duk__debug_dump_strtab(thr, heap); - duk_debug_write_eom(thr); -} -#endif /* DUK_USE_DEBUGGER_DUMPHEAP */ - -DUK_LOCAL void duk__debug_handle_get_bytecode(duk_hthread *thr, duk_heap *heap) { - duk_activation *act; - duk_hcompfunc *fun = NULL; - duk_size_t i, n; - duk_tval *tv; - duk_hobject **fn; - duk_int32_t level = -1; - duk_uint8_t ibyte; - - DUK_UNREF(heap); - - DUK_D(DUK_DPRINT("debug command GetBytecode")); - - ibyte = duk_debug_peek_byte(thr); - if (ibyte != DUK_DBG_IB_EOM) { - tv = duk_debug_read_tval(thr); - if (tv == NULL) { - /* detached */ - return; - } - if (DUK_TVAL_IS_OBJECT(tv)) { - /* tentative, checked later */ - fun = (duk_hcompfunc *) DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(fun != NULL); - } else if (DUK_TVAL_IS_NUMBER(tv)) { - level = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv); - } else { - DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!T", tv)); - goto fail_args; - } - } - - if (fun == NULL) { - act = duk_hthread_get_activation_for_level(thr, level); - if (act == NULL) { - goto fail_index; - } - fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - } - - if (fun == NULL || !DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)) { - DUK_D(DUK_DPRINT("invalid argument to GetBytecode: %!O", fun)); - goto fail_args; - } - DUK_ASSERT(fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)); - - duk_debug_write_reply(thr); - n = DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap, fun); - duk_debug_write_int(thr, (duk_int32_t) n); - tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, fun); - for (i = 0; i < n; i++) { - duk_debug_write_tval(thr, tv); - tv++; - } - n = DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap, fun); - duk_debug_write_int(thr, (duk_int32_t) n); - fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, fun); - for (i = 0; i < n; i++) { - duk_debug_write_hobject(thr, *fn); - fn++; - } - duk_debug_write_string(thr, - (const char *) DUK_HCOMPFUNC_GET_CODE_BASE(heap, fun), - (duk_size_t) DUK_HCOMPFUNC_GET_CODE_SIZE(heap, fun)); - duk_debug_write_eom(thr); - return; - - fail_args: - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid argument"); - return; - - fail_index: - duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "invalid callstack index"); - return; -} - -/* - * Object inspection commands: GetHeapObjInfo, GetObjPropDesc, - * GetObjPropDescRange - */ - -#if defined(DUK_USE_DEBUGGER_INSPECT) - -#if 0 /* pruned */ -DUK_LOCAL const char * const duk__debug_getinfo_heaphdr_keys[] = { - "reachable", - "temproot", - "finalizable", - "finalized", - "readonly" - /* NULL not needed here */ -}; -DUK_LOCAL duk_uint_t duk__debug_getinfo_heaphdr_masks[] = { - DUK_HEAPHDR_FLAG_REACHABLE, - DUK_HEAPHDR_FLAG_TEMPROOT, - DUK_HEAPHDR_FLAG_FINALIZABLE, - DUK_HEAPHDR_FLAG_FINALIZED, - DUK_HEAPHDR_FLAG_READONLY, - 0 /* terminator */ -}; -#endif -DUK_LOCAL const char * const duk__debug_getinfo_hstring_keys[] = { -#if 0 - "arridx", - "symbol", - "hidden", - "reserved_word", - "strict_reserved_word", - "eval_or_arguments", -#endif - "extdata" - /* NULL not needed here */ -}; -DUK_LOCAL duk_uint_t duk__debug_getinfo_hstring_masks[] = { -#if 0 - DUK_HSTRING_FLAG_ARRIDX, - DUK_HSTRING_FLAG_SYMBOL, - DUK_HSTRING_FLAG_HIDDEN, - DUK_HSTRING_FLAG_RESERVED_WORD, - DUK_HSTRING_FLAG_STRICT_RESERVED_WORD, - DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS, -#endif - DUK_HSTRING_FLAG_EXTDATA, - 0 /* terminator */ -}; -DUK_LOCAL const char * const duk__debug_getinfo_hobject_keys[] = { - "extensible", - "constructable", - "callable", - "boundfunc", - "compfunc", - "natfunc", - "bufobj", - "fastrefs", - "array_part", - "strict", - "notail", - "newenv", - "namebinding", - "createargs", - "have_finalizer", - "exotic_array", - "exotic_stringobj", - "exotic_arguments", - "exotic_proxyobj", - "special_call" - /* NULL not needed here */ -}; -DUK_LOCAL duk_uint_t duk__debug_getinfo_hobject_masks[] = { - DUK_HOBJECT_FLAG_EXTENSIBLE, - DUK_HOBJECT_FLAG_CONSTRUCTABLE, - DUK_HOBJECT_FLAG_CALLABLE, - DUK_HOBJECT_FLAG_BOUNDFUNC, - DUK_HOBJECT_FLAG_COMPFUNC, - DUK_HOBJECT_FLAG_NATFUNC, - DUK_HOBJECT_FLAG_BUFOBJ, - DUK_HOBJECT_FLAG_FASTREFS, - DUK_HOBJECT_FLAG_ARRAY_PART, - DUK_HOBJECT_FLAG_STRICT, - DUK_HOBJECT_FLAG_NOTAIL, - DUK_HOBJECT_FLAG_NEWENV, - DUK_HOBJECT_FLAG_NAMEBINDING, - DUK_HOBJECT_FLAG_CREATEARGS, - DUK_HOBJECT_FLAG_HAVE_FINALIZER, - DUK_HOBJECT_FLAG_EXOTIC_ARRAY, - DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ, - DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS, - DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ, - DUK_HOBJECT_FLAG_SPECIAL_CALL, - 0 /* terminator */ -}; -DUK_LOCAL const char * const duk__debug_getinfo_hbuffer_keys[] = { - "dynamic", - "external" - /* NULL not needed here */ -}; -DUK_LOCAL duk_uint_t duk__debug_getinfo_hbuffer_masks[] = { - DUK_HBUFFER_FLAG_DYNAMIC, - DUK_HBUFFER_FLAG_EXTERNAL, - 0 /* terminator */ -}; - -DUK_LOCAL void duk__debug_getinfo_flags_key(duk_hthread *thr, const char *key) { - duk_debug_write_uint(thr, 0); - duk_debug_write_cstring(thr, key); -} - -DUK_LOCAL void duk__debug_getinfo_prop_uint(duk_hthread *thr, const char *key, duk_uint_t val) { - duk_debug_write_uint(thr, 0); - duk_debug_write_cstring(thr, key); - duk_debug_write_uint(thr, val); -} - -DUK_LOCAL void duk__debug_getinfo_prop_int(duk_hthread *thr, const char *key, duk_int_t val) { - duk_debug_write_uint(thr, 0); - duk_debug_write_cstring(thr, key); - duk_debug_write_int(thr, val); -} - -DUK_LOCAL void duk__debug_getinfo_prop_bool(duk_hthread *thr, const char *key, duk_bool_t val) { - duk_debug_write_uint(thr, 0); - duk_debug_write_cstring(thr, key); - duk_debug_write_boolean(thr, val); -} - -DUK_LOCAL void duk__debug_getinfo_bitmask(duk_hthread *thr, const char * const * keys, duk_uint_t *masks, duk_uint_t flags) { - const char *key; - duk_uint_t mask; - - for (;;) { - mask = *masks++; - if (mask == 0) { - break; - } - key = *keys++; - DUK_ASSERT(key != NULL); - - DUK_DD(DUK_DDPRINT("inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx", key, (unsigned long) mask, (unsigned long) flags)); - duk__debug_getinfo_prop_bool(thr, key, flags & mask); - } -} - -/* Inspect a property using a virtual index into a conceptual property list - * consisting of (1) all array part items from [0,a_size[ (even when above - * .length) and (2) all entry part items from [0,e_next[. Unused slots are - * indicated using dvalue 'unused'. - */ -DUK_LOCAL duk_bool_t duk__debug_getprop_index(duk_hthread *thr, duk_heap *heap, duk_hobject *h_obj, duk_uint_t idx) { - duk_uint_t a_size; - duk_tval *tv; - duk_hstring *h_key; - duk_hobject *h_getset; - duk_uint_t flags; - - DUK_UNREF(heap); - - a_size = DUK_HOBJECT_GET_ASIZE(h_obj); - if (idx < a_size) { - duk_debug_write_uint(thr, DUK_PROPDESC_FLAGS_WEC); - duk_debug_write_uint(thr, idx); - tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, h_obj, idx); - duk_debug_write_tval(thr, tv); - return 1; - } - - idx -= a_size; - if (idx >= DUK_HOBJECT_GET_ENEXT(h_obj)) { - return 0; - } - - h_key = DUK_HOBJECT_E_GET_KEY(heap, h_obj, idx); - if (h_key == NULL) { - duk_debug_write_uint(thr, 0); - duk_debug_write_null(thr); - duk_debug_write_unused(thr); - return 1; - } - - flags = DUK_HOBJECT_E_GET_FLAGS(heap, h_obj, idx); - if (DUK_HSTRING_HAS_SYMBOL(h_key)) { - flags |= DUK_DBG_PROPFLAG_SYMBOL; - } - if (DUK_HSTRING_HAS_HIDDEN(h_key)) { - flags |= DUK_DBG_PROPFLAG_HIDDEN; - } - duk_debug_write_uint(thr, flags); - duk_debug_write_hstring(thr, h_key); - if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { - h_getset = DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h_obj, idx); - if (h_getset) { - duk_debug_write_hobject(thr, h_getset); - } else { - duk_debug_write_null(thr); - } - h_getset = DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h_obj, idx); - if (h_getset) { - duk_debug_write_hobject(thr, h_getset); - } else { - duk_debug_write_null(thr); - } - } else { - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h_obj, idx); - duk_debug_write_tval(thr, tv); - } - return 1; -} - -DUK_LOCAL void duk__debug_handle_get_heap_obj_info(duk_hthread *thr, duk_heap *heap) { - duk_heaphdr *h; - - DUK_D(DUK_DPRINT("debug command GetHeapObjInfo")); - DUK_UNREF(heap); - - DUK_ASSERT(sizeof(duk__debug_getinfo_hstring_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hstring_masks) / sizeof(duk_uint_t) - 1); - DUK_ASSERT(sizeof(duk__debug_getinfo_hobject_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hobject_masks) / sizeof(duk_uint_t) - 1); - DUK_ASSERT(sizeof(duk__debug_getinfo_hbuffer_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hbuffer_masks) / sizeof(duk_uint_t) - 1); - - h = duk_debug_read_any_ptr(thr); - if (!h) { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target"); - return; - } - - duk_debug_write_reply(thr); - - /* As with all inspection code, we rely on the debug client providing - * a valid, non-stale pointer: there's no portable way to safely - * validate the pointer here. - */ - - duk__debug_getinfo_flags_key(thr, "heapptr"); - duk_debug_write_heapptr(thr, h); - - /* XXX: comes out as signed now */ - duk__debug_getinfo_prop_uint(thr, "heaphdr_flags", (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h)); - duk__debug_getinfo_prop_uint(thr, "heaphdr_type", (duk_uint_t) DUK_HEAPHDR_GET_TYPE(h)); -#if defined(DUK_USE_REFERENCE_COUNTING) - duk__debug_getinfo_prop_uint(thr, "refcount", (duk_uint_t) DUK_HEAPHDR_GET_REFCOUNT(h)); -#endif -#if 0 /* pruned */ - duk__debug_getinfo_bitmask(thr, - duk__debug_getinfo_heaphdr_keys, - duk__debug_getinfo_heaphdr_masks, - DUK_HEAPHDR_GET_FLAGS_RAW(h)); -#endif - - switch (DUK_HEAPHDR_GET_TYPE(h)) { - case DUK_HTYPE_STRING: { - duk_hstring *h_str; - - h_str = (duk_hstring *) h; - duk__debug_getinfo_bitmask(thr, - duk__debug_getinfo_hstring_keys, - duk__debug_getinfo_hstring_masks, - DUK_HEAPHDR_GET_FLAGS_RAW(h)); - duk__debug_getinfo_prop_uint(thr, "bytelen", (duk_uint_t) DUK_HSTRING_GET_BYTELEN(h_str)); - duk__debug_getinfo_prop_uint(thr, "charlen", (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_str)); - duk__debug_getinfo_prop_uint(thr, "hash", (duk_uint_t) DUK_HSTRING_GET_HASH(h_str)); - duk__debug_getinfo_flags_key(thr, "data"); - duk_debug_write_hstring(thr, h_str); - break; - } - case DUK_HTYPE_OBJECT: { - duk_hobject *h_obj; - duk_hobject *h_proto; - - h_obj = (duk_hobject *) h; - h_proto = DUK_HOBJECT_GET_PROTOTYPE(heap, h_obj); - - /* duk_hobject specific fields. */ - duk__debug_getinfo_bitmask(thr, - duk__debug_getinfo_hobject_keys, - duk__debug_getinfo_hobject_masks, - DUK_HEAPHDR_GET_FLAGS_RAW(h)); - duk__debug_getinfo_prop_uint(thr, "class_number", DUK_HOBJECT_GET_CLASS_NUMBER(h_obj)); - duk__debug_getinfo_flags_key(thr, "class_name"); - duk_debug_write_hstring(thr, DUK_HOBJECT_GET_CLASS_STRING(heap, h_obj)); - duk__debug_getinfo_flags_key(thr, "prototype"); - if (h_proto != NULL) { - duk_debug_write_hobject(thr, h_proto); - } else { - duk_debug_write_null(thr); - } - duk__debug_getinfo_flags_key(thr, "props"); - duk_debug_write_pointer(thr, (void *) DUK_HOBJECT_GET_PROPS(heap, h_obj)); - duk__debug_getinfo_prop_uint(thr, "e_size", (duk_uint_t) DUK_HOBJECT_GET_ESIZE(h_obj)); - duk__debug_getinfo_prop_uint(thr, "e_next", (duk_uint_t) DUK_HOBJECT_GET_ENEXT(h_obj)); - duk__debug_getinfo_prop_uint(thr, "a_size", (duk_uint_t) DUK_HOBJECT_GET_ASIZE(h_obj)); - duk__debug_getinfo_prop_uint(thr, "h_size", (duk_uint_t) DUK_HOBJECT_GET_HSIZE(h_obj)); - - if (DUK_HOBJECT_IS_ARRAY(h_obj)) { - duk_harray *h_arr; - h_arr = (duk_harray *) h_obj; - - duk__debug_getinfo_prop_uint(thr, "length", (duk_uint_t) h_arr->length); - duk__debug_getinfo_prop_bool(thr, "length_nonwritable", h_arr->length_nonwritable); - } - - if (DUK_HOBJECT_IS_NATFUNC(h_obj)) { - duk_hnatfunc *h_fun; - h_fun = (duk_hnatfunc *) h_obj; - - duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs); - duk__debug_getinfo_prop_int(thr, "magic", h_fun->magic); - duk__debug_getinfo_prop_bool(thr, "varargs", h_fun->magic == DUK_HNATFUNC_NARGS_VARARGS); - /* Native function pointer may be different from a void pointer, - * and we serialize it from memory directly now (no byte swapping etc). - */ - duk__debug_getinfo_flags_key(thr, "funcptr"); - duk_debug_write_buffer(thr, (const char *) &h_fun->func, sizeof(h_fun->func)); - } - - if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) { - duk_hcompfunc *h_fun; - duk_hbuffer *h_buf; - duk_hobject *h_lexenv; - duk_hobject *h_varenv; - h_fun = (duk_hcompfunc *) h_obj; - - duk__debug_getinfo_prop_int(thr, "nregs", h_fun->nregs); - duk__debug_getinfo_prop_int(thr, "nargs", h_fun->nargs); - - duk__debug_getinfo_flags_key(thr, "lex_env"); - h_lexenv = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, h_fun); - if (h_lexenv != NULL) { - duk_debug_write_hobject(thr, h_lexenv); - } else { - duk_debug_write_null(thr); - } - duk__debug_getinfo_flags_key(thr, "var_env"); - h_varenv = DUK_HCOMPFUNC_GET_VARENV(thr->heap, h_fun); - if (h_varenv != NULL) { - duk_debug_write_hobject(thr, h_varenv); - } else { - duk_debug_write_null(thr); - } - - duk__debug_getinfo_prop_uint(thr, "start_line", h_fun->start_line); - duk__debug_getinfo_prop_uint(thr, "end_line", h_fun->end_line); - h_buf = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun); - if (h_buf != NULL) { - duk__debug_getinfo_flags_key(thr, "data"); - duk_debug_write_heapptr(thr, (duk_heaphdr *) h_buf); - } - } - - if (DUK_HOBJECT_IS_BOUNDFUNC(h_obj)) { - duk_hboundfunc *h_bfun; - h_bfun = (duk_hboundfunc *) h_obj; - - duk__debug_getinfo_flags_key(thr, "target"); - duk_debug_write_tval(thr, &h_bfun->target); - duk__debug_getinfo_flags_key(thr, "this_binding"); - duk_debug_write_tval(thr, &h_bfun->this_binding); - duk__debug_getinfo_flags_key(thr, "nargs"); - duk_debug_write_int(thr, h_bfun->nargs); - /* h_bfun->args not exposed now */ - } - - if (DUK_HOBJECT_IS_THREAD(h_obj)) { - /* XXX: Currently no inspection of threads, e.g. value stack, call - * stack, catch stack, etc. - */ - duk_hthread *h_thr; - h_thr = (duk_hthread *) h_obj; - DUK_UNREF(h_thr); - } - - if (DUK_HOBJECT_IS_DECENV(h_obj)) { - duk_hdecenv *h_env; - h_env = (duk_hdecenv *) h_obj; - - duk__debug_getinfo_flags_key(thr, "thread"); - duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->thread)); - duk__debug_getinfo_flags_key(thr, "varmap"); - duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->varmap)); - duk__debug_getinfo_prop_uint(thr, "regbase", (duk_uint_t) h_env->regbase_byteoff); - } - - if (DUK_HOBJECT_IS_OBJENV(h_obj)) { - duk_hobjenv *h_env; - h_env = (duk_hobjenv *) h_obj; - - duk__debug_getinfo_flags_key(thr, "target"); - duk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->target)); - duk__debug_getinfo_prop_bool(thr, "has_this", h_env->has_this); - } - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) { - duk_hbufobj *h_bufobj; - h_bufobj = (duk_hbufobj *) h_obj; - - duk__debug_getinfo_prop_uint(thr, "slice_offset", h_bufobj->offset); - duk__debug_getinfo_prop_uint(thr, "slice_length", h_bufobj->length); - duk__debug_getinfo_prop_uint(thr, "elem_shift", (duk_uint_t) h_bufobj->shift); - duk__debug_getinfo_prop_uint(thr, "elem_type", (duk_uint_t) h_bufobj->elem_type); - duk__debug_getinfo_prop_bool(thr, "is_typedarray", (duk_uint_t) h_bufobj->is_typedarray); - if (h_bufobj->buf != NULL) { - duk__debug_getinfo_flags_key(thr, "buffer"); - duk_debug_write_heapptr(thr, (duk_heaphdr *) h_bufobj->buf); - } - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - break; - } - case DUK_HTYPE_BUFFER: { - duk_hbuffer *h_buf; - - h_buf = (duk_hbuffer *) h; - duk__debug_getinfo_bitmask(thr, - duk__debug_getinfo_hbuffer_keys, - duk__debug_getinfo_hbuffer_masks, - DUK_HEAPHDR_GET_FLAGS_RAW(h)); - duk__debug_getinfo_prop_uint(thr, "size", (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf)); - duk__debug_getinfo_flags_key(thr, "dataptr"); - duk_debug_write_pointer(thr, (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf)); - duk__debug_getinfo_flags_key(thr, "data"); - duk_debug_write_hbuffer(thr, h_buf); /* tolerates NULL h_buf */ - break; - } - default: { - /* Since we already started writing the reply, just emit nothing. */ - DUK_D(DUK_DPRINT("inspect target pointer has invalid heaphdr type")); - } - } - - duk_debug_write_eom(thr); -} - -DUK_LOCAL void duk__debug_handle_get_obj_prop_desc(duk_hthread *thr, duk_heap *heap) { - duk_heaphdr *h; - duk_hobject *h_obj; - duk_hstring *h_key; - duk_propdesc desc; - - DUK_D(DUK_DPRINT("debug command GetObjPropDesc")); - DUK_UNREF(heap); - - h = duk_debug_read_any_ptr(thr); - if (!h) { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid target"); - return; - } - h_key = duk_debug_read_hstring(thr); - if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT || h_key == NULL) { - goto fail_args; - } - h_obj = (duk_hobject *) h; - - if (duk_hobject_get_own_propdesc(thr, h_obj, h_key, &desc, 0 /*flags*/)) { - duk_int_t virtual_idx; - duk_bool_t rc; - - /* To use the shared helper need the virtual index. */ - DUK_ASSERT(desc.e_idx >= 0 || desc.a_idx >= 0); - virtual_idx = (desc.a_idx >= 0 ? desc.a_idx : - (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj) + desc.e_idx); - - duk_debug_write_reply(thr); - rc = duk__debug_getprop_index(thr, heap, h_obj, (duk_uint_t) virtual_idx); - DUK_ASSERT(rc == 1); - DUK_UNREF(rc); - duk_debug_write_eom(thr); - } else { - duk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, "not found"); - } - return; - - fail_args: - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args"); -} - -DUK_LOCAL void duk__debug_handle_get_obj_prop_desc_range(duk_hthread *thr, duk_heap *heap) { - duk_heaphdr *h; - duk_hobject *h_obj; - duk_uint_t idx, idx_start, idx_end; - - DUK_D(DUK_DPRINT("debug command GetObjPropDescRange")); - DUK_UNREF(heap); - - h = duk_debug_read_any_ptr(thr); - idx_start = (duk_uint_t) duk_debug_read_int(thr); - idx_end = (duk_uint_t) duk_debug_read_int(thr); - if (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT) { - goto fail_args; - } - h_obj = (duk_hobject *) h; - - /* The index range space is conceptually the array part followed by the - * entry part. Unlike normal enumeration all slots are exposed here as - * is and return 'unused' if the slots are not in active use. In particular - * the array part is included for the full a_size regardless of what the - * array .length is. - */ - - duk_debug_write_reply(thr); - for (idx = idx_start; idx < idx_end; idx++) { - if (!duk__debug_getprop_index(thr, heap, h_obj, idx)) { - break; - } - } - duk_debug_write_eom(thr); - return; - - fail_args: - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, "invalid args"); -} - -#endif /* DUK_USE_DEBUGGER_INSPECT */ - -/* - * Process incoming debug requests - * - * Individual request handlers can push temporaries on the value stack and - * rely on duk__debug_process_message() to restore the value stack top - * automatically. - */ - -/* Process one debug message. Automatically restore value stack top to its - * entry value, so that individual message handlers don't need exact value - * stack handling which is convenient. - */ -DUK_LOCAL void duk__debug_process_message(duk_hthread *thr) { - duk_heap *heap; - duk_uint8_t x; - duk_int32_t cmd; - duk_idx_t entry_top; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - entry_top = duk_get_top(thr); - - x = duk_debug_read_byte(thr); - switch (x) { - case DUK_DBG_IB_REQUEST: { - cmd = duk_debug_read_int(thr); - switch (cmd) { - case DUK_DBG_CMD_BASICINFO: { - duk__debug_handle_basic_info(thr, heap); - break; - } - case DUK_DBG_CMD_TRIGGERSTATUS: { - duk__debug_handle_trigger_status(thr, heap); - break; - } - case DUK_DBG_CMD_PAUSE: { - duk__debug_handle_pause(thr, heap); - break; - } - case DUK_DBG_CMD_RESUME: { - duk__debug_handle_resume(thr, heap); - break; - } - case DUK_DBG_CMD_STEPINTO: - case DUK_DBG_CMD_STEPOVER: - case DUK_DBG_CMD_STEPOUT: { - duk__debug_handle_step(thr, heap, cmd); - break; - } - case DUK_DBG_CMD_LISTBREAK: { - duk__debug_handle_list_break(thr, heap); - break; - } - case DUK_DBG_CMD_ADDBREAK: { - duk__debug_handle_add_break(thr, heap); - break; - } - case DUK_DBG_CMD_DELBREAK: { - duk__debug_handle_del_break(thr, heap); - break; - } - case DUK_DBG_CMD_GETVAR: { - duk__debug_handle_get_var(thr, heap); - break; - } - case DUK_DBG_CMD_PUTVAR: { - duk__debug_handle_put_var(thr, heap); - break; - } - case DUK_DBG_CMD_GETCALLSTACK: { - duk__debug_handle_get_call_stack(thr, heap); - break; - } - case DUK_DBG_CMD_GETLOCALS: { - duk__debug_handle_get_locals(thr, heap); - break; - } - case DUK_DBG_CMD_EVAL: { - duk__debug_handle_eval(thr, heap); - break; - } - case DUK_DBG_CMD_DETACH: { - /* The actual detached_cb call is postponed to message loop so - * we don't need any special precautions here (just skip to EOM - * on the already closed connection). - */ - duk__debug_handle_detach(thr, heap); - break; - } -#if defined(DUK_USE_DEBUGGER_DUMPHEAP) - case DUK_DBG_CMD_DUMPHEAP: { - duk__debug_handle_dump_heap(thr, heap); - break; - } -#endif /* DUK_USE_DEBUGGER_DUMPHEAP */ - case DUK_DBG_CMD_GETBYTECODE: { - duk__debug_handle_get_bytecode(thr, heap); - break; - } - case DUK_DBG_CMD_APPREQUEST: { - duk__debug_handle_apprequest(thr, heap); - break; - } -#if defined(DUK_USE_DEBUGGER_INSPECT) - case DUK_DBG_CMD_GETHEAPOBJINFO: { - duk__debug_handle_get_heap_obj_info(thr, heap); - break; - } - case DUK_DBG_CMD_GETOBJPROPDESC: { - duk__debug_handle_get_obj_prop_desc(thr, heap); - break; - } - case DUK_DBG_CMD_GETOBJPROPDESCRANGE: { - duk__debug_handle_get_obj_prop_desc_range(thr, heap); - break; - } -#endif /* DUK_USE_DEBUGGER_INSPECT */ - default: { - DUK_D(DUK_DPRINT("debug command unsupported: %d", (int) cmd)); - duk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, "unsupported command"); - } - } /* switch cmd */ - break; - } - case DUK_DBG_IB_REPLY: { - DUK_D(DUK_DPRINT("debug reply, skipping")); - break; - } - case DUK_DBG_IB_ERROR: { - DUK_D(DUK_DPRINT("debug error, skipping")); - break; - } - case DUK_DBG_IB_NOTIFY: { - DUK_D(DUK_DPRINT("debug notify, skipping")); - break; - } - default: { - DUK_D(DUK_DPRINT("invalid initial byte, drop connection: %d", (int) x)); - goto fail; - } - } /* switch initial byte */ - - DUK_ASSERT(duk_get_top(thr) >= entry_top); - duk_set_top(thr, entry_top); - duk__debug_skip_to_eom(thr); - return; - - fail: - DUK_ASSERT(duk_get_top(thr) >= entry_top); - duk_set_top(thr, entry_top); - DUK__SET_CONN_BROKEN(thr, 1); - return; -} - -DUK_LOCAL void duk__check_resend_status(duk_hthread *thr) { - if (thr->heap->dbg_read_cb != NULL && thr->heap->dbg_state_dirty) { - duk_debug_send_status(thr); - thr->heap->dbg_state_dirty = 0; - } -} - -DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) { -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t entry_top; -#endif - duk_bool_t retval = 0; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); -#if defined(DUK_USE_ASSERTIONS) - entry_top = duk_get_top(thr); -#endif - - DUK_D(DUK_DPRINT("process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld", - thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) no_block, - (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing)); - DUK_DD(DUK_DDPRINT("top at entry: %ld", (long) duk_get_top(thr))); - - /* thr->heap->dbg_detaching may be != 0 if a debugger write outside - * the message loop caused a transport error and detach1() to run. - */ - DUK_ASSERT(thr->heap->dbg_detaching == 0 || thr->heap->dbg_detaching == 1); - DUK_ASSERT(thr->heap->dbg_processing == 0); - thr->heap->dbg_processing = 1; - - /* Ensure dirty state causes a Status even if never process any - * messages. This is expected by the bytecode executor when in - * the running state. - */ - duk__check_resend_status(thr); - - for (;;) { - /* Process messages until we're no longer paused or we peek - * and see there's nothing to read right now. - */ - DUK_DD(DUK_DDPRINT("top at loop top: %ld", (long) duk_get_top(thr))); - DUK_ASSERT(thr->heap->dbg_processing == 1); - - while (thr->heap->dbg_read_cb == NULL && thr->heap->dbg_detaching) { - /* Detach is pending; can be triggered from outside the - * debugger loop (e.g. Status notify write error) or by - * previous message handling. Call detached callback - * here, in a controlled state, to ensure a possible - * reattach inside the detached_cb is handled correctly. - * - * Recheck for detach in a while loop: an immediate - * reattach involves a call to duk_debugger_attach() - * which writes a debugger handshake line immediately - * inside the API call. If the transport write fails - * for that handshake, we can immediately end up in a - * "transport broken, detaching" case several times here. - * Loop back until we're either cleanly attached or - * fully detached. - * - * NOTE: Reset dbg_processing = 1 forcibly, in case we - * re-attached; duk_debugger_attach() sets dbg_processing - * to 0 at the moment. - */ - - DUK_D(DUK_DPRINT("detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2")); - - duk__debug_do_detach2(thr->heap); - thr->heap->dbg_processing = 1; /* may be set to 0 by duk_debugger_attach() inside callback */ - - DUK_D(DUK_DPRINT("after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld", - thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) thr->heap->dbg_detaching)); - } - DUK_ASSERT(thr->heap->dbg_detaching == 0); /* true even with reattach */ - DUK_ASSERT(thr->heap->dbg_processing == 1); /* even after a detach and possible reattach */ - - if (thr->heap->dbg_read_cb == NULL) { - DUK_D(DUK_DPRINT("debug connection broken (and not detaching), stop processing messages")); - break; - } - - if (!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || no_block) { - if (!duk_debug_read_peek(thr)) { - /* Note: peek cannot currently trigger a detach - * so the dbg_detaching == 0 assert outside the - * loop is correct. - */ - DUK_D(DUK_DPRINT("processing debug message, peek indicated no data, stop processing messages")); - break; - } - DUK_D(DUK_DPRINT("processing debug message, peek indicated there is data, handle it")); - } else { - DUK_D(DUK_DPRINT("paused, process debug message, blocking if necessary")); - } - - duk__check_resend_status(thr); - duk__debug_process_message(thr); - duk__check_resend_status(thr); - - retval = 1; /* processed one or more messages */ - } - - DUK_ASSERT(thr->heap->dbg_detaching == 0); - DUK_ASSERT(thr->heap->dbg_processing == 1); - thr->heap->dbg_processing = 0; - - /* As an initial implementation, read flush after exiting the message - * loop. If transport is broken, this is a no-op (with debug logs). - */ - duk_debug_read_flush(thr); /* this cannot initiate a detach */ - DUK_ASSERT(thr->heap->dbg_detaching == 0); - - DUK_DD(DUK_DDPRINT("top at exit: %ld", (long) duk_get_top(thr))); - -#if defined(DUK_USE_ASSERTIONS) - /* Easy to get wrong, so assert for it. */ - DUK_ASSERT(entry_top == duk_get_top(thr)); -#endif - - return retval; -} - -/* - * Halt execution helper - */ - -/* Halt execution and enter a debugger message loop until execution is resumed - * by the client. PC for the current activation may be temporarily decremented - * so that the "current" instruction will be shown by the client. This helper - * is callable from anywhere, also outside bytecode executor. - */ - -DUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc) { - duk_activation *act; - duk_hcompfunc *fun; - duk_instr_t *old_pc = NULL; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(duk_debug_is_attached(thr->heap)); - DUK_ASSERT(thr->heap->dbg_processing == 0); - DUK_ASSERT(!duk_debug_is_paused(thr->heap)); - - duk_debug_set_paused(thr->heap); - - act = thr->callstack_curr; - - /* NOTE: act may be NULL if an error is thrown outside of any activation, - * which may happen in the case of, e.g. syntax errors. - */ - - /* Decrement PC if that was requested, this requires a PC sync. */ - if (act != NULL) { - duk_hthread_sync_currpc(thr); - old_pc = act->curr_pc; - fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - - /* Short circuit if is safe: if act->curr_pc != NULL, 'fun' is - * guaranteed to be a non-NULL Ecmascript function. - */ - DUK_ASSERT(act->curr_pc == NULL || - (fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun))); - if (use_prev_pc && - act->curr_pc != NULL && - act->curr_pc > DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, fun)) { - act->curr_pc--; - } - } - - /* Process debug messages until we are no longer paused. */ - - /* NOTE: This is a bit fragile. It's important to ensure that - * duk_debug_process_messages() never throws an error or - * act->curr_pc will never be reset. - */ - - thr->heap->dbg_state_dirty = 1; - while (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) { - DUK_ASSERT(duk_debug_is_attached(thr->heap)); - DUK_ASSERT(thr->heap->dbg_processing == 0); - duk_debug_process_messages(thr, 0 /*no_block*/); - } - - /* XXX: Decrementing and restoring act->curr_pc works now, but if the - * debugger message loop gains the ability to adjust the current PC - * (e.g. a forced jump) restoring the PC here will break. Another - * approach would be to use a state flag for the "decrement 1 from - * topmost activation's PC" and take it into account whenever dealing - * with PC values. - */ - if (act != NULL) { - act->curr_pc = old_pc; /* restore PC */ - } -} - -/* - * Breakpoint management - */ - -DUK_INTERNAL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line) { - duk_heap *heap; - duk_breakpoint *b; - - /* Caller must trigger recomputation of active breakpoint list. To - * ensure stale values are not used if that doesn't happen, clear the - * active breakpoint list here. - */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(filename != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - - if (heap->dbg_breakpoint_count >= DUK_HEAP_MAX_BREAKPOINTS) { - DUK_D(DUK_DPRINT("failed to add breakpoint for %O:%ld, all breakpoint slots used", - (duk_heaphdr *) filename, (long) line)); - return -1; - } - heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; - b = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++); - b->filename = filename; - b->line = line; - DUK_HSTRING_INCREF(thr, filename); - - return (duk_small_int_t) (heap->dbg_breakpoint_count - 1); /* index */ -} - -DUK_INTERNAL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index) { - duk_heap *heap; - duk_hstring *h; - duk_breakpoint *b; - duk_size_t move_size; - - /* Caller must trigger recomputation of active breakpoint list. To - * ensure stale values are not used if that doesn't happen, clear the - * active breakpoint list here. - */ - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - DUK_ASSERT(duk_debug_is_attached(thr->heap)); - DUK_ASSERT_DISABLE(breakpoint_index >= 0); /* unsigned */ - - if (breakpoint_index >= heap->dbg_breakpoint_count) { - DUK_D(DUK_DPRINT("invalid breakpoint index: %ld", (long) breakpoint_index)); - return 0; - } - b = heap->dbg_breakpoints + breakpoint_index; - - h = b->filename; - DUK_ASSERT(h != NULL); - - move_size = sizeof(duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1); - if (move_size > 0) { - DUK_MEMMOVE((void *) b, - (const void *) (b + 1), - (size_t) move_size); - } - heap->dbg_breakpoint_count--; - heap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL; - - DUK_HSTRING_DECREF(thr, h); /* side effects */ - DUK_UNREF(h); /* w/o refcounting */ - - /* Breakpoint entries above the used area are left as garbage. */ - - return 1; -} - -/* - * Misc state management - */ - -DUK_INTERNAL duk_bool_t duk_debug_is_attached(duk_heap *heap) { - return (heap->dbg_read_cb != NULL); -} - -DUK_INTERNAL duk_bool_t duk_debug_is_paused(duk_heap *heap) { - return (DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) != 0); -} - -DUK_INTERNAL void duk_debug_set_paused(duk_heap *heap) { - if (duk_debug_is_paused(heap)) { - DUK_D(DUK_DPRINT("trying to set paused state when already paused, ignoring")); - } else { - DUK_HEAP_SET_DEBUGGER_PAUSED(heap); - heap->dbg_state_dirty = 1; - duk_debug_clear_pause_state(heap); - DUK_ASSERT(heap->ms_running == 0); /* debugger can't be triggered within mark-and-sweep */ - heap->ms_running = 1; /* prevent mark-and-sweep, prevent refzero queueing */ - heap->ms_prevent_count++; - DUK_ASSERT(heap->ms_prevent_count != 0); /* Wrap. */ - DUK_ASSERT(heap->heap_thread != NULL); - } -} - -DUK_INTERNAL void duk_debug_clear_paused(duk_heap *heap) { - if (duk_debug_is_paused(heap)) { - DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap); - heap->dbg_state_dirty = 1; - duk_debug_clear_pause_state(heap); - DUK_ASSERT(heap->ms_running == 1); - DUK_ASSERT(heap->ms_prevent_count > 0); - heap->ms_prevent_count--; - heap->ms_running = 0; - DUK_ASSERT(heap->heap_thread != NULL); - } else { - DUK_D(DUK_DPRINT("trying to clear paused state when not paused, ignoring")); - } -} - -DUK_INTERNAL void duk_debug_clear_pause_state(duk_heap *heap) { - heap->dbg_pause_flags = 0; - heap->dbg_pause_act = NULL; - heap->dbg_pause_startline = 0; -} - -#else /* DUK_USE_DEBUGGER_SUPPORT */ - -/* No debugger support. */ - -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -/* automatic undefs */ -#undef DUK__DBG_TPORT_ENTER -#undef DUK__DBG_TPORT_EXIT -#undef DUK__SET_CONN_BROKEN -#line 1 "duk_error_augment.c" -/* - * Augmenting errors at their creation site and their throw site. - * - * When errors are created, traceback data is added by built-in code - * and a user error handler (if defined) can process or replace the - * error. Similarly, when errors are thrown, a user error handler - * (if defined) can process or replace the error. - * - * Augmentation and other processing at error creation time is nice - * because an error is only created once, but it may be thrown and - * rethrown multiple times. User error handler registered for processing - * an error at its throw site must be careful to handle rethrowing in - * a useful manner. - * - * Error augmentation may throw an internal error (e.g. alloc error). - * - * Ecmascript allows throwing any values, so all values cannot be - * augmented. Currently, the built-in augmentation at error creation - * only augments error values which are Error instances (= have the - * built-in Error.prototype in their prototype chain) and are also - * extensible. User error handlers have no limitations in this respect. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Helper for calling a user error handler. - * - * 'thr' must be the currently active thread; the error handler is called - * in its context. The valstack of 'thr' must have the error value on - * top, and will be replaced by another error value based on the return - * value of the error handler. - * - * The helper calls duk_handle_call() recursively in protected mode. - * Before that call happens, no longjmps should happen; as a consequence, - * we must assume that the valstack contains enough temporary space for - * arguments and such. - * - * While the error handler runs, any errors thrown will not trigger a - * recursive error handler call (this is implemented using a heap level - * flag which will "follow" through any coroutines resumed inside the - * error handler). If the error handler is not callable or throws an - * error, the resulting error replaces the original error (for Duktape - * internal errors, duk_error_throw.c further substitutes this error with - * a DoubleError which is not ideal). This would be easy to change and - * even signal to the caller. - * - * The user error handler is stored in 'Duktape.errCreate' or - * 'Duktape.errThrow' depending on whether we're augmenting the error at - * creation or throw time. There are several alternatives to this approach, - * see doc/error-objects.rst for discussion. - * - * Note: since further longjmp()s may occur while calling the error handler - * (for many reasons, e.g. a labeled 'break' inside the handler), the - * caller can make no assumptions on the thr->heap->lj state after the - * call (this affects especially duk_error_throw.c). This is not an issue - * as long as the caller writes to the lj state only after the error handler - * finishes. - */ - -#if defined(DUK_USE_ERRTHROW) || defined(DUK_USE_ERRCREATE) -DUK_LOCAL void duk__err_augment_user(duk_hthread *thr, duk_small_uint_t stridx_cb) { - duk_tval *tv_hnd; - duk_int_t rc; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT_STRIDX_VALID(stridx_cb); - - if (thr->heap->augmenting_error) { - DUK_D(DUK_DPRINT("recursive call to error augmentation, ignore")); - return; - } - - /* - * Check whether or not we have an error handler. - * - * We must be careful of not triggering an error when looking up the - * property. For instance, if the property is a getter, we don't want - * to call it, only plain values are allowed. The value, if it exists, - * is not checked. If the value is not a function, a TypeError happens - * when it is called and that error replaces the original one. - */ - - DUK_ASSERT_VALSTACK_SPACE(thr, 4); /* 3 entries actually needed below */ - - /* [ ... errval ] */ - - if (thr->builtins[DUK_BIDX_DUKTAPE] == NULL) { - /* When creating built-ins, some of the built-ins may not be set - * and we want to tolerate that when throwing errors. - */ - DUK_DD(DUK_DDPRINT("error occurred when DUK_BIDX_DUKTAPE is NULL, ignoring")); - return; - } - tv_hnd = duk_hobject_find_existing_entry_tval_ptr(thr->heap, - thr->builtins[DUK_BIDX_DUKTAPE], - DUK_HTHREAD_GET_STRING(thr, stridx_cb)); - if (tv_hnd == NULL) { - DUK_DD(DUK_DDPRINT("error handler does not exist or is not a plain value: %!T", - (duk_tval *) tv_hnd)); - return; - } - DUK_DDD(DUK_DDDPRINT("error handler dump (callability not checked): %!T", - (duk_tval *) tv_hnd)); - duk_push_tval(thr, tv_hnd); - - /* [ ... errval errhandler ] */ - - duk_insert(thr, -2); /* -> [ ... errhandler errval ] */ - duk_push_undefined(thr); - duk_insert(thr, -2); /* -> [ ... errhandler undefined(= this) errval ] */ - - /* [ ... errhandler undefined errval ] */ - - /* - * heap->augmenting_error prevents recursive re-entry and also causes - * call handling to use a larger (but not unbounded) call stack limit - * for the duration of error augmentation. - * - * We ignore errors now: a success return and an error value both - * replace the original error value. (This would be easy to change.) - */ - - DUK_ASSERT(thr->heap->augmenting_error == 0); - thr->heap->augmenting_error = 1; - - rc = duk_pcall_method(thr, 1); - DUK_UNREF(rc); /* no need to check now: both success and error are OK */ - - DUK_ASSERT(thr->heap->augmenting_error == 1); - thr->heap->augmenting_error = 0; - - /* [ ... errval ] */ -} -#endif /* DUK_USE_ERRTHROW || DUK_USE_ERRCREATE */ - -/* - * Add ._Tracedata to an error on the stack top. - */ - -#if defined(DUK_USE_TRACEBACKS) -DUK_LOCAL void duk__add_traceback(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { - duk_activation *act; - duk_int_t depth; - duk_int_t arr_size; - duk_tval *tv; - duk_hstring *s; - duk_uint32_t u32; - duk_double_t d; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr_callstack != NULL); - - /* [ ... error ] */ - - /* - * The traceback format is pretty arcane in an attempt to keep it compact - * and cheap to create. It may change arbitrarily from version to version. - * It should be decoded/accessed through version specific accessors only. - * - * See doc/error-objects.rst. - */ - - DUK_DDD(DUK_DDDPRINT("adding traceback to object: %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - /* Preallocate array to correct size, so that we can just write out - * the _Tracedata values into the array part. - */ - act = thr->callstack_curr; - depth = DUK_USE_TRACEBACK_DEPTH; - DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */ - if (depth > (duk_int_t) thr_callstack->callstack_top) { - depth = (duk_int_t) thr_callstack->callstack_top; - } - if (depth > 0) { - if (flags & DUK_AUGMENT_FLAG_SKIP_ONE) { - DUK_ASSERT(act != NULL); - act = act->parent; - depth--; - } - } - arr_size = depth * 2; - if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { - arr_size += 2; - } - if (c_filename) { - /* We need the C filename to be interned before getting the - * array part pointer to avoid any GC interference while the - * array part is populated. - */ - duk_push_string(thr, c_filename); - arr_size += 2; - } - - /* XXX: uninitialized would be OK */ - DUK_D(DUK_DPRINT("preallocated _Tracedata to %ld items", (long) arr_size)); - tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) arr_size); - DUK_ASSERT(arr_size == 0 || tv != NULL); - - /* Compiler SyntaxErrors (and other errors) come first, and are - * blamed by default (not flagged "noblame"). - */ - if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { - s = thr->compile_ctx->h_filename; - DUK_TVAL_SET_STRING(tv, s); - DUK_HSTRING_INCREF(thr, s); - tv++; - - u32 = (duk_uint32_t) thr->compile_ctx->curr_token.start_line; /* (flags<<32) + (line), flags = 0 */ - DUK_TVAL_SET_U32(tv, u32); - tv++; - } - - /* Filename/line from C macros (__FILE__, __LINE__) are added as an - * entry with a special format: (string, number). The number contains - * the line and flags. - */ - - /* [ ... error c_filename? arr ] */ - - if (c_filename) { - DUK_ASSERT(DUK_TVAL_IS_STRING(thr->valstack_top - 2)); - s = DUK_TVAL_GET_STRING(thr->valstack_top - 2); /* interned c_filename */ - DUK_ASSERT(s != NULL); - DUK_TVAL_SET_STRING(tv, s); - DUK_HSTRING_INCREF(thr, s); - tv++; - - d = ((flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) ? ((duk_double_t) DUK_TB_FLAG_NOBLAME_FILELINE) * DUK_DOUBLE_2TO32 : 0.0) + - (duk_double_t) c_line; - DUK_TVAL_SET_DOUBLE(tv, d); - tv++; - } - - /* Traceback depth doesn't take into account the filename/line - * special handling above (intentional). - */ - for (; depth-- > 0; act = act->parent) { - duk_uint32_t pc; - duk_tval *tv_src; - - /* [... arr] */ - - DUK_ASSERT(act != NULL); /* depth check above, assumes book-keeping is correct */ - DUK_ASSERT_DISABLE(act->pc >= 0); /* unsigned */ - - /* Add function object. */ - tv_src = &act->tv_func; /* object (function) or lightfunc */ - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_src) || DUK_TVAL_IS_LIGHTFUNC(tv_src)); - DUK_TVAL_SET_TVAL(tv, tv_src); - DUK_TVAL_INCREF(thr, tv); - tv++; - - /* Add a number containing: pc, activation flags. - * - * PC points to next instruction, find offending PC. Note that - * PC == 0 for native code. - */ - pc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr_callstack, act); - DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */ - DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */ - d = ((duk_double_t) act->flags) * DUK_DOUBLE_2TO32 + (duk_double_t) pc; - DUK_TVAL_SET_DOUBLE(tv, d); - tv++; - } - -#if defined(DUK_USE_ASSERTIONS) - { - duk_harray *a; - a = (duk_harray *) duk_known_hobject(thr, -1); - DUK_ASSERT(a != NULL); - DUK_ASSERT((duk_uint32_t) (tv - DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a)) == a->length); - DUK_ASSERT(a->length == (duk_uint32_t) arr_size); - } -#endif - - /* [ ... error c_filename? arr ] */ - - if (c_filename) { - duk_remove_m2(thr); - } - - /* [ ... error arr ] */ - - duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INT_TRACEDATA); /* -> [ ... error ] */ -} -#endif /* DUK_USE_TRACEBACKS */ - -/* - * Add .fileName and .lineNumber to an error on the stack top. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) && !defined(DUK_USE_TRACEBACKS) -DUK_LOCAL void duk__add_fileline(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { -#if defined(DUK_USE_ASSERTIONS) - duk_int_t entry_top; -#endif - -#if defined(DUK_USE_ASSERTIONS) - entry_top = duk_get_top(thr); -#endif - - /* - * If tracebacks are disabled, 'fileName' and 'lineNumber' are added - * as plain own properties. Since Error.prototype has accessors of - * the same name, we need to define own properties directly (cannot - * just use e.g. duk_put_prop_stridx). Existing properties are not - * overwritten in case they already exist. - */ - - if (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) { - /* Compiler SyntaxError (or other error) gets the primary blame. - * Currently no flag to prevent blaming. - */ - duk_push_uint(thr, (duk_uint_t) thr->compile_ctx->curr_token.start_line); - duk_push_hstring(thr, thr->compile_ctx->h_filename); - } else if (c_filename && (flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) == 0) { - /* C call site gets blamed next, unless flagged not to do so. - * XXX: file/line is disabled in minimal builds, so disable this - * too when appropriate. - */ - duk_push_int(thr, c_line); - duk_push_string(thr, c_filename); - } else { - /* Finally, blame the innermost callstack entry which has a - * .fileName property. - */ - duk_small_uint_t depth; - duk_uint32_t ecma_line; - duk_activation *act; - - DUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX); /* callstack limits */ - depth = DUK_USE_TRACEBACK_DEPTH; - if (depth > thr_callstack->callstack_top) { - depth = thr_callstack->callstack_top; - } - for (act = thr_callstack->callstack_curr; depth-- > 0; act = act->parent) { - duk_hobject *func; - duk_uint32_t pc; - - DUK_ASSERT(act != NULL); - func = DUK_ACT_GET_FUNC(act); - if (func == NULL) { - /* Lightfunc, not blamed now. */ - continue; - } - - /* PC points to next instruction, find offending PC, - * PC == 0 for native code. - */ - pc = duk_hthread_get_act_prev_pc(thr, act); /* thr argument only used for thr->heap, so specific thread doesn't matter */ - DUK_UNREF(pc); - DUK_ASSERT_DISABLE(pc >= 0); /* unsigned */ - DUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32); /* assume PC is at most 32 bits and non-negative */ - act = NULL; /* invalidated by pushes, so get out of the way */ - - duk_push_hobject(thr, func); - - /* [ ... error func ] */ - - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME); - if (!duk_is_string_notsymbol(thr, -1)) { - duk_pop_2(thr); - continue; - } - - /* [ ... error func fileName ] */ - - ecma_line = 0; -#if defined(DUK_USE_PC2LINE) - if (DUK_HOBJECT_IS_COMPFUNC(func)) { - ecma_line = duk_hobject_pc2line_query(thr, -2, (duk_uint_fast32_t) pc); - } else { - /* Native function, no relevant lineNumber. */ - } -#endif /* DUK_USE_PC2LINE */ - duk_push_u32(thr, ecma_line); - - /* [ ... error func fileName lineNumber ] */ - - duk_replace(thr, -3); - - /* [ ... error lineNumber fileName ] */ - goto define_props; - } - - /* No activation matches, use undefined for both .fileName and - * .lineNumber (matches what we do with a _Tracedata based - * no-match lookup. - */ - duk_push_undefined(thr); - duk_push_undefined(thr); - } - - define_props: - /* [ ... error lineNumber fileName ] */ -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(duk_get_top(thr) == entry_top + 2); -#endif - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE); -} -#endif /* DUK_USE_AUGMENT_ERROR_CREATE && !DUK_USE_TRACEBACKS */ - -/* - * Add line number to a compiler error. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) -DUK_LOCAL void duk__add_compiler_error_line(duk_hthread *thr) { - - /* Append a "(line NNN)" to the "message" property of any error - * thrown during compilation. Usually compilation errors are - * SyntaxErrors but they can also be out-of-memory errors and - * the like. - */ - - /* [ ... error ] */ - - DUK_ASSERT(duk_is_object(thr, -1)); - - if (!(thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL)) { - return; - } - - DUK_DDD(DUK_DDDPRINT("compile error, before adding line info: %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_MESSAGE)) { - duk_push_sprintf(thr, " (line %ld)", (long) thr->compile_ctx->curr_token.start_line); - duk_concat(thr, 2); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE); - } else { - duk_pop(thr); - } - - DUK_DDD(DUK_DDDPRINT("compile error, after adding line info: %!T", - (duk_tval *) duk_get_tval(thr, -1))); -} -#endif /* DUK_USE_AUGMENT_ERROR_CREATE */ - -/* - * Augment an error being created using Duktape specific properties - * like _Tracedata or .fileName/.lineNumber. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) -DUK_LOCAL void duk__err_augment_builtin_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_hobject *obj, duk_small_uint_t flags) { -#if defined(DUK_USE_ASSERTIONS) - duk_int_t entry_top; -#endif - -#if defined(DUK_USE_ASSERTIONS) - entry_top = duk_get_top(thr); -#endif - DUK_ASSERT(obj != NULL); - - DUK_UNREF(obj); /* unreferenced w/o tracebacks */ - - duk__add_compiler_error_line(thr); - -#if defined(DUK_USE_TRACEBACKS) - /* If tracebacks are enabled, the '_Tracedata' property is the only - * thing we need: 'fileName' and 'lineNumber' are virtual properties - * which use '_Tracedata'. - */ - if (duk_hobject_hasprop_raw(thr, obj, DUK_HTHREAD_STRING_INT_TRACEDATA(thr))) { - DUK_DDD(DUK_DDDPRINT("error value already has a '_Tracedata' property, not modifying it")); - } else { - duk__add_traceback(thr, thr_callstack, c_filename, c_line, flags); - } -#else - /* Without tracebacks the concrete .fileName and .lineNumber need - * to be added directly. - */ - duk__add_fileline(thr, thr_callstack, c_filename, c_line, flags); -#endif - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(duk_get_top(thr) == entry_top); -#endif -} -#endif /* DUK_USE_AUGMENT_ERROR_CREATE */ - -/* - * Augment an error at creation time with _Tracedata/fileName/lineNumber - * and allow a user error handler (if defined) to process/replace the error. - * The error to be augmented is at the stack top. - * - * thr: thread containing the error value - * thr_callstack: thread which should be used for generating callstack etc. - * c_filename: C __FILE__ related to the error - * c_line: C __LINE__ related to the error - * flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE: - * if true, don't fileName/line as error source, otherwise use traceback - * (needed because user code filename/line are reported but internal ones - * are not) - */ - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) -DUK_INTERNAL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) { - duk_hobject *obj; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr_callstack != NULL); - - /* [ ... error ] */ - - /* - * Criteria for augmenting: - * - * - augmentation enabled in build (naturally) - * - error value internal prototype chain contains the built-in - * Error prototype object (i.e. 'val instanceof Error') - * - * Additional criteria for built-in augmenting: - * - * - error value is an extensible object - */ - - obj = duk_get_hobject(thr, -1); - if (!obj) { - DUK_DDD(DUK_DDDPRINT("value is not an object, skip both built-in and user augment")); - return; - } - if (!duk_hobject_prototype_chain_contains(thr, obj, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) { - /* If the value has a prototype loop, it's critical not to - * throw here. Instead, assume the value is not to be - * augmented. - */ - DUK_DDD(DUK_DDDPRINT("value is not an error instance, skip both built-in and user augment")); - return; - } - if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) { - DUK_DDD(DUK_DDDPRINT("error meets criteria, built-in augment")); - duk__err_augment_builtin_create(thr, thr_callstack, c_filename, c_line, obj, flags); - } else { - DUK_DDD(DUK_DDDPRINT("error does not meet criteria, no built-in augment")); - } - - /* [ ... error ] */ - -#if defined(DUK_USE_ERRCREATE) - duk__err_augment_user(thr, DUK_STRIDX_ERR_CREATE); -#endif -} -#endif /* DUK_USE_AUGMENT_ERROR_CREATE */ - -/* - * Augment an error at throw time; allow a user error handler (if defined) - * to process/replace the error. The error to be augmented is at the - * stack top. - */ - -#if defined(DUK_USE_AUGMENT_ERROR_THROW) -DUK_INTERNAL void duk_err_augment_error_throw(duk_hthread *thr) { -#if defined(DUK_USE_ERRTHROW) - duk__err_augment_user(thr, DUK_STRIDX_ERR_THROW); -#endif /* DUK_USE_ERRTHROW */ -} -#endif /* DUK_USE_AUGMENT_ERROR_THROW */ -#line 1 "duk_error_longjmp.c" -/* - * Do a longjmp call, calling the fatal error handler if no - * catchpoint exists. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_PREFER_SIZE) -DUK_LOCAL void duk__uncaught_minimal(duk_hthread *thr) { - (void) duk_fatal(thr, "uncaught error"); -} -#endif - -#if 0 -DUK_LOCAL void duk__uncaught_readable(duk_hthread *thr) { - const char *summary; - char buf[DUK_USE_FATAL_MAXLEN]; - - summary = duk_push_string_tval_readable(thr, &thr->heap->lj.value1); - DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary); - buf[sizeof(buf) - 1] = (char) 0; - (void) duk_fatal(thr, (const char *) buf); -} -#endif - -#if !defined(DUK_USE_PREFER_SIZE) -DUK_LOCAL void duk__uncaught_error_aware(duk_hthread *thr) { - const char *summary; - char buf[DUK_USE_FATAL_MAXLEN]; - - summary = duk_push_string_tval_readable_error(thr, &thr->heap->lj.value1); - DUK_ASSERT(summary != NULL); - DUK_SNPRINTF(buf, sizeof(buf), "uncaught: %s", summary); - buf[sizeof(buf) - 1] = (char) 0; - (void) duk_fatal(thr, (const char *) buf); -} -#endif - -DUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - - DUK_DD(DUK_DDPRINT("longjmp error: type=%d iserror=%d value1=%!T value2=%!T", - (int) thr->heap->lj.type, (int) thr->heap->lj.iserror, - &thr->heap->lj.value1, &thr->heap->lj.value2)); - - /* Prevent finalizer execution during error handling. All error - * handling sites will process pending finalizers once error handling - * is complete and we're ready for the side effects. Does not prevent - * refzero freeing or mark-and-sweep during error handling. - * - * NOTE: when we come here some calling code may have used DECREF - * NORZ macros without an explicit DUK_REFZERO_CHECK_xxx() call. - * We don't want to do it here because it would just check for - * pending finalizers and we prevent that explicitly. Instead, - * the error catcher will run the finalizers once error handling - * is complete. - */ - - DUK_ASSERT_LJSTATE_SET(thr->heap); - - thr->heap->pf_prevent_count++; - DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ - -#if defined(DUK_USE_ASSERTIONS) - /* XXX: set this immediately when longjmp state is set */ - DUK_ASSERT(thr->heap->error_not_allowed == 0); /* Detect error within critical section. */ - thr->heap->error_not_allowed = 1; -#endif - - DUK_DD(DUK_DDPRINT("about to longjmp, pf_prevent_count=%ld", (long) thr->heap->pf_prevent_count)); - -#if !defined(DUK_USE_CPP_EXCEPTIONS) - /* If we don't have a jmpbuf_ptr, there is little we can do except - * cause a fatal error. The caller's expectation is that we never - * return. - * - * With C++ exceptions we now just propagate an uncaught error - * instead of invoking the fatal error handler. Because there's - * a dummy jmpbuf for C++ exceptions now, this could be changed. - */ - if (!thr->heap->lj.jmpbuf_ptr) { - DUK_D(DUK_DPRINT("uncaught error: type=%d iserror=%d value1=%!T value2=%!T", - (int) thr->heap->lj.type, (int) thr->heap->lj.iserror, - &thr->heap->lj.value1, &thr->heap->lj.value2)); - -#if defined(DUK_USE_PREFER_SIZE) - duk__uncaught_minimal(thr); -#else - duk__uncaught_error_aware(thr); -#endif - DUK_UNREACHABLE(); - } -#endif /* DUK_USE_CPP_EXCEPTIONS */ - -#if defined(DUK_USE_CPP_EXCEPTIONS) - { - duk_internal_exception exc; /* dummy */ - throw exc; - } -#else /* DUK_USE_CPP_EXCEPTIONS */ - DUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb); -#endif /* DUK_USE_CPP_EXCEPTIONS */ - - DUK_UNREACHABLE(); -} -#line 1 "duk_error_misc.c" -/* - * Error helpers - */ - -/* #include duk_internal.h -> already included */ - -/* - * Helper to walk the thread chain and see if there is an active error - * catcher. Protected calls or finally blocks aren't considered catching. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_LOCAL duk_bool_t duk__have_active_catcher(duk_hthread *thr) { - /* As noted above, a protected API call won't be counted as a - * catcher. This is usually convenient, e.g. in the case of a top- - * level duk_pcall(), but may not always be desirable. Perhaps add - * an argument to treat them as catchers? - */ - - duk_activation *act; - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - - for (; thr != NULL; thr = thr->resumer) { - for (act = thr->callstack_curr; act != NULL; act = act->parent) { - for (cat = act->cat; cat != NULL; cat = cat->parent) { - if (DUK_CAT_HAS_CATCH_ENABLED(cat)) { - return 1; /* all we need to know */ - } - } - } - } - return 0; -} -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -/* - * Get prototype object for an integer error code. - */ - -DUK_INTERNAL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t code) { - switch (code) { - case DUK_ERR_EVAL_ERROR: - return thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]; - case DUK_ERR_RANGE_ERROR: - return thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]; - case DUK_ERR_REFERENCE_ERROR: - return thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]; - case DUK_ERR_SYNTAX_ERROR: - return thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]; - case DUK_ERR_TYPE_ERROR: - return thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]; - case DUK_ERR_URI_ERROR: - return thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]; - case DUK_ERR_ERROR: - default: - return thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]; - } -} - -/* - * Helper for debugger throw notify and pause-on-uncaught integration. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_INTERNAL void duk_err_check_debugger_integration(duk_hthread *thr) { - duk_bool_t uncaught; - duk_tval *tv_obj; - - /* If something is thrown with the debugger attached and nobody will - * catch it, execution is paused before the longjmp, turning over - * control to the debug client. This allows local state to be examined - * before the stack is unwound. Errors are not intercepted when debug - * message loop is active (e.g. for Eval). - */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - - /* XXX: Allow customizing the pause and notify behavior at runtime - * using debugger runtime flags. For now the behavior is fixed using - * config options. - */ - - if (!duk_debug_is_attached(thr->heap) || - thr->heap->dbg_processing || - thr->heap->lj.type != DUK_LJ_TYPE_THROW || - thr->heap->creating_error) { - DUK_D(DUK_DPRINT("skip debugger error integration; not attached, debugger processing, not THROW, or error thrown while creating error")); - return; - } - - /* Don't intercept a DoubleError, we may have caused the initial double - * fault and attempting to intercept it will cause us to be called - * recursively and exhaust the C stack. (This should no longer happen - * for the initial throw because DoubleError path doesn't do a debugger - * integration check, but it might happen for rethrows.) - */ - tv_obj = &thr->heap->lj.value1; - if (DUK_TVAL_IS_OBJECT(tv_obj) && DUK_TVAL_GET_OBJECT(tv_obj) == thr->builtins[DUK_BIDX_DOUBLE_ERROR]) { - DUK_D(DUK_DPRINT("built-in DoubleError instance (re)thrown, not intercepting")); - return; - } - - uncaught = !duk__have_active_catcher(thr); - - /* Debugger code expects the value at stack top. This also serves - * as a backup: we need to store/restore the longjmp state because - * when the debugger is paused Eval commands may be executed and - * they can arbitrarily clobber the longjmp state. - */ - duk_push_tval(thr, tv_obj); - - /* Store and reset longjmp state. */ - DUK_ASSERT_LJSTATE_SET(thr->heap); - DUK_TVAL_DECREF_NORZ(thr, tv_obj); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2)); /* Always for THROW type. */ - DUK_TVAL_SET_UNDEFINED(tv_obj); - thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - -#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY) - /* Report it to the debug client */ - DUK_D(DUK_DPRINT("throw with debugger attached, report to client")); - duk_debug_send_throw(thr, uncaught); -#endif - - if (uncaught) { - if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_UNCAUGHT_ERROR) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by uncaught error")); - duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); - } - } else { - if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_CAUGHT_ERROR) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by caught error")); - duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); - } - } - - /* Restore longjmp state. */ - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - thr->heap->lj.type = DUK_LJ_TYPE_THROW; - tv_obj = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value1)); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2)); - DUK_TVAL_SET_TVAL(&thr->heap->lj.value1, tv_obj); - DUK_TVAL_INCREF(thr, tv_obj); - DUK_ASSERT_LJSTATE_SET(thr->heap); - - duk_pop(thr); -} -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -/* - * Helpers for setting up heap longjmp state. - */ - -DUK_INTERNAL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - heap = thr->heap; - DUK_ASSERT(heap != NULL); - DUK_ASSERT(tv_val != NULL); - - DUK_ASSERT_LJSTATE_UNSET(heap); - - heap->lj.type = lj_type; - DUK_TVAL_SET_TVAL(&heap->lj.value1, tv_val); - DUK_TVAL_INCREF(thr, tv_val); - - DUK_ASSERT_LJSTATE_SET(heap); -} -#line 1 "duk_error_throw.c" -/* - * Create and throw an Ecmascript error object based on a code and a message. - * - * Used when we throw errors internally. Ecmascript generated error objects - * are created by Ecmascript code, and the throwing is handled by the bytecode - * executor. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Create and throw an error (originating from Duktape internally) - * - * Push an error object on top of the stack, possibly throw augmenting - * the error, and finally longjmp. - * - * If an error occurs while we're dealing with the current error, we might - * enter an infinite recursion loop. This is prevented by detecting a - * "double fault" through the heap->creating_error flag; the recursion - * then stops at the second level. - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line) { -#else -DUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code) { -#endif -#if defined(DUK_USE_VERBOSE_ERRORS) - DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld, msg=%s, filename=%s, line=%ld", - (long) code, (const char *) msg, - (const char *) filename, (long) line)); -#else - DUK_DD(DUK_DDPRINT("duk_err_create_and_throw(): code=%ld", (long) code)); -#endif - - DUK_ASSERT(thr != NULL); - - /* Even though nested call is possible because we throw an error when - * trying to create an error, the potential errors must happen before - * the longjmp state is configured. - */ - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - - /* Sync so that augmentation sees up-to-date activations, NULL - * thr->ptr_curr_pc so that it's not used if side effects occur - * in augmentation or longjmp handling. - */ - duk_hthread_sync_and_null_currpc(thr); - - /* - * Create and push an error object onto the top of stack. - * The error is potentially augmented before throwing. - * - * If a "double error" occurs, use a fixed error instance - * to avoid further trouble. - */ - - if (thr->heap->creating_error) { - duk_tval tv_val; - duk_hobject *h_err; - - thr->heap->creating_error = 0; - - h_err = thr->builtins[DUK_BIDX_DOUBLE_ERROR]; - if (h_err != NULL) { - DUK_D(DUK_DPRINT("double fault detected -> use built-in fixed 'double error' instance")); - DUK_TVAL_SET_OBJECT(&tv_val, h_err); - } else { - DUK_D(DUK_DPRINT("double fault detected; there is no built-in fixed 'double error' instance " - "-> use the error code as a number")); - DUK_TVAL_SET_I32(&tv_val, (duk_int32_t) code); - } - - duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, &tv_val); - - /* No augmentation to avoid any allocations or side effects. */ - } else { - /* Prevent infinite recursion. Extra call stack and C - * recursion headroom (see GH-191) is added for augmentation. - * That is now signalled by heap->augmenting error and taken - * into account in call handling without an explicit limit bump. - */ - thr->heap->creating_error = 1; - - duk_require_stack(thr, 1); - - /* XXX: usually unnecessary '%s' formatting here, but cannot - * use 'msg' as a format string directly. - */ -#if defined(DUK_USE_VERBOSE_ERRORS) - duk_push_error_object_raw(thr, - code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, - filename, - line, - "%s", - (const char *) msg); -#else - duk_push_error_object_raw(thr, - code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, - NULL, - 0, - NULL); -#endif - - /* Note that an alloc error may happen during error augmentation. - * This may happen both when the original error is an alloc error - * and when it's something else. Because any error in augmentation - * must be handled correctly anyway, there's no special check for - * avoiding it for alloc errors (this differs from Duktape 1.x). - */ -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT (before throw augment)", - (duk_tval *) duk_get_tval(thr, -1))); - duk_err_augment_error_throw(thr); -#endif - - duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1)); - thr->heap->creating_error = 0; - - /* Error is now created and we assume no errors can occur any - * more. Check for debugger Throw integration only when the - * error is complete. If we enter debugger message loop, - * creating_error must be 0 so that errors can be thrown in - * the paused state, e.g. in Eval commands. - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_err_check_debugger_integration(thr); -#endif - } - - /* - * Finally, longjmp - */ - - DUK_DDD(DUK_DDDPRINT("THROW ERROR (INTERNAL): %!iT, %!iT (after throw augment)", - (duk_tval *) &thr->heap->lj.value1, (duk_tval *) &thr->heap->lj.value2)); - - duk_err_longjmp(thr); - DUK_UNREACHABLE(); -} - -/* - * Helper for C function call negative return values. - */ - -DUK_INTERNAL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(rc < 0); - - /* - * The __FILE__ and __LINE__ information is intentionally not used in the - * creation of the error object, as it isn't useful in the tracedata. The - * tracedata still contains the function which returned the negative return - * code, and having the file/line of this function isn't very useful. - * - * The error messages for DUK_RET_xxx shorthand are intentionally very - * minimal: they're only really useful for low memory targets. - */ - - duk_error_raw(thr, -rc, NULL, 0, "error (rc %ld)", (long) rc); - DUK_UNREACHABLE(); -} -#line 1 "duk_hbuffer_alloc.c" -/* - * duk_hbuffer allocation and freeing. - */ - -/* #include duk_internal.h -> already included */ - -/* Allocate a new duk_hbuffer of a certain type and return a pointer to it - * (NULL on error). Write buffer data pointer to 'out_bufdata' (only if - * allocation successful). - */ -DUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata) { - duk_hbuffer *res = NULL; - duk_size_t header_size; - duk_size_t alloc_size; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(out_bufdata != NULL); - - DUK_DDD(DUK_DDDPRINT("allocate hbuffer")); - - /* Size sanity check. Should not be necessary because caller is - * required to check this, but we don't want to cause a segfault - * if the size wraps either in duk_size_t computation or when - * storing the size in a 16-bit field. - */ - if (size > DUK_HBUFFER_MAX_BYTELEN) { - DUK_D(DUK_DPRINT("hbuffer alloc failed: size too large: %ld", (long) size)); - return NULL; /* no need to write 'out_bufdata' */ - } - - if (flags & DUK_BUF_FLAG_EXTERNAL) { - header_size = sizeof(duk_hbuffer_external); - alloc_size = sizeof(duk_hbuffer_external); - } else if (flags & DUK_BUF_FLAG_DYNAMIC) { - header_size = sizeof(duk_hbuffer_dynamic); - alloc_size = sizeof(duk_hbuffer_dynamic); - } else { - header_size = sizeof(duk_hbuffer_fixed); - alloc_size = sizeof(duk_hbuffer_fixed) + size; - DUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed)); /* no wrapping */ - } - - res = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size); - if (DUK_UNLIKELY(res == NULL)) { - goto alloc_error; - } - - /* zero everything unless requested not to do so */ -#if defined(DUK_USE_ZERO_BUFFER_DATA) - DUK_MEMZERO((void *) res, - (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size); -#else - DUK_MEMZERO((void *) res, header_size); -#endif - - if (flags & DUK_BUF_FLAG_EXTERNAL) { - duk_hbuffer_external *h; - h = (duk_hbuffer_external *) res; - DUK_UNREF(h); - *out_bufdata = NULL; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_HEAPPTR16) -/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ -#else - DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, h, NULL); -#endif -#endif - DUK_ASSERT(DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, h) == NULL); - } else if (flags & DUK_BUF_FLAG_DYNAMIC) { - duk_hbuffer_dynamic *h = (duk_hbuffer_dynamic *) res; - void *ptr; - - if (size > 0) { - DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); /* alloc external with size zero */ - DUK_DDD(DUK_DDDPRINT("dynamic buffer with nonzero size, alloc actual buffer")); -#if defined(DUK_USE_ZERO_BUFFER_DATA) - ptr = DUK_ALLOC_ZEROED(heap, size); -#else - ptr = DUK_ALLOC(heap, size); -#endif - if (DUK_UNLIKELY(ptr == NULL)) { - /* Because size > 0, NULL check is correct */ - goto alloc_error; - } - *out_bufdata = ptr; - - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, ptr); - } else { - *out_bufdata = NULL; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_HEAPPTR16) -/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */ -#else - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, NULL); -#endif -#endif - DUK_ASSERT(DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, h) == NULL); - } - } else { - *out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1); - } - - DUK_HBUFFER_SET_SIZE(res, size); - - DUK_HEAPHDR_SET_TYPE(&res->hdr, DUK_HTYPE_BUFFER); - if (flags & DUK_BUF_FLAG_DYNAMIC) { - DUK_HBUFFER_SET_DYNAMIC(res); - if (flags & DUK_BUF_FLAG_EXTERNAL) { - DUK_HBUFFER_SET_EXTERNAL(res); - } - } else { - DUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL)); - } - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &res->hdr); - - DUK_DDD(DUK_DDDPRINT("allocated hbuffer: %p", (void *) res)); - return res; - - alloc_error: - DUK_DD(DUK_DDPRINT("hbuffer allocation failed")); - - DUK_FREE(heap, res); - return NULL; /* no need to write 'out_bufdata' */ -} - -/* For indirect allocs. */ - -DUK_INTERNAL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud) { - duk_hbuffer_dynamic *buf = (duk_hbuffer_dynamic *) ud; - DUK_UNREF(heap); - return (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf); -} -#line 1 "duk_hbuffer_ops.c" -/* - * duk_hbuffer operations such as resizing and inserting/appending data to - * a dynamic buffer. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Resizing - */ - -DUK_INTERNAL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size) { - void *res; - duk_size_t prev_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(buf != NULL); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); - DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); - - /* - * Maximum size check - */ - - if (new_size > DUK_HBUFFER_MAX_BYTELEN) { - DUK_ERROR_RANGE(thr, "buffer too long"); - } - - /* - * Note: use indirect realloc variant just in case mark-and-sweep - * (finalizers) might resize this same buffer during garbage - * collection. - */ - - res = DUK_REALLOC_INDIRECT(thr->heap, duk_hbuffer_get_dynalloc_ptr, (void *) buf, new_size); - if (DUK_LIKELY(res != NULL || new_size == 0)) { - /* 'res' may be NULL if new allocation size is 0. */ - - DUK_DDD(DUK_DDDPRINT("resized dynamic buffer %p:%ld -> %p:%ld", - (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, buf), - (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(buf), - (void *) res, - (long) new_size)); - - /* - * The entire allocated buffer area, regardless of actual used - * size, is kept zeroed in resizes for simplicity. If the buffer - * is grown, zero the new part. - */ - - prev_size = DUK_HBUFFER_DYNAMIC_GET_SIZE(buf); - if (new_size > prev_size) { - DUK_ASSERT(new_size - prev_size > 0); -#if defined(DUK_USE_ZERO_BUFFER_DATA) - DUK_MEMZERO((void *) ((char *) res + prev_size), - (duk_size_t) (new_size - prev_size)); -#endif - } - - DUK_HBUFFER_DYNAMIC_SET_SIZE(buf, new_size); - DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(thr->heap, buf, res); - } else { - DUK_ERROR_ALLOC_FAILED(thr); - } - - DUK_ASSERT(res != NULL || new_size == 0); -} - -DUK_INTERNAL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(buf != NULL); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); - DUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf)); - - duk_hbuffer_resize(thr, buf, 0); -} -/* #include duk_internal.h -> already included */ -#line 2 "duk_hbufobj_misc.c" - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len) { - duk_uint_t buf_size; - duk_uint_t buf_avail; - - DUK_ASSERT(h_bufobj != NULL); - DUK_ASSERT(h_bufobj->buf != NULL); - - buf_size = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_bufobj->buf); - if (h_bufobj->offset > buf_size) { - /* Slice starting point is beyond current length. */ - return 0; - } - buf_avail = buf_size - h_bufobj->offset; - - return buf_avail >= len ? len : buf_avail; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ -#line 1 "duk_heap_alloc.c" -/* - * duk_heap allocation and freeing. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_ROM_STRINGS) -/* Fixed seed value used with ROM strings. */ -#define DUK__FIXED_HASH_SEED 0xabcd1234 -#endif - -/* - * Free a heap object. - * - * Free heap object and its internal (non-heap) pointers. Assumes that - * caller has removed the object from heap allocated list or the string - * intern table, and any weak references (which strings may have) have - * been already dealt with. - */ - -DUK_INTERNAL void duk_free_hobject(duk_heap *heap, duk_hobject *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - DUK_FREE(heap, DUK_HOBJECT_GET_PROPS(heap, h)); - - if (DUK_HOBJECT_IS_COMPFUNC(h)) { - duk_hcompfunc *f = (duk_hcompfunc *) h; - DUK_UNREF(f); - /* Currently nothing to free; 'data' is a heap object */ - } else if (DUK_HOBJECT_IS_NATFUNC(h)) { - duk_hnatfunc *f = (duk_hnatfunc *) h; - DUK_UNREF(f); - /* Currently nothing to free */ - } else if (DUK_HOBJECT_IS_THREAD(h)) { - duk_hthread *t = (duk_hthread *) h; - duk_activation *act; - - DUK_FREE(heap, t->valstack); - - /* Don't free h->resumer because it exists in the heap. - * Callstack entries also contain function pointers which - * are not freed for the same reason. They are decref - * finalized and the targets are freed if necessary based - * on their refcount (or reachability). - */ - for (act = t->callstack_curr; act != NULL;) { - duk_activation *act_next; - duk_catcher *cat; - - for (cat = act->cat; cat != NULL;) { - duk_catcher *cat_next; - - cat_next = cat->parent; - DUK_FREE(heap, (void *) cat); - cat = cat_next; - } - - act_next = act->parent; - DUK_FREE(heap, (void *) act); - act = act_next; - } - - /* XXX: with 'caller' property the callstack would need - * to be unwound to update the 'caller' properties of - * functions in the callstack. - */ - } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { - duk_hboundfunc *f = (duk_hboundfunc *) h; - - DUK_FREE(heap, f->args); - } - - DUK_FREE(heap, (void *) h); -} - -DUK_INTERNAL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - if (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h)) { - duk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h; - DUK_DDD(DUK_DDDPRINT("free dynamic buffer %p", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g))); - DUK_FREE(heap, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g)); - } - DUK_FREE(heap, (void *) h); -} - -DUK_INTERNAL void duk_free_hstring(duk_heap *heap, duk_hstring *h) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - - DUK_UNREF(heap); - DUK_UNREF(h); - -#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_FREE) - if (DUK_HSTRING_HAS_EXTDATA(h)) { - DUK_DDD(DUK_DDDPRINT("free extstr: hstring %!O, extdata: %p", - h, DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h))); - DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h)); - } -#endif - DUK_FREE(heap, (void *) h); -} - -DUK_INTERNAL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr) { - DUK_ASSERT(heap); - DUK_ASSERT(hdr); - - DUK_DDD(DUK_DDDPRINT("free heaphdr %p, htype %ld", (void *) hdr, (long) DUK_HEAPHDR_GET_TYPE(hdr))); - - switch (DUK_HEAPHDR_GET_TYPE(hdr)) { - case DUK_HTYPE_STRING: - duk_free_hstring(heap, (duk_hstring *) hdr); - break; - case DUK_HTYPE_OBJECT: - duk_free_hobject(heap, (duk_hobject *) hdr); - break; - default: - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) == DUK_HTYPE_BUFFER); - duk_free_hbuffer(heap, (duk_hbuffer *) hdr); - } - -} - -/* - * Free the heap. - * - * Frees heap-related non-heap-tracked allocations such as the - * string intern table; then frees the heap allocated objects; - * and finally frees the heap structure itself. Reference counts - * and GC markers are ignored (and not updated) in this process, - * and finalizers won't be called. - * - * The heap pointer and heap object pointers must not be used - * after this call. - */ - -#if defined(DUK_USE_CACHE_ACTIVATION) -DUK_LOCAL duk_size_t duk__heap_free_activation_freelist(duk_heap *heap) { - duk_activation *act; - duk_activation *act_next; - duk_size_t count_act = 0; - - for (act = heap->activation_free; act != NULL;) { - act_next = act->parent; - DUK_FREE(heap, (void *) act); - act = act_next; -#if defined(DUK_USE_DEBUG) - count_act++; -#endif - } - heap->activation_free = NULL; /* needed when called from mark-and-sweep */ - return count_act; -} -#endif /* DUK_USE_CACHE_ACTIVATION */ - -#if defined(DUK_USE_CACHE_CATCHER) -DUK_LOCAL duk_size_t duk__heap_free_catcher_freelist(duk_heap *heap) { - duk_catcher *cat; - duk_catcher *cat_next; - duk_size_t count_cat = 0; - - for (cat = heap->catcher_free; cat != NULL;) { - cat_next = cat->parent; - DUK_FREE(heap, (void *) cat); - cat = cat_next; -#if defined(DUK_USE_DEBUG) - count_cat++; -#endif - } - heap->catcher_free = NULL; /* needed when called from mark-and-sweep */ - - return count_cat; -} -#endif /* DUK_USE_CACHE_CATCHER */ - -DUK_INTERNAL void duk_heap_free_freelists(duk_heap *heap) { - duk_size_t count_act = 0; - duk_size_t count_cat = 0; - -#if defined(DUK_USE_CACHE_ACTIVATION) - count_act = duk__heap_free_activation_freelist(heap); -#endif -#if defined(DUK_USE_CACHE_CATCHER) - count_cat = duk__heap_free_catcher_freelist(heap); -#endif - DUK_UNREF(heap); - DUK_UNREF(count_act); - DUK_UNREF(count_cat); - - DUK_D(DUK_DPRINT("freed %ld activation freelist entries, %ld catcher freelist entries", - (long) count_act, (long) count_cat)); -} - -DUK_LOCAL void duk__free_allocated(duk_heap *heap) { - duk_heaphdr *curr; - duk_heaphdr *next; - - curr = heap->heap_allocated; - while (curr) { - /* We don't log or warn about freeing zero refcount objects - * because they may happen with finalizer processing. - */ - - DUK_DDD(DUK_DDDPRINT("FINALFREE (allocated): %!iO", - (duk_heaphdr *) curr)); - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - duk_heap_free_heaphdr_raw(heap, curr); - curr = next; - } -} - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_LOCAL void duk__free_finalize_list(duk_heap *heap) { - duk_heaphdr *curr; - duk_heaphdr *next; - - curr = heap->finalize_list; - while (curr) { - DUK_DDD(DUK_DDDPRINT("FINALFREE (finalize_list): %!iO", - (duk_heaphdr *) curr)); - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - duk_heap_free_heaphdr_raw(heap, curr); - curr = next; - } -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -DUK_LOCAL void duk__free_stringtable(duk_heap *heap) { - /* strings are only tracked by stringtable */ - duk_heap_strtable_free(heap); -} - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_LOCAL void duk__free_run_finalizers(duk_heap *heap) { - duk_heaphdr *curr; - duk_uint_t round_no; - duk_size_t count_all; - duk_size_t count_finalized; - duk_size_t curr_limit; - - DUK_ASSERT(heap != NULL); - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* refzero not running -> must be empty */ -#endif - DUK_ASSERT(heap->finalize_list == NULL); /* mark-and-sweep last pass */ - - if (heap->heap_thread == NULL) { - /* May happen when heap allocation fails right off. There - * cannot be any finalizable objects in this case. - */ - DUK_D(DUK_DPRINT("no heap_thread in heap destruct, assume no finalizable objects")); - return; - } - - /* Prevent finalize_list processing and mark-and-sweep entirely. - * Setting ms_running = 1 also prevents refzero handling from moving - * objects away from the heap_allocated list (the flag name is a bit - * misleading here). - */ - DUK_ASSERT(heap->pf_prevent_count == 0); - heap->pf_prevent_count = 1; - DUK_ASSERT(heap->ms_running == 0); - heap->ms_running = 1; - DUK_ASSERT(heap->ms_prevent_count == 0); - heap->ms_prevent_count = 1; /* Bump, because mark-and-sweep assumes it's bumped when ms_running is set. */ - - curr_limit = 0; /* suppress warning, not used */ - for (round_no = 0; ; round_no++) { - curr = heap->heap_allocated; - count_all = 0; - count_finalized = 0; - while (curr) { - count_all++; - if (DUK_HEAPHDR_IS_OBJECT(curr)) { - /* Only objects in heap_allocated may have finalizers. Check that - * the object itself has a _Finalizer property (own or inherited) - * so that we don't execute finalizers for e.g. Proxy objects. - */ - DUK_ASSERT(curr != NULL); - - if (DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) curr)) { - if (!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) curr)) { - DUK_ASSERT(DUK_HEAP_HAS_FINALIZER_NORESCUE(heap)); /* maps to finalizer 2nd argument */ - duk_heap_run_finalizer(heap, (duk_hobject *) curr); - count_finalized++; - } - } - } - curr = DUK_HEAPHDR_GET_NEXT(heap, curr); - } - - /* Each round of finalizer execution may spawn new finalizable objects - * which is normal behavior for some applications. Allow multiple - * rounds of finalization, but use a shrinking limit based on the - * first round to detect the case where a runaway finalizer creates - * an unbounded amount of new finalizable objects. Finalizer rescue - * is not supported: the semantics are unclear because most of the - * objects being finalized here are already reachable. The finalizer - * is given a boolean to indicate that rescue is not possible. - * - * See discussion in: https://github.com/svaarala/duktape/pull/473 - */ - - if (round_no == 0) { - /* Cannot wrap: each object is at least 8 bytes so count is - * at most 1/8 of that. - */ - curr_limit = count_all * 2; - } else { - curr_limit = (curr_limit * 3) / 4; /* Decrease by 25% every round */ - } - DUK_D(DUK_DPRINT("finalizer round %ld complete, %ld objects, tried to execute %ld finalizers, current limit is %ld", - (long) round_no, (long) count_all, (long) count_finalized, (long) curr_limit)); - - if (count_finalized == 0) { - DUK_D(DUK_DPRINT("no more finalizable objects, forced finalization finished")); - break; - } - if (count_finalized >= curr_limit) { - DUK_D(DUK_DPRINT("finalizer count above limit, potentially runaway finalizer; skip remaining finalizers")); - break; - } - } - - DUK_ASSERT(heap->ms_running == 1); - heap->ms_running = 0; - DUK_ASSERT(heap->pf_prevent_count == 1); - heap->pf_prevent_count = 0; -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -DUK_INTERNAL void duk_heap_free(duk_heap *heap) { - DUK_D(DUK_DPRINT("free heap: %p", (void *) heap)); - -#if defined(DUK_USE_DEBUG) - duk_heap_strtable_dump(heap); -#endif - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - /* Detach a debugger if attached (can be called multiple times) - * safely. - */ - /* XXX: Add a flag to reject an attempt to re-attach? Otherwise - * the detached callback may immediately reattach. - */ - duk_debug_do_detach(heap); -#endif - - /* Execute finalizers before freeing the heap, even for reachable - * objects. This gives finalizers the chance to free any native - * resources like file handles, allocations made outside Duktape, - * etc. This is quite tricky to get right, so that all finalizer - * guarantees are honored. - * - * Run mark-and-sweep a few times just in case (unreachable object - * finalizers run already here). The last round must rescue objects - * from the previous round without running any more finalizers. This - * ensures rescued objects get their FINALIZED flag cleared so that - * their finalizer is called once more in forced finalization to - * satisfy finalizer guarantees. However, we don't want to run any - * more finalizers because that'd required one more loop, and so on. - * - * XXX: this perhaps requires an execution time limit. - */ - DUK_D(DUK_DPRINT("execute finalizers before freeing heap")); - DUK_ASSERT(heap->pf_skip_finalizers == 0); - DUK_D(DUK_DPRINT("forced gc #1 in heap destruction")); - duk_heap_mark_and_sweep(heap, 0); - DUK_D(DUK_DPRINT("forced gc #2 in heap destruction")); - duk_heap_mark_and_sweep(heap, 0); - DUK_D(DUK_DPRINT("forced gc #3 in heap destruction (don't run finalizers)")); - heap->pf_skip_finalizers = 1; - duk_heap_mark_and_sweep(heap, 0); /* Skip finalizers; queue finalizable objects to heap_allocated. */ - - /* There are never objects in refzero_list at this point, or at any - * point beyond a DECREF (even a DECREF_NORZ). Since Duktape 2.1 - * refzero_list processing is side effect free, so it is always - * processed to completion by a DECREF initially triggering a zero - * refcount. - */ -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */ -#endif -#if defined(DUK_USE_FINALIZER_SUPPORT) - DUK_ASSERT(heap->finalize_list == NULL); /* Last mark-and-sweep with skip_finalizers. */ -#endif - -#if defined(DUK_USE_FINALIZER_SUPPORT) - DUK_D(DUK_DPRINT("run finalizers for remaining finalizable objects")); - DUK_HEAP_SET_FINALIZER_NORESCUE(heap); /* Rescue no longer supported. */ - duk__free_run_finalizers(heap); -#endif /* DUK_USE_FINALIZER_SUPPORT */ - - /* Note: heap->heap_thread, heap->curr_thread, and heap->heap_object - * are on the heap allocated list. - */ - - DUK_D(DUK_DPRINT("freeing temporary freelists")); - duk_heap_free_freelists(heap); - - DUK_D(DUK_DPRINT("freeing heap_allocated of heap: %p", (void *) heap)); - duk__free_allocated(heap); - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always processed to completion inline. */ -#endif - -#if defined(DUK_USE_FINALIZER_SUPPORT) - DUK_D(DUK_DPRINT("freeing finalize_list of heap: %p", (void *) heap)); - duk__free_finalize_list(heap); -#endif - - DUK_D(DUK_DPRINT("freeing string table of heap: %p", (void *) heap)); - duk__free_stringtable(heap); - - DUK_D(DUK_DPRINT("freeing heap structure: %p", (void *) heap)); - heap->free_func(heap->heap_udata, heap); -} - -/* - * Allocate a heap. - * - * String table is initialized with built-in strings from genbuiltins.py, - * either by dynamically creating the strings or by referring to ROM strings. - */ - -#if defined(DUK_USE_ROM_STRINGS) -DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { -#if defined(DUK_USE_ASSERTIONS) - duk_small_uint_t i; -#endif - - DUK_UNREF(heap); - - /* With ROM-based strings, heap->strs[] and thr->strs[] are omitted - * so nothing to initialize for strs[]. - */ - -#if defined(DUK_USE_ASSERTIONS) - for (i = 0; i < sizeof(duk_rom_strings_lookup) / sizeof(const duk_hstring *); i++) { - const duk_hstring *h; - duk_uint32_t hash; - - h = duk_rom_strings_lookup[i]; - while (h != NULL) { - hash = duk_heap_hashstring(heap, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); - DUK_DD(DUK_DDPRINT("duk_rom_strings_lookup[%d] -> hash 0x%08lx, computed 0x%08lx", - (int) i, (unsigned long) DUK_HSTRING_GET_HASH(h), (unsigned long) hash)); - DUK_ASSERT(hash == (duk_uint32_t) DUK_HSTRING_GET_HASH(h)); - - h = (const duk_hstring *) h->hdr.h_next; - } - } -#endif - return 1; -} -#else /* DUK_USE_ROM_STRINGS */ - -DUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) { - duk_bitdecoder_ctx bd_ctx; - duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */ - duk_small_uint_t i; - - DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); - bd->data = (const duk_uint8_t *) duk_strings_data; - bd->length = (duk_size_t) DUK_STRDATA_DATA_LENGTH; - - for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { - duk_uint8_t tmp[DUK_STRDATA_MAX_STRLEN]; - duk_small_uint_t len; - duk_hstring *h; - - len = duk_bd_decode_bitpacked_string(bd, tmp); - - /* No need to length check string: it will never exceed even - * the 16-bit length maximum. - */ - DUK_ASSERT(len <= 0xffffUL); - DUK_DDD(DUK_DDDPRINT("intern built-in string %ld", (long) i)); - h = duk_heap_strtable_intern(heap, tmp, len); - if (!h) { - goto failed; - } - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)); - - /* Special flags checks. Since these strings are always - * reachable and a string cannot appear twice in the string - * table, there's no need to check/set these flags elsewhere. - * The 'internal' flag is set by string intern code. - */ - if (i == DUK_STRIDX_EVAL || i == DUK_STRIDX_LC_ARGUMENTS) { - DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(h); - } - if (i >= DUK_STRIDX_START_RESERVED && i < DUK_STRIDX_END_RESERVED) { - DUK_HSTRING_SET_RESERVED_WORD(h); - if (i >= DUK_STRIDX_START_STRICT_RESERVED) { - DUK_HSTRING_SET_STRICT_RESERVED_WORD(h); - } - } - - DUK_DDD(DUK_DDDPRINT("interned: %!O", (duk_heaphdr *) h)); - - /* XXX: The incref macro takes a thread pointer but doesn't - * use it right now. - */ - DUK_HSTRING_INCREF(_never_referenced_, h); - -#if defined(DUK_USE_HEAPPTR16) - heap->strs16[i] = DUK_USE_HEAPPTR_ENC16(heap->heap_udata, (void *) h); -#else - heap->strs[i] = h; -#endif - } - - return 1; - - failed: - return 0; -} -#endif /* DUK_USE_ROM_STRINGS */ - -DUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) { - duk_hthread *thr; - - DUK_D(DUK_DPRINT("heap init: alloc heap thread")); - thr = duk_hthread_alloc_unchecked(heap, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); - if (thr == NULL) { - DUK_D(DUK_DPRINT("failed to alloc heap_thread")); - return 0; - } - thr->state = DUK_HTHREAD_STATE_INACTIVE; -#if defined(DUK_USE_ROM_STRINGS) - /* No strs[] pointer. */ -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) - thr->strs16 = heap->strs16; -#else - thr->strs = heap->strs; -#endif -#endif /* DUK_USE_ROM_STRINGS */ - - heap->heap_thread = thr; - DUK_HTHREAD_INCREF(thr, thr); /* Note: first argument not really used */ - - /* 'thr' is now reachable */ - - DUK_D(DUK_DPRINT("heap init: init heap thread stacks")); - if (!duk_hthread_init_stacks(heap, thr)) { - return 0; - } - - /* XXX: this may now fail, and is not handled correctly */ - duk_hthread_create_builtin_objects(thr); - - /* default prototype */ - DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) thr, thr->builtins[DUK_BIDX_THREAD_PROTOTYPE]); - - return 1; -} - -#if defined(DUK_USE_DEBUG) -#define DUK__DUMPSZ(t) do { \ - DUK_D(DUK_DPRINT("" #t "=%ld", (long) sizeof(t))); \ - } while (0) - -/* These is not 100% because format would need to be non-portable "long long". - * Also print out as doubles to catch cases where the "long" type is not wide - * enough; the limits will then not be printed accurately but the magnitude - * will be correct. - */ -#define DUK__DUMPLM_SIGNED_RAW(t,a,b) do { \ - DUK_D(DUK_DPRINT(t "=[%ld,%ld]=[%lf,%lf]", \ - (long) (a), (long) (b), \ - (double) (a), (double) (b))); \ - } while (0) -#define DUK__DUMPLM_UNSIGNED_RAW(t,a,b) do { \ - DUK_D(DUK_DPRINT(t "=[%lu,%lu]=[%lf,%lf]", \ - (unsigned long) (a), (unsigned long) (b), \ - (double) (a), (double) (b))); \ - } while (0) -#define DUK__DUMPLM_SIGNED(t) do { \ - DUK__DUMPLM_SIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ - } while (0) -#define DUK__DUMPLM_UNSIGNED(t) do { \ - DUK__DUMPLM_UNSIGNED_RAW("DUK_" #t "_{MIN,MAX}", DUK_##t##_MIN, DUK_##t##_MAX); \ - } while (0) - -DUK_LOCAL void duk__dump_type_sizes(void) { - DUK_D(DUK_DPRINT("sizeof()")); - - /* basic platform types */ - DUK__DUMPSZ(char); - DUK__DUMPSZ(short); - DUK__DUMPSZ(int); - DUK__DUMPSZ(long); - DUK__DUMPSZ(double); - DUK__DUMPSZ(void *); - DUK__DUMPSZ(size_t); - - /* basic types from duk_features.h */ - DUK__DUMPSZ(duk_uint8_t); - DUK__DUMPSZ(duk_int8_t); - DUK__DUMPSZ(duk_uint16_t); - DUK__DUMPSZ(duk_int16_t); - DUK__DUMPSZ(duk_uint32_t); - DUK__DUMPSZ(duk_int32_t); - DUK__DUMPSZ(duk_uint64_t); - DUK__DUMPSZ(duk_int64_t); - DUK__DUMPSZ(duk_uint_least8_t); - DUK__DUMPSZ(duk_int_least8_t); - DUK__DUMPSZ(duk_uint_least16_t); - DUK__DUMPSZ(duk_int_least16_t); - DUK__DUMPSZ(duk_uint_least32_t); - DUK__DUMPSZ(duk_int_least32_t); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPSZ(duk_uint_least64_t); - DUK__DUMPSZ(duk_int_least64_t); -#endif - DUK__DUMPSZ(duk_uint_fast8_t); - DUK__DUMPSZ(duk_int_fast8_t); - DUK__DUMPSZ(duk_uint_fast16_t); - DUK__DUMPSZ(duk_int_fast16_t); - DUK__DUMPSZ(duk_uint_fast32_t); - DUK__DUMPSZ(duk_int_fast32_t); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPSZ(duk_uint_fast64_t); - DUK__DUMPSZ(duk_int_fast64_t); -#endif - DUK__DUMPSZ(duk_uintptr_t); - DUK__DUMPSZ(duk_intptr_t); - DUK__DUMPSZ(duk_uintmax_t); - DUK__DUMPSZ(duk_intmax_t); - DUK__DUMPSZ(duk_double_t); - - /* important chosen base types */ - DUK__DUMPSZ(duk_int_t); - DUK__DUMPSZ(duk_uint_t); - DUK__DUMPSZ(duk_int_fast_t); - DUK__DUMPSZ(duk_uint_fast_t); - DUK__DUMPSZ(duk_small_int_t); - DUK__DUMPSZ(duk_small_uint_t); - DUK__DUMPSZ(duk_small_int_fast_t); - DUK__DUMPSZ(duk_small_uint_fast_t); - - /* some derived types */ - DUK__DUMPSZ(duk_codepoint_t); - DUK__DUMPSZ(duk_ucodepoint_t); - DUK__DUMPSZ(duk_idx_t); - DUK__DUMPSZ(duk_errcode_t); - DUK__DUMPSZ(duk_uarridx_t); - - /* tval */ - DUK__DUMPSZ(duk_double_union); - DUK__DUMPSZ(duk_tval); - - /* structs from duk_forwdecl.h */ - DUK__DUMPSZ(duk_jmpbuf); /* just one 'int' for C++ exceptions */ - DUK__DUMPSZ(duk_heaphdr); - DUK__DUMPSZ(duk_heaphdr_string); - DUK__DUMPSZ(duk_hstring); - DUK__DUMPSZ(duk_hstring_external); - DUK__DUMPSZ(duk_hobject); - DUK__DUMPSZ(duk_harray); - DUK__DUMPSZ(duk_hcompfunc); - DUK__DUMPSZ(duk_hnatfunc); - DUK__DUMPSZ(duk_hdecenv); - DUK__DUMPSZ(duk_hobjenv); - DUK__DUMPSZ(duk_hthread); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - DUK__DUMPSZ(duk_hbufobj); -#endif - DUK__DUMPSZ(duk_hproxy); - DUK__DUMPSZ(duk_hbuffer); - DUK__DUMPSZ(duk_hbuffer_fixed); - DUK__DUMPSZ(duk_hbuffer_dynamic); - DUK__DUMPSZ(duk_hbuffer_external); - DUK__DUMPSZ(duk_propaccessor); - DUK__DUMPSZ(duk_propvalue); - DUK__DUMPSZ(duk_propdesc); - DUK__DUMPSZ(duk_heap); - DUK__DUMPSZ(duk_activation); - DUK__DUMPSZ(duk_catcher); - DUK__DUMPSZ(duk_strcache); - DUK__DUMPSZ(duk_ljstate); - DUK__DUMPSZ(duk_fixedbuffer); - DUK__DUMPSZ(duk_bitdecoder_ctx); - DUK__DUMPSZ(duk_bitencoder_ctx); - DUK__DUMPSZ(duk_token); - DUK__DUMPSZ(duk_re_token); - DUK__DUMPSZ(duk_lexer_point); - DUK__DUMPSZ(duk_lexer_ctx); - DUK__DUMPSZ(duk_compiler_instr); - DUK__DUMPSZ(duk_compiler_func); - DUK__DUMPSZ(duk_compiler_ctx); - DUK__DUMPSZ(duk_re_matcher_ctx); - DUK__DUMPSZ(duk_re_compiler_ctx); -} -DUK_LOCAL void duk__dump_type_limits(void) { - DUK_D(DUK_DPRINT("limits")); - - /* basic types */ - DUK__DUMPLM_SIGNED(INT8); - DUK__DUMPLM_UNSIGNED(UINT8); - DUK__DUMPLM_SIGNED(INT_FAST8); - DUK__DUMPLM_UNSIGNED(UINT_FAST8); - DUK__DUMPLM_SIGNED(INT_LEAST8); - DUK__DUMPLM_UNSIGNED(UINT_LEAST8); - DUK__DUMPLM_SIGNED(INT16); - DUK__DUMPLM_UNSIGNED(UINT16); - DUK__DUMPLM_SIGNED(INT_FAST16); - DUK__DUMPLM_UNSIGNED(UINT_FAST16); - DUK__DUMPLM_SIGNED(INT_LEAST16); - DUK__DUMPLM_UNSIGNED(UINT_LEAST16); - DUK__DUMPLM_SIGNED(INT32); - DUK__DUMPLM_UNSIGNED(UINT32); - DUK__DUMPLM_SIGNED(INT_FAST32); - DUK__DUMPLM_UNSIGNED(UINT_FAST32); - DUK__DUMPLM_SIGNED(INT_LEAST32); - DUK__DUMPLM_UNSIGNED(UINT_LEAST32); -#if defined(DUK_USE_64BIT_OPS) - DUK__DUMPLM_SIGNED(INT64); - DUK__DUMPLM_UNSIGNED(UINT64); - DUK__DUMPLM_SIGNED(INT_FAST64); - DUK__DUMPLM_UNSIGNED(UINT_FAST64); - DUK__DUMPLM_SIGNED(INT_LEAST64); - DUK__DUMPLM_UNSIGNED(UINT_LEAST64); -#endif - DUK__DUMPLM_SIGNED(INTPTR); - DUK__DUMPLM_UNSIGNED(UINTPTR); - DUK__DUMPLM_SIGNED(INTMAX); - DUK__DUMPLM_UNSIGNED(UINTMAX); - - /* derived types */ - DUK__DUMPLM_SIGNED(INT); - DUK__DUMPLM_UNSIGNED(UINT); - DUK__DUMPLM_SIGNED(INT_FAST); - DUK__DUMPLM_UNSIGNED(UINT_FAST); - DUK__DUMPLM_SIGNED(SMALL_INT); - DUK__DUMPLM_UNSIGNED(SMALL_UINT); - DUK__DUMPLM_SIGNED(SMALL_INT_FAST); - DUK__DUMPLM_UNSIGNED(SMALL_UINT_FAST); -} - -DUK_LOCAL void duk__dump_misc_options(void) { - DUK_D(DUK_DPRINT("DUK_VERSION: %ld", (long) DUK_VERSION)); - DUK_D(DUK_DPRINT("DUK_GIT_DESCRIBE: %s", DUK_GIT_DESCRIBE)); - DUK_D(DUK_DPRINT("OS string: %s", DUK_USE_OS_STRING)); - DUK_D(DUK_DPRINT("architecture string: %s", DUK_USE_ARCH_STRING)); - DUK_D(DUK_DPRINT("compiler string: %s", DUK_USE_COMPILER_STRING)); - DUK_D(DUK_DPRINT("debug level: %ld", (long) DUK_USE_DEBUG_LEVEL)); -#if defined(DUK_USE_PACKED_TVAL) - DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: yes")); -#else - DUK_D(DUK_DPRINT("DUK_USE_PACKED_TVAL: no")); -#endif -#if defined(DUK_USE_VARIADIC_MACROS) - DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: yes")); -#else - DUK_D(DUK_DPRINT("DUK_USE_VARIADIC_MACROS: no")); -#endif -#if defined(DUK_USE_INTEGER_LE) - DUK_D(DUK_DPRINT("integer endianness: little")); -#elif defined(DUK_USE_INTEGER_ME) - DUK_D(DUK_DPRINT("integer endianness: mixed")); -#elif defined(DUK_USE_INTEGER_BE) - DUK_D(DUK_DPRINT("integer endianness: big")); -#else - DUK_D(DUK_DPRINT("integer endianness: ???")); -#endif -#if defined(DUK_USE_DOUBLE_LE) - DUK_D(DUK_DPRINT("IEEE double endianness: little")); -#elif defined(DUK_USE_DOUBLE_ME) - DUK_D(DUK_DPRINT("IEEE double endianness: mixed")); -#elif defined(DUK_USE_DOUBLE_BE) - DUK_D(DUK_DPRINT("IEEE double endianness: big")); -#else - DUK_D(DUK_DPRINT("IEEE double endianness: ???")); -#endif -} -#endif /* DUK_USE_DEBUG */ - -DUK_INTERNAL -duk_heap *duk_heap_alloc(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *heap_udata, - duk_fatal_function fatal_func) { - duk_heap *res = NULL; - duk_uint32_t st_initsize; - - DUK_D(DUK_DPRINT("allocate heap")); - - /* - * Random config sanity asserts - */ - - DUK_ASSERT(DUK_USE_STRTAB_MINSIZE >= 64); - - DUK_ASSERT((DUK_HTYPE_STRING & 0x01U) == 0); - DUK_ASSERT((DUK_HTYPE_BUFFER & 0x01U) == 0); - DUK_ASSERT((DUK_HTYPE_OBJECT & 0x01U) == 1); /* DUK_HEAPHDR_IS_OBJECT() relies ont his. */ - - /* - * Debug dump type sizes - */ - -#if defined(DUK_USE_DEBUG) - duk__dump_misc_options(); - duk__dump_type_sizes(); - duk__dump_type_limits(); -#endif - - /* - * If selftests enabled, run them as early as possible. - */ - -#if defined(DUK_USE_SELF_TESTS) - DUK_D(DUK_DPRINT("run self tests")); - if (duk_selftest_run_tests(alloc_func, realloc_func, free_func, heap_udata) > 0) { - fatal_func(heap_udata, "self test(s) failed"); - } - DUK_D(DUK_DPRINT("self tests passed")); -#endif - - /* - * Important assert-like checks that should be enabled even - * when assertions are otherwise not enabled. - */ - -#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE) - /* Can't check sizeof() using preprocessor so explicit check. - * This will be optimized away in practice; unfortunately a - * warning is generated on some compilers as a result. - */ -#if defined(DUK_USE_PACKED_TVAL) - if (sizeof(duk_tval) != 8) { -#else - if (sizeof(duk_tval) != 16) { -#endif - fatal_func(heap_udata, "sizeof(duk_tval) not 8 or 16, cannot use DUK_USE_EXEC_REGCONST_OPTIMIZE option"); - } -#endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ - - /* - * Computed values (e.g. INFINITY) - */ - -#if defined(DUK_USE_COMPUTED_NAN) - do { - /* Workaround for some exotic platforms where NAN is missing - * and the expression (0.0 / 0.0) does NOT result in a NaN. - * Such platforms use the global 'duk_computed_nan' which must - * be initialized at runtime. Use 'volatile' to ensure that - * the compiler will actually do the computation and not try - * to do constant folding which might result in the original - * problem. - */ - volatile double dbl1 = 0.0; - volatile double dbl2 = 0.0; - duk_computed_nan = dbl1 / dbl2; - } while (0); -#endif - -#if defined(DUK_USE_COMPUTED_INFINITY) - do { - /* Similar workaround for INFINITY. */ - volatile double dbl1 = 1.0; - volatile double dbl2 = 0.0; - duk_computed_infinity = dbl1 / dbl2; - } while (0); -#endif - - /* - * Allocate heap struct - * - * Use a raw call, all macros expect the heap to be initialized - */ - -#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 1) - goto failed; -#endif - DUK_D(DUK_DPRINT("alloc duk_heap object")); - res = (duk_heap *) alloc_func(heap_udata, sizeof(duk_heap)); - if (!res) { - goto failed; - } - - /* - * Zero the struct, and start initializing roughly in order - */ - - DUK_MEMZERO(res, sizeof(*res)); -#if defined(DUK_USE_ASSERTIONS) - res->heap_initializing = 1; -#endif - - /* explicit NULL inits */ -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->heap_udata = NULL; - res->heap_allocated = NULL; -#if defined(DUK_USE_REFERENCE_COUNTING) - res->refzero_list = NULL; -#endif -#if defined(DUK_USE_FINALIZER_SUPPORT) - res->finalize_list = NULL; -#if defined(DUK_USE_ASSERTIONS) - res->currently_finalizing = NULL; -#endif -#endif -#if defined(DUK_USE_CACHE_ACTIVATION) - res->activation_free = NULL; -#endif -#if defined(DUK_USE_CACHE_CATCHER) - res->catcher_free = NULL; -#endif - res->heap_thread = NULL; - res->curr_thread = NULL; - res->heap_object = NULL; -#if defined(DUK_USE_STRTAB_PTRCOMP) - res->strtable16 = NULL; -#else - res->strtable = NULL; -#endif -#if defined(DUK_USE_ROM_STRINGS) - /* no res->strs[] */ -#else /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_HEAPPTR16) - /* res->strs16[] is zeroed and zero decodes to NULL, so no NULL inits. */ -#else - { - duk_small_uint_t i; - for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { - res->strs[i] = NULL; - } - } -#endif -#endif /* DUK_USE_ROM_STRINGS */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - res->dbg_read_cb = NULL; - res->dbg_write_cb = NULL; - res->dbg_peek_cb = NULL; - res->dbg_read_flush_cb = NULL; - res->dbg_write_flush_cb = NULL; - res->dbg_request_cb = NULL; - res->dbg_udata = NULL; - res->dbg_pause_act = NULL; -#endif -#endif /* DUK_USE_EXPLICIT_NULL_INIT */ - - res->alloc_func = alloc_func; - res->realloc_func = realloc_func; - res->free_func = free_func; - res->heap_udata = heap_udata; - res->fatal_func = fatal_func; - - /* XXX: for now there's a pointer packing zero assumption, i.e. - * NULL <=> compressed pointer 0. If this is removed, may need - * to precompute e.g. null16 here. - */ - - /* res->ms_trigger_counter == 0 -> now causes immediate GC; which is OK */ - - /* Prevent mark-and-sweep and finalizer execution until heap is completely - * initialized. - */ - DUK_ASSERT(res->ms_prevent_count == 0); - DUK_ASSERT(res->pf_prevent_count == 0); - res->ms_prevent_count = 1; - res->pf_prevent_count = 1; - DUK_ASSERT(res->ms_running == 0); - - res->call_recursion_depth = 0; - res->call_recursion_limit = DUK_USE_NATIVE_CALL_RECLIMIT; - - /* XXX: use the pointer as a seed for now: mix in time at least */ - - /* The casts through duk_intptr_t is to avoid the following GCC warning: - * - * warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] - * - * This still generates a /Wp64 warning on VS2010 when compiling for x86. - */ -#if defined(DUK_USE_ROM_STRINGS) - /* XXX: make a common DUK_USE_ option, and allow custom fixed seed? */ - DUK_D(DUK_DPRINT("using rom strings, force heap hash_seed to fixed value 0x%08lx", (long) DUK__FIXED_HASH_SEED)); - res->hash_seed = (duk_uint32_t) DUK__FIXED_HASH_SEED; -#else /* DUK_USE_ROM_STRINGS */ - res->hash_seed = (duk_uint32_t) (duk_intptr_t) res; -#if !defined(DUK_USE_STRHASH_DENSE) - res->hash_seed ^= 5381; /* Bernstein hash init value is normally 5381; XOR it in in case pointer low bits are 0 */ -#endif -#endif /* DUK_USE_ROM_STRINGS */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->lj.jmpbuf_ptr = NULL; -#endif - DUK_ASSERT(res->lj.type == DUK_LJ_TYPE_UNKNOWN); /* zero */ - DUK_ASSERT(res->lj.iserror == 0); - DUK_TVAL_SET_UNDEFINED(&res->lj.value1); - DUK_TVAL_SET_UNDEFINED(&res->lj.value2); - - DUK_ASSERT_LJSTATE_UNSET(res); - - /* - * Init stringtable: fixed variant - */ - - st_initsize = DUK_USE_STRTAB_MINSIZE; -#if defined(DUK_USE_STRTAB_PTRCOMP) - res->strtable16 = (duk_uint16_t *) alloc_func(heap_udata, sizeof(duk_uint16_t) * st_initsize); - if (res->strtable16 == NULL) { - goto failed; - } -#else - res->strtable = (duk_hstring **) alloc_func(heap_udata, sizeof(duk_hstring *) * st_initsize); - if (res->strtable == NULL) { - goto failed; - } -#endif - res->st_size = st_initsize; - res->st_mask = st_initsize - 1; -#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE) - DUK_ASSERT(res->st_count == 0); -#endif - -#if defined(DUK_USE_STRTAB_PTRCOMP) - /* zero assumption */ - DUK_MEMZERO(res->strtable16, sizeof(duk_uint16_t) * st_initsize); -#else -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - { - duk_small_uint_t i; - for (i = 0; i < st_initsize; i++) { - res->strtable[i] = NULL; - } - } -#else - DUK_MEMZERO(res->strtable, sizeof(duk_hstring *) * st_initsize); -#endif /* DUK_USE_EXPLICIT_NULL_INIT */ -#endif /* DUK_USE_STRTAB_PTRCOMP */ - - /* - * Init stringcache - */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - { - duk_small_uint_t i; - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - res->strcache[i].h = NULL; - } - } -#endif - - /* XXX: error handling is incomplete. It would be cleanest if - * there was a setjmp catchpoint, so that all init code could - * freely throw errors. If that were the case, the return code - * passing here could be removed. - */ - - /* - * Init built-in strings - */ - -#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 2) - goto failed; -#endif - DUK_D(DUK_DPRINT("heap init: initialize heap strings")); - if (!duk__init_heap_strings(res)) { - goto failed; - } - - /* - * Init the heap thread - */ - -#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 3) - goto failed; -#endif - DUK_D(DUK_DPRINT("heap init: initialize heap thread")); - if (!duk__init_heap_thread(res)) { - goto failed; - } - - /* - * Init the heap object - */ - -#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 4) - goto failed; -#endif - DUK_D(DUK_DPRINT("heap init: initialize heap object")); - DUK_ASSERT(res->heap_thread != NULL); - res->heap_object = duk_hobject_alloc_unchecked(res, DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT)); - if (res->heap_object == NULL) { - goto failed; - } - DUK_HOBJECT_INCREF(res->heap_thread, res->heap_object); - - /* - * Odds and ends depending on the heap thread - */ - -#if !defined(DUK_USE_GET_RANDOM_DOUBLE) -#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) - res->rnd_state = (duk_uint32_t) duk_time_get_ecmascript_time(res->heap_thread); - duk_util_tinyrandom_prepare_seed(res->heap_thread); -#else - res->rnd_state[0] = (duk_uint64_t) duk_time_get_ecmascript_time(res->heap_thread); - DUK_ASSERT(res->rnd_state[1] == 0); /* Not filled here, filled in by seed preparation. */ -#if 0 /* Manual test values matching misc/xoroshiro128plus_test.c. */ - res->rnd_state[0] = DUK_U64_CONSTANT(0xdeadbeef12345678); - res->rnd_state[1] = DUK_U64_CONSTANT(0xcafed00d12345678); -#endif - duk_util_tinyrandom_prepare_seed(res->heap_thread); - /* Mix in heap pointer: this ensures that if two Duktape heaps are - * created on the same millisecond, they get a different PRNG - * sequence (unless e.g. virtual memory addresses cause also the - * heap object pointer to be the same). - */ - { - duk_uint64_t tmp_u64; - tmp_u64 = 0; - DUK_MEMCPY((void *) &tmp_u64, - (const void *) &res, - (size_t) (sizeof(void *) >= sizeof(duk_uint64_t) ? sizeof(duk_uint64_t) : sizeof(void *))); - res->rnd_state[1] ^= tmp_u64; - } - do { - duk_small_uint_t i; - for (i = 0; i < 10; i++) { - /* Throw away a few initial random numbers just in - * case. Probably unnecessary due to SplitMix64 - * preparation. - */ - (void) duk_util_tinyrandom_get_double(res->heap_thread); - } - } while (0); -#endif -#endif - - /* - * Allow finalizer and mark-and-sweep processing. - */ - - DUK_D(DUK_DPRINT("heap init: allow finalizer/mark-and-sweep processing")); - DUK_ASSERT(res->ms_prevent_count == 1); - DUK_ASSERT(res->pf_prevent_count == 1); - res->ms_prevent_count = 0; - res->pf_prevent_count = 0; - DUK_ASSERT(res->ms_running == 0); -#if defined(DUK_USE_ASSERTIONS) - res->heap_initializing = 0; -#endif - - /* - * All done. - */ - - DUK_D(DUK_DPRINT("allocated heap: %p", (void *) res)); - return res; - - failed: - DUK_D(DUK_DPRINT("heap allocation failed")); - - if (res != NULL) { - /* Assumes that allocated pointers and alloc funcs are valid - * if res exists. - */ - DUK_ASSERT(res->ms_prevent_count == 1); - DUK_ASSERT(res->pf_prevent_count == 1); - DUK_ASSERT(res->ms_running == 0); - if (res->heap_thread != NULL) { - res->ms_prevent_count = 0; - res->pf_prevent_count = 0; - } -#if defined(DUK_USE_ASSERTIONS) - res->heap_initializing = 0; -#endif - - DUK_ASSERT(res->alloc_func != NULL); - DUK_ASSERT(res->realloc_func != NULL); - DUK_ASSERT(res->free_func != NULL); - duk_heap_free(res); - } - - return NULL; -} - -/* automatic undefs */ -#undef DUK__DUMPLM_SIGNED -#undef DUK__DUMPLM_SIGNED_RAW -#undef DUK__DUMPLM_UNSIGNED -#undef DUK__DUMPLM_UNSIGNED_RAW -#undef DUK__DUMPSZ -#undef DUK__FIXED_HASH_SEED -#line 1 "duk_heap_finalize.c" -/* - * Finalizer handling. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) - -/* - * Fake torture finalizer. - */ - -#if defined(DUK_USE_FINALIZER_TORTURE) -DUK_LOCAL duk_ret_t duk__fake_global_finalizer(duk_hthread *thr) { - DUK_DD(DUK_DDPRINT("fake global torture finalizer executed")); - - /* Require a lot of stack to force a value stack grow/shrink. */ - duk_require_stack(thr, 100000); - - /* Force a reallocation with pointer change for value stack - * to maximize side effects. - */ - duk_hthread_valstack_torture_realloc(thr); - - /* Inner function call, error throw. */ - duk_eval_string_noresult(thr, - "(function dummy() {\n" - " dummy.prototype = null; /* break reference loop */\n" - " try {\n" - " throw 'fake-finalizer-dummy-error';\n" - " } catch (e) {\n" - " void e;\n" - " }\n" - "})()"); - - /* The above creates garbage (e.g. a function instance). Because - * the function/prototype reference loop is broken, it gets collected - * immediately by DECREF. If Function.prototype has a _Finalizer - * property (happens in some test cases), the garbage gets queued to - * finalize_list. This still won't cause an infinite loop because - * the torture finalizer is called once per finalize_list run and - * the garbage gets handled in the same run. (If the garbage needs - * mark-and-sweep collection, an infinite loop might ensue.) - */ - return 0; -} - -DUK_LOCAL void duk__run_global_torture_finalizer(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - - /* Avoid fake finalization when callstack limit is near. Otherwise - * a callstack limit error will be created, then refzero'ed. The - * +5 headroom is conservative. - */ - if (thr->heap->call_recursion_depth + 5 >= thr->heap->call_recursion_limit || - thr->callstack_top + 5 >= DUK_USE_CALLSTACK_LIMIT) { - DUK_D(DUK_DPRINT("skip global torture finalizer, too little headroom for call recursion or call stack size")); - return; - } - - /* Run fake finalizer. Avoid creating unnecessary garbage. */ - duk_push_c_function(thr, duk__fake_global_finalizer, 0 /*nargs*/); - (void) duk_pcall(thr, 0 /*nargs*/); - duk_pop(thr); -} -#endif /* DUK_USE_FINALIZER_TORTURE */ - -/* - * Process the finalize_list to completion. - * - * An object may be placed on finalize_list by either refcounting or - * mark-and-sweep. The refcount of objects placed by refcounting will be - * zero; the refcount of objects placed by mark-and-sweep is > 0. In both - * cases the refcount is bumped by 1 artificially so that a REFZERO event - * can never happen while an object is waiting for finalization. Without - * this bump a REFZERO could now happen because user code may call - * duk_push_heapptr() and then pop a value even when it's on finalize_list. - * - * List processing assumes refcounts are kept up-to-date at all times, so - * that once the finalizer returns, a zero refcount is a reliable reason to - * free the object immediately rather than place it back to the heap. This - * is the case because we run outside of refzero_list processing so that - * DECREF cascades are handled fully inline. - * - * For mark-and-sweep queued objects (had_zero_refcount false) the object - * may be freed immediately if its refcount is zero after the finalizer call - * (i.e. finalizer removed the reference loop for the object). If not, the - * next mark-and-sweep will collect the object unless it has become reachable - * (i.e. rescued) by that time and its refcount hasn't fallen to zero before - * that. Mark-and-sweep detects these objects because their FINALIZED flag - * is set. - * - * There's an inherent limitation for mark-and-sweep finalizer rescuing: an - * object won't get refinalized if (1) it's rescued, but (2) becomes - * unreachable before mark-and-sweep has had time to notice it. The next - * mark-and-sweep round simply doesn't have any information of whether the - * object has been unreachable the whole time or not (the only way to get - * that information would be a mark-and-sweep pass for *every finalized - * object*). This is awkward for the application because the mark-and-sweep - * round is not generally visible or under full application control. - * - * For refcount queued objects (had_zero_refcount true) the object is either - * immediately freed or rescued, and waiting for a mark-and-sweep round is not - * necessary (or desirable); FINALIZED is cleared when a rescued object is - * queued back to heap_allocated. The object is eligible for finalization - * again (either via refcounting or mark-and-sweep) immediately after being - * rescued. If a refcount finalized object is placed into an unreachable - * reference loop by its finalizer, it will get collected by mark-and-sweep - * and currently the finalizer will execute again. - * - * There's a special case where: - * - * - Mark-and-sweep queues an object to finalize_list for finalization. - * - The finalizer is executed, FINALIZED is set, and object is queued - * back to heap_allocated, waiting for a new mark-and-sweep round. - * - The object's refcount drops to zero before mark-and-sweep has a - * chance to run another round and make a rescue/free decision. - * - * This is now handled by refzero code: if an object has a finalizer but - * FINALIZED is already set, the object is freed without finalizer processing. - * The outcome is the same as if mark-and-sweep was executed at that point; - * mark-and-sweep would also free the object without another finalizer run. - * This could also be changed so that the refzero-triggered finalizer *IS* - * executed: being refzero collected implies someone has operated on the - * object so it hasn't been totally unreachable the whole time. This would - * risk a finalizer loop however. - */ - -DUK_INTERNAL void duk_heap_process_finalize_list(duk_heap *heap) { - duk_heaphdr *curr; -#if defined(DUK_USE_DEBUG) - duk_size_t count = 0; -#endif - - DUK_DDD(DUK_DDDPRINT("duk_heap_process_finalize_list: %p", (void *) heap)); - - if (heap->pf_prevent_count != 0) { - DUK_DDD(DUK_DDDPRINT("skip finalize_list processing: pf_prevent_count != 0")); - return; - } - - /* Heap alloc prevents mark-and-sweep before heap_thread is ready. */ - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(heap->heap_thread->valstack != NULL); -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); -#endif - - DUK_ASSERT(heap->pf_prevent_count == 0); - heap->pf_prevent_count = 1; - - /* Mark-and-sweep no longer needs to be prevented when running - * finalizers: mark-and-sweep skips any rescue decisions if there - * are any objects in finalize_list when mark-and-sweep is entered. - * This protects finalized objects from incorrect rescue decisions - * caused by finalize_list being a reachability root and only - * partially processed. Freeing decisions are not postponed. - */ - - /* When finalizer torture is enabled, make a fake finalizer call with - * maximum side effects regardless of whether finalize_list is empty. - */ -#if defined(DUK_USE_FINALIZER_TORTURE) - duk__run_global_torture_finalizer(heap->heap_thread); -#endif - - /* Process finalize_list until it becomes empty. There's currently no - * protection against a finalizer always creating more garbage. - */ - while ((curr = heap->finalize_list) != NULL) { -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_bool_t queue_back; -#endif - - DUK_DD(DUK_DDPRINT("processing finalize_list entry: %p -> %!iO", (void *) curr, curr)); - - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* Only objects have finalizers. */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr)); - DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(curr)); - DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr)); /* All objects on finalize_list will have this flag (except object being finalized right now). */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); /* Queueing code ensures. */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr)); /* ROM objects never get freed (or finalized). */ - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(heap->currently_finalizing == NULL); - heap->currently_finalizing = curr; -#endif - - /* Clear FINALIZABLE for object being finalized, so that - * duk_push_heapptr() can properly ignore the object. - */ - DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); - - if (DUK_LIKELY(!heap->pf_skip_finalizers)) { - /* Run the finalizer, duk_heap_run_finalizer() sets - * and checks for FINALIZED to prevent the finalizer - * from executing multiple times per finalization cycle. - * (This safeguard shouldn't be actually needed anymore). - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_bool_t had_zero_refcount; -#endif - - /* The object's refcount is >0 throughout so it won't be - * refzero processed prematurely. - */ -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); - had_zero_refcount = (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1); /* Preincremented on finalize_list insert. */ -#endif - - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); - duk_heap_run_finalizer(heap, (duk_hobject *) curr); /* must never longjmp */ - DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(curr)); - /* XXX: assert that object is still in finalize_list - * when duk_push_heapptr() allows automatic rescue. - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_DD(DUK_DDPRINT("refcount after finalizer (includes bump): %ld", (long) DUK_HEAPHDR_GET_REFCOUNT(curr))); - if (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1) { /* Only artificial bump in refcount? */ -#if defined(DUK_USE_DEBUG) - if (had_zero_refcount) { - DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (refcount queued)")); - } else { - DUK_DD(DUK_DDPRINT("finalized object's refcount is zero -> free immediately (mark-and-sweep queued)")); - } -#endif - queue_back = 0; - } else -#endif - { -#if defined(DUK_USE_REFERENCE_COUNTING) - queue_back = 1; - if (had_zero_refcount) { - /* When finalization is triggered - * by refzero and we queue the object - * back, clear FINALIZED right away - * so that the object can be refinalized - * immediately if necessary. - */ - DUK_HEAPHDR_CLEAR_FINALIZED(curr); - } -#endif - } - } else { - /* Used during heap destruction: don't actually run finalizers - * because we're heading into forced finalization. Instead, - * queue finalizable objects back to the heap_allocated list. - */ - DUK_D(DUK_DPRINT("skip finalizers flag set, queue object to heap_allocated without finalizing")); - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); -#if defined(DUK_USE_REFERENCE_COUNTING) - queue_back = 1; -#endif - } - - /* Dequeue object from finalize_list. Note that 'curr' may no - * longer be finalize_list head because new objects may have - * been queued to the list. As a result we can't optimize for - * the single-linked heap case and must scan the list for - * removal, typically the scan is very short however. - */ - DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap, curr); - - /* Queue back to heap_allocated or free immediately. */ -#if defined(DUK_USE_REFERENCE_COUNTING) - if (queue_back) { - /* FINALIZED is only cleared if object originally - * queued for finalization by refcounting. For - * mark-and-sweep FINALIZED is left set, so that - * next mark-and-sweep round can make a rescue/free - * decision. - */ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1); - DUK_HEAPHDR_PREDEC_REFCOUNT(curr); /* Remove artificial refcount bump. */ - DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr); - } else { - /* No need to remove the refcount bump here. */ - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */ - DUK_DD(DUK_DDPRINT("refcount finalize after finalizer call: %!O", curr)); - duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr); - duk_free_hobject(heap, (duk_hobject *) curr); - DUK_DD(DUK_DDPRINT("freed hobject after finalization: %p", (void *) curr)); - } -#else /* DUK_USE_REFERENCE_COUNTING */ - DUK_HEAPHDR_CLEAR_FINALIZABLE(curr); - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr); -#endif /* DUK_USE_REFERENCE_COUNTING */ - -#if defined(DUK_USE_DEBUG) - count++; -#endif - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(heap->currently_finalizing != NULL); - heap->currently_finalizing = NULL; -#endif - } - - /* finalize_list will always be processed completely. */ - DUK_ASSERT(heap->finalize_list == NULL); - -#if 0 - /* While NORZ macros are used above, this is unnecessary because the - * only pending side effects are now finalizers, and finalize_list is - * empty. - */ - DUK_REFZERO_CHECK_SLOW(heap->heap_thread); -#endif - - /* Prevent count may be bumped while finalizers run, but should always - * be reliably unbumped by the time we get here. - */ - DUK_ASSERT(heap->pf_prevent_count == 1); - heap->pf_prevent_count = 0; - -#if defined(DUK_USE_DEBUG) - DUK_DD(DUK_DDPRINT("duk_heap_process_finalize_list: %ld finalizers called", (long) count)); -#endif -} - -/* - * Run an duk_hobject finalizer. Must never throw an uncaught error - * (but may throw caught errors). - * - * There is no return value. Any return value or error thrown by - * the finalizer is ignored (although errors are debug logged). - * - * Notes: - * - * - The finalizer thread 'top' assertions are there because it is - * critical that strict stack policy is observed (i.e. no cruft - * left on the finalizer stack). - */ - -DUK_LOCAL duk_ret_t duk__finalize_helper(duk_hthread *thr, void *udata) { - DUK_ASSERT(thr != NULL); - DUK_UNREF(udata); - - DUK_DDD(DUK_DDDPRINT("protected finalization helper running")); - - /* [... obj] */ - - /* _Finalizer property is read without checking if the value is - * callable or even exists. This is intentional, and handled - * by throwing an error which is caught by the safe call wrapper. - * - * XXX: Finalizer lookup should traverse the prototype chain (to allow - * inherited finalizers) but should not invoke accessors or proxy object - * behavior. At the moment this lookup will invoke proxy behavior, so - * caller must ensure that this function is not called if the target is - * a Proxy. - */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FINALIZER); /* -> [... obj finalizer] */ - duk_dup_m2(thr); - duk_push_boolean(thr, DUK_HEAP_HAS_FINALIZER_NORESCUE(thr->heap)); - DUK_DDD(DUK_DDDPRINT("calling finalizer")); - duk_call(thr, 2); /* [ ... obj finalizer obj heapDestruct ] -> [ ... obj retval ] */ - DUK_DDD(DUK_DDDPRINT("finalizer returned successfully")); - return 0; - - /* Note: we rely on duk_safe_call() to fix up the stack for the caller, - * so we don't need to pop stuff here. There is no return value; - * caller determines rescued status based on object refcount. - */ -} - -DUK_INTERNAL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj) { - duk_hthread *thr; - duk_ret_t rc; -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t entry_top; -#endif - - DUK_DD(DUK_DDPRINT("running duk_hobject finalizer for object: %p", (void *) obj)); - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - thr = heap->heap_thread; - DUK_ASSERT(obj != NULL); - DUK_ASSERT_VALSTACK_SPACE(heap->heap_thread, 1); - -#if defined(DUK_USE_ASSERTIONS) - entry_top = duk_get_top(thr); -#endif - /* - * Get and call the finalizer. All of this must be wrapped - * in a protected call, because even getting the finalizer - * may trigger an error (getter may throw one, for instance). - */ - - /* ROM objects could inherit a finalizer, but they are never deemed - * unreachable by mark-and-sweep, and their refcount never falls to 0. - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); - - /* Duktape 2.1: finalize_list never contains objects with FINALIZED - * set, so no need to check here. - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)); -#if 0 - if (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)) { - DUK_D(DUK_DPRINT("object already finalized, avoid running finalizer twice: %!O", obj)); - return; - } -#endif - DUK_HEAPHDR_SET_FINALIZED((duk_heaphdr *) obj); /* ensure never re-entered until rescue cycle complete */ - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_HOBJECT_IS_PROXY(obj)) { - /* This may happen if duk_set_finalizer() or Duktape.fin() is - * called for a Proxy object. In such cases the fast finalizer - * flag will be set on the Proxy, not the target, and neither - * will be finalized. - */ - DUK_D(DUK_DPRINT("object is a Proxy, skip finalizer call")); - return; - } -#endif /* DUK_USE_ES6_PROXY */ - - duk_push_hobject(thr, obj); /* this also increases refcount by one */ - rc = duk_safe_call(thr, duk__finalize_helper, NULL /*udata*/, 0 /*nargs*/, 1 /*nrets*/); /* -> [... obj retval/error] */ - DUK_ASSERT_TOP(thr, entry_top + 2); /* duk_safe_call discipline */ - - if (rc != DUK_EXEC_SUCCESS) { - /* Note: we ask for one return value from duk_safe_call to get this - * error debugging here. - */ - DUK_D(DUK_DPRINT("wrapped finalizer call failed for object %p (ignored); error: %!T", - (void *) obj, (duk_tval *) duk_get_tval(thr, -1))); - } - duk_pop_2(thr); /* -> [...] */ - - DUK_ASSERT_TOP(thr, entry_top); -} - -#else /* DUK_USE_FINALIZER_SUPPORT */ - -/* nothing */ - -#endif /* DUK_USE_FINALIZER_SUPPORT */ -#line 1 "duk_heap_hashstring.c" -/* - * String hash computation (interning). - * - * String hashing is performance critical because a string hash is computed - * for all new strings which are candidates to be added to the string table. - * However, strings actually added to the string table go through a codepoint - * length calculation which dominates performance because it goes through - * every byte of the input string (but only for strings added). - * - * The string hash algorithm should be fast, but on the other hand provide - * good enough hashes to ensure both string table and object property table - * hash tables work reasonably well (i.e., there aren't too many collisions - * with real world inputs). Unless the hash is cryptographic, it's always - * possible to craft inputs with maximal hash collisions. - * - * NOTE: The hash algorithms must match tools/dukutil.py:duk_heap_hashstring() - * for ROM string support! - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_STRHASH_DENSE) -/* Constants for duk_hashstring(). */ -#define DUK__STRHASH_SHORTSTRING 4096L -#define DUK__STRHASH_MEDIUMSTRING (256L * 1024L) -#define DUK__STRHASH_BLOCKSIZE 256L - -DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) { - duk_uint32_t hash; - - /* Use Murmurhash2 directly for short strings, and use "block skipping" - * for long strings: hash an initial part and then sample the rest of - * the string with reasonably sized chunks. An initial offset for the - * sampling is computed based on a hash of the initial part of the string; - * this is done to (usually) avoid the case where all long strings have - * certain offset ranges which are never sampled. - * - * Skip should depend on length and bound the total time to roughly - * logarithmic. With current values: - * - * 1M string => 256 * 241 = 61696 bytes (0.06M) of hashing - * 1G string => 256 * 16321 = 4178176 bytes (3.98M) of hashing - * - * XXX: It would be better to compute the skip offset more "smoothly" - * instead of having a few boundary values. - */ - - /* note: mixing len into seed improves hashing when skipping */ - duk_uint32_t str_seed = heap->hash_seed ^ ((duk_uint32_t) len); - - if (len <= DUK__STRHASH_SHORTSTRING) { - hash = duk_util_hashbytes(str, len, str_seed); - } else { - duk_size_t off; - duk_size_t skip; - - if (len <= DUK__STRHASH_MEDIUMSTRING) { - skip = (duk_size_t) (16 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE); - } else { - skip = (duk_size_t) (256 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE); - } - - hash = duk_util_hashbytes(str, (duk_size_t) DUK__STRHASH_SHORTSTRING, str_seed); - off = DUK__STRHASH_SHORTSTRING + (skip * (hash % 256)) / 256; - - /* XXX: inefficient loop */ - while (off < len) { - duk_size_t left = len - off; - duk_size_t now = (duk_size_t) (left > DUK__STRHASH_BLOCKSIZE ? DUK__STRHASH_BLOCKSIZE : left); - hash ^= duk_util_hashbytes(str + off, now, str_seed); - off += skip; - } - } - -#if defined(DUK_USE_STRHASH16) - /* Truncate to 16 bits here, so that a computed hash can be compared - * against a hash stored in a 16-bit field. - */ - hash &= 0x0000ffffUL; -#endif - return hash; -} -#else /* DUK_USE_STRHASH_DENSE */ -DUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) { - duk_uint32_t hash; - duk_size_t step; - duk_size_t off; - - /* Slightly modified "Bernstein hash" from: - * - * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx - * - * Modifications: string skipping and reverse direction similar to - * Lua 5.1.5, and different hash initializer. - * - * The reverse direction ensures last byte it always included in the - * hash which is a good default as changing parts of the string are - * more often in the suffix than in the prefix. - */ - - hash = heap->hash_seed ^ ((duk_uint32_t) len); /* Bernstein hash init value is normally 5381 */ - step = (len >> DUK_USE_STRHASH_SKIP_SHIFT) + 1; - for (off = len; off >= step; off -= step) { - DUK_ASSERT(off >= 1); /* off >= step, and step >= 1 */ - hash = (hash * 33) + str[off - 1]; - } - -#if defined(DUK_USE_STRHASH16) - /* Truncate to 16 bits here, so that a computed hash can be compared - * against a hash stored in a 16-bit field. - */ - hash &= 0x0000ffffUL; -#endif - return hash; -} -#endif /* DUK_USE_STRHASH_DENSE */ - -/* automatic undefs */ -#undef DUK__STRHASH_BLOCKSIZE -#undef DUK__STRHASH_MEDIUMSTRING -#undef DUK__STRHASH_SHORTSTRING -#line 1 "duk_heap_markandsweep.c" -/* - * Mark-and-sweep garbage collection. - */ - -/* #include duk_internal.h -> already included */ - -DUK_LOCAL_DECL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h); -DUK_LOCAL_DECL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h); -DUK_LOCAL_DECL void duk__mark_tval(duk_heap *heap, duk_tval *tv); -DUK_LOCAL_DECL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count); - -/* - * Marking functions for heap types: mark children recursively. - */ - -DUK_LOCAL void duk__mark_hstring(duk_heap *heap, duk_hstring *h) { - DUK_UNREF(heap); - DUK_UNREF(h); - - DUK_DDD(DUK_DDDPRINT("duk__mark_hstring: %p", (void *) h)); - DUK_ASSERT(h); - - /* nothing to process */ -} - -DUK_LOCAL void duk__mark_hobject(duk_heap *heap, duk_hobject *h) { - duk_uint_fast32_t i; - - DUK_DDD(DUK_DDDPRINT("duk__mark_hobject: %p", (void *) h)); - - DUK_ASSERT(h); - - /* XXX: use advancing pointers instead of index macros -> faster and smaller? */ - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { - duk_hstring *key = DUK_HOBJECT_E_GET_KEY(heap, h, i); - if (key == NULL) { - continue; - } - duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) key); - if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) { - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get); - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set); - } else { - duk__mark_tval(heap, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v); - } - } - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) { - duk__mark_tval(heap, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)); - } - - /* Hash part is a 'weak reference' and does not contribute. */ - - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h)); - - /* Fast path for objects which don't have a subclass struct, or have a - * subclass struct but nothing that needs marking in the subclass struct. - */ - if (DUK_HOBJECT_HAS_FASTREFS(h)) { - DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h)); - return; - } - DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h)); - - /* XXX: reorg, more common first */ - if (DUK_HOBJECT_IS_COMPFUNC(h)) { - duk_hcompfunc *f = (duk_hcompfunc *) h; - duk_tval *tv, *tv_end; - duk_hobject **fn, **fn_end; - - DUK_ASSERT_HCOMPFUNC_VALID(f); - - /* 'data' is reachable through every compiled function which - * contains a reference. - */ - - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_DATA(heap, f)); - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f)); - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f)); - - if (DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL) { - tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f); - tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f); - while (tv < tv_end) { - duk__mark_tval(heap, tv); - tv++; - } - - fn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f); - fn_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f); - while (fn < fn_end) { - duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) *fn); - fn++; - } - } else { - /* May happen in some out-of-memory corner cases. */ - DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping marking")); - } - } else if (DUK_HOBJECT_IS_DECENV(h)) { - duk_hdecenv *e = (duk_hdecenv *) h; - DUK_ASSERT_HDECENV_VALID(e); - duk__mark_heaphdr(heap, (duk_heaphdr *) e->thread); - duk__mark_heaphdr(heap, (duk_heaphdr *) e->varmap); - } else if (DUK_HOBJECT_IS_OBJENV(h)) { - duk_hobjenv *e = (duk_hobjenv *) h; - DUK_ASSERT_HOBJENV_VALID(e); - duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) e->target); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { - duk_hbufobj *b = (duk_hbufobj *) h; - DUK_ASSERT_HBUFOBJ_VALID(b); - duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf); - duk__mark_heaphdr(heap, (duk_heaphdr *) b->buf_prop); -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { - duk_hboundfunc *f = (duk_hboundfunc *) h; - DUK_ASSERT_HBOUNDFUNC_VALID(f); - duk__mark_tval(heap, &f->target); - duk__mark_tval(heap, &f->this_binding); - duk__mark_tvals(heap, f->args, f->nargs); -#if defined(DUK_USE_ES6_PROXY) - } else if (DUK_HOBJECT_IS_PROXY(h)) { - duk_hproxy *p = (duk_hproxy *) h; - DUK_ASSERT_HPROXY_VALID(p); - duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->target); - duk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->handler); -#endif /* DUK_USE_ES6_PROXY */ - } else if (DUK_HOBJECT_IS_THREAD(h)) { - duk_hthread *t = (duk_hthread *) h; - duk_activation *act; - duk_tval *tv; - - DUK_ASSERT_HTHREAD_VALID(t); - - tv = t->valstack; - while (tv < t->valstack_top) { - duk__mark_tval(heap, tv); - tv++; - } - - for (act = t->callstack_curr; act != NULL; act = act->parent) { - duk__mark_heaphdr(heap, (duk_heaphdr *) DUK_ACT_GET_FUNC(act)); - duk__mark_heaphdr(heap, (duk_heaphdr *) act->var_env); - duk__mark_heaphdr(heap, (duk_heaphdr *) act->lex_env); -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - duk__mark_heaphdr(heap, (duk_heaphdr *) act->prev_caller); -#endif -#if 0 /* nothing now */ - for (cat = act->cat; cat != NULL; cat = cat->parent) { - } -#endif - } - - duk__mark_heaphdr(heap, (duk_heaphdr *) t->resumer); - - for (i = 0; i < DUK_NUM_BUILTINS; i++) { - duk__mark_heaphdr(heap, (duk_heaphdr *) t->builtins[i]); - } - } else { - /* We may come here if the object should have a FASTREFS flag - * but it's missing for some reason. Assert for never getting - * here; however, other than performance, this is harmless. - */ - DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h)); - DUK_ASSERT(0); - } -} - -/* Mark any duk_heaphdr type. Recursion tracking happens only here. */ -DUK_LOCAL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h) { - DUK_DDD(DUK_DDDPRINT("duk__mark_heaphdr %p, type %ld", - (void *) h, - (h != NULL ? (long) DUK_HEAPHDR_GET_TYPE(h) : (long) -1))); - - /* XXX: add non-null variant? */ - if (h == NULL) { - return; - } - - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h) || DUK_HEAPHDR_HAS_REACHABLE(h)); - -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) - if (!DUK_HEAPHDR_HAS_READONLY(h)) { - h->h_assert_refcount++; /* Comparison refcount: bump even if already reachable. */ - } -#endif - if (DUK_HEAPHDR_HAS_REACHABLE(h)) { - DUK_DDD(DUK_DDDPRINT("already marked reachable, skip")); - return; - } -#if defined(DUK_USE_ROM_OBJECTS) - /* READONLY objects always have REACHABLE set, so the check above - * will prevent READONLY objects from being marked here. - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h)); -#endif - - DUK_HEAPHDR_SET_REACHABLE(h); - - if (heap->ms_recursion_depth >= DUK_USE_MARK_AND_SWEEP_RECLIMIT) { - DUK_D(DUK_DPRINT("mark-and-sweep recursion limit reached, marking as temproot: %p", (void *) h)); - DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap); - DUK_HEAPHDR_SET_TEMPROOT(h); - return; - } - - heap->ms_recursion_depth++; - DUK_ASSERT(heap->ms_recursion_depth != 0); /* Wrap. */ - - switch (DUK_HEAPHDR_GET_TYPE(h)) { - case DUK_HTYPE_STRING: - duk__mark_hstring(heap, (duk_hstring *) h); - break; - case DUK_HTYPE_OBJECT: - duk__mark_hobject(heap, (duk_hobject *) h); - break; - case DUK_HTYPE_BUFFER: - /* nothing to mark */ - break; - default: - DUK_D(DUK_DPRINT("attempt to mark heaphdr %p with invalid htype %ld", (void *) h, (long) DUK_HEAPHDR_GET_TYPE(h))); - DUK_UNREACHABLE(); - } - - DUK_ASSERT(heap->ms_recursion_depth > 0); - heap->ms_recursion_depth--; -} - -DUK_LOCAL void duk__mark_tval(duk_heap *heap, duk_tval *tv) { - DUK_DDD(DUK_DDDPRINT("duk__mark_tval %p", (void *) tv)); - if (tv == NULL) { - return; - } - if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { - duk_heaphdr *h; - h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - duk__mark_heaphdr_nonnull(heap, h); - } -} - -DUK_LOCAL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count) { - DUK_ASSERT(count == 0 || tv != NULL); - - while (count-- > 0) { - if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { - duk_heaphdr *h; - h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - duk__mark_heaphdr_nonnull(heap, h); - } - tv++; - } -} - -/* Mark any duk_heaphdr type, caller guarantees a non-NULL pointer. */ -DUK_LOCAL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h) { - /* For now, just call the generic handler. Change when call sites - * are changed too. - */ - duk__mark_heaphdr(heap, h); -} - -/* - * Mark the heap. - */ - -DUK_LOCAL void duk__mark_roots_heap(duk_heap *heap) { - duk_small_uint_t i; - - DUK_DD(DUK_DDPRINT("duk__mark_roots_heap: %p", (void *) heap)); - - duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_thread); - duk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_object); - - for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) { - duk_hstring *h = DUK_HEAP_GET_STRING(heap, i); - duk__mark_heaphdr(heap, (duk_heaphdr *) h); - } - - duk__mark_tval(heap, &heap->lj.value1); - duk__mark_tval(heap, &heap->lj.value2); - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - for (i = 0; i < heap->dbg_breakpoint_count; i++) { - duk__mark_heaphdr(heap, (duk_heaphdr *) heap->dbg_breakpoints[i].filename); - } -#endif -} - -/* - * Mark unreachable, finalizable objects. - * - * Such objects will be moved aside and their finalizers run later. They - * have to be treated as reachability roots for their properties etc to - * remain allocated. This marking is only done for unreachable values which - * would be swept later. - * - * Objects are first marked FINALIZABLE and only then marked as reachability - * roots; otherwise circular references might be handled inconsistently. - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_LOCAL void duk__mark_finalizable(duk_heap *heap) { - duk_heaphdr *hdr; - duk_size_t count_finalizable = 0; - - DUK_DD(DUK_DDPRINT("duk__mark_finalizable: %p", (void *) heap)); - - DUK_ASSERT(heap->heap_thread != NULL); - - hdr = heap->heap_allocated; - while (hdr != NULL) { - /* A finalizer is looked up from the object and up its - * prototype chain (which allows inherited finalizers). - * The finalizer is checked for using a duk_hobject flag - * which is kept in sync with the presence and callability - * of a _Finalizer hidden symbol. - */ - - if (!DUK_HEAPHDR_HAS_REACHABLE(hdr) && - DUK_HEAPHDR_IS_OBJECT(hdr) && - !DUK_HEAPHDR_HAS_FINALIZED(hdr) && - DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr)) { - /* heaphdr: - * - is not reachable - * - is an object - * - is not a finalized object waiting for rescue/keep decision - * - has a finalizer - */ - - DUK_DD(DUK_DDPRINT("unreachable heap object will be " - "finalized -> mark as finalizable " - "and treat as a reachability root: %p", - (void *) hdr)); - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr)); - DUK_HEAPHDR_SET_FINALIZABLE(hdr); - count_finalizable++; - } - - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } - - if (count_finalizable == 0) { - return; - } - - DUK_DD(DUK_DDPRINT("marked %ld heap objects as finalizable, now mark them reachable", - (long) count_finalizable)); - - hdr = heap->heap_allocated; - while (hdr != NULL) { - if (DUK_HEAPHDR_HAS_FINALIZABLE(hdr)) { - duk__mark_heaphdr_nonnull(heap, hdr); - } - - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } - - /* Caller will finish the marking process if we hit a recursion limit. */ -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -/* - * Mark objects on finalize_list. - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_LOCAL void duk__mark_finalize_list(duk_heap *heap) { - duk_heaphdr *hdr; -#if defined(DUK_USE_DEBUG) - duk_size_t count_finalize_list = 0; -#endif - - DUK_DD(DUK_DDPRINT("duk__mark_finalize_list: %p", (void *) heap)); - - hdr = heap->finalize_list; - while (hdr != NULL) { - duk__mark_heaphdr_nonnull(heap, hdr); - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); -#if defined(DUK_USE_DEBUG) - count_finalize_list++; -#endif - } - -#if defined(DUK_USE_DEBUG) - if (count_finalize_list > 0) { - DUK_D(DUK_DPRINT("marked %ld objects on the finalize_list as reachable (previous finalizer run skipped)", - (long) count_finalize_list)); - } -#endif -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -/* - * Fallback marking handler if recursion limit is reached. - * - * Iterates 'temproots' until recursion limit is no longer hit. Temproots - * can be in heap_allocated or finalize_list; refzero_list is now always - * empty for mark-and-sweep. A temproot may occur in finalize_list now if - * there are objects on the finalize_list and user code creates a reference - * from an object in heap_allocated to the object in finalize_list (which is - * now allowed), and it happened to coincide with the recursion depth limit. - * - * This is a slow scan, but guarantees that we finish with a bounded C stack. - * - * Note that nodes may have been marked as temproots before this scan begun, - * OR they may have been marked during the scan (as we process nodes - * recursively also during the scan). This is intended behavior. - */ - -#if defined(DUK_USE_DEBUG) -DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr, duk_size_t *count) { -#else -DUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr) { -#endif - DUK_ASSERT(hdr != NULL); - - if (!DUK_HEAPHDR_HAS_TEMPROOT(hdr)) { - DUK_DDD(DUK_DDDPRINT("not a temp root: %p", (void *) hdr)); - return; - } - - DUK_DDD(DUK_DDDPRINT("found a temp root: %p", (void *) hdr)); - DUK_HEAPHDR_CLEAR_TEMPROOT(hdr); - DUK_HEAPHDR_CLEAR_REACHABLE(hdr); /* Done so that duk__mark_heaphdr() works correctly. */ -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) - hdr->h_assert_refcount--; /* Same node visited twice. */ -#endif - duk__mark_heaphdr_nonnull(heap, hdr); - -#if defined(DUK_USE_DEBUG) - (*count)++; -#endif -} - -DUK_LOCAL void duk__mark_temproots_by_heap_scan(duk_heap *heap) { - duk_heaphdr *hdr; -#if defined(DUK_USE_DEBUG) - duk_size_t count; -#endif - - DUK_DD(DUK_DDPRINT("duk__mark_temproots_by_heap_scan: %p", (void *) heap)); - - while (DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)) { - DUK_DD(DUK_DDPRINT("recursion limit reached, doing heap scan to continue from temproots")); - -#if defined(DUK_USE_DEBUG) - count = 0; -#endif - DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap); - - hdr = heap->heap_allocated; - while (hdr) { -#if defined(DUK_USE_DEBUG) - duk__handle_temproot(heap, hdr, &count); -#else - duk__handle_temproot(heap, hdr); -#endif - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } - -#if defined(DUK_USE_FINALIZER_SUPPORT) - hdr = heap->finalize_list; - while (hdr) { -#if defined(DUK_USE_DEBUG) - duk__handle_temproot(heap, hdr, &count); -#else - duk__handle_temproot(heap, hdr); -#endif - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } -#endif - -#if defined(DUK_USE_DEBUG) - DUK_DD(DUK_DDPRINT("temproot mark heap scan processed %ld temp roots", (long) count)); -#endif - } -} - -/* - * Finalize refcounts for heap elements just about to be freed. - * This must be done for all objects before freeing to avoid any - * stale pointer dereferences. - * - * Note that this must deduce the set of objects to be freed - * identically to duk__sweep_heap(). - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_LOCAL void duk__finalize_refcounts(duk_heap *heap) { - duk_heaphdr *hdr; - - DUK_ASSERT(heap->heap_thread != NULL); - - DUK_DD(DUK_DDPRINT("duk__finalize_refcounts: heap=%p", (void *) heap)); - - hdr = heap->heap_allocated; - while (hdr) { - if (!DUK_HEAPHDR_HAS_REACHABLE(hdr)) { - /* - * Unreachable object about to be swept. Finalize target refcounts - * (objects which the unreachable object points to) without doing - * refzero processing. Recursive decrefs are also prevented when - * refzero processing is disabled. - * - * Value cannot be a finalizable object, as they have been made - * temporarily reachable for this round. - */ - - DUK_DDD(DUK_DDDPRINT("unreachable object, refcount finalize before sweeping: %p", (void *) hdr)); - - /* Finalize using heap->heap_thread; DECREF has a - * suppress check for mark-and-sweep which is based - * on heap->ms_running. - */ - duk_heaphdr_refcount_finalize_norz(heap, hdr); - } - - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } -} -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* - * Clear (reachable) flags of finalize_list. - * - * We could mostly do in the sweep phase when we move objects from the - * heap into the finalize_list. However, if a finalizer run is skipped - * during a mark-and-sweep, the objects on the finalize_list will be marked - * reachable during the next mark-and-sweep. Since they're already on the - * finalize_list, no-one will be clearing their REACHABLE flag so we do it - * here. (This now overlaps with the sweep handling in a harmless way.) - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_LOCAL void duk__clear_finalize_list_flags(duk_heap *heap) { - duk_heaphdr *hdr; - - DUK_DD(DUK_DDPRINT("duk__clear_finalize_list_flags: %p", (void *) heap)); - - hdr = heap->finalize_list; - while (hdr) { - DUK_HEAPHDR_CLEAR_REACHABLE(hdr); -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(hdr) || \ - (heap->currently_finalizing == hdr)); -#endif - /* DUK_HEAPHDR_FLAG_FINALIZED may be set. */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr)); - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -/* - * Sweep stringtable. - */ - -DUK_LOCAL void duk__sweep_stringtable(duk_heap *heap, duk_size_t *out_count_keep) { - duk_hstring *h; - duk_hstring *prev; - duk_uint32_t i; -#if defined(DUK_USE_DEBUG) - duk_size_t count_free = 0; -#endif - duk_size_t count_keep = 0; - - DUK_DD(DUK_DDPRINT("duk__sweep_stringtable: %p", (void *) heap)); - -#if defined(DUK_USE_STRTAB_PTRCOMP) - if (heap->strtable16 == NULL) { -#else - if (heap->strtable == NULL) { -#endif - goto done; - } - - for (i = 0; i < heap->st_size; i++) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); -#else - h = heap->strtable[i]; -#endif - prev = NULL; - while (h != NULL) { - duk_hstring *next; - next = h->hdr.h_next; - - if (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h)) { - DUK_HEAPHDR_CLEAR_REACHABLE((duk_heaphdr *) h); - count_keep++; - prev = h; - } else { -#if defined(DUK_USE_DEBUG) - count_free++; -#endif - -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Non-zero refcounts should not happen for unreachable strings, - * because we refcount finalize all unreachable objects which - * should have decreased unreachable string refcounts to zero - * (even for cycles). - */ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) == 0); -#endif - - /* Deal with weak references first. */ - duk_heap_strcache_string_remove(heap, (duk_hstring *) h); - - /* Remove the string from the string table. */ - duk_heap_strtable_unlink_prev(heap, (duk_hstring *) h, (duk_hstring *) prev); - - /* Free inner references (these exist e.g. when external - * strings are enabled) and the struct itself. - */ - duk_free_hstring(heap, (duk_hstring *) h); - - /* Don't update 'prev'; it should be last string kept. */ - } - - h = next; - } - } - - done: -#if defined(DUK_USE_DEBUG) - DUK_D(DUK_DPRINT("mark-and-sweep sweep stringtable: %ld freed, %ld kept", - (long) count_free, (long) count_keep)); -#endif - *out_count_keep = count_keep; -} - -/* - * Sweep heap. - */ - -DUK_LOCAL void duk__sweep_heap(duk_heap *heap, duk_small_uint_t flags, duk_size_t *out_count_keep) { - duk_heaphdr *prev; /* last element that was left in the heap */ - duk_heaphdr *curr; - duk_heaphdr *next; -#if defined(DUK_USE_DEBUG) - duk_size_t count_free = 0; - duk_size_t count_finalize = 0; - duk_size_t count_rescue = 0; -#endif - duk_size_t count_keep = 0; - - DUK_DD(DUK_DDPRINT("duk__sweep_heap: %p", (void *) heap)); - - prev = NULL; - curr = heap->heap_allocated; - heap->heap_allocated = NULL; - while (curr) { - /* Strings and ROM objects are never placed on the heap allocated list. */ - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_STRING); - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr)); - - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - - if (DUK_HEAPHDR_HAS_REACHABLE(curr)) { - /* - * Reachable object: - * - If FINALIZABLE -> actually unreachable (but marked - * artificially reachable), queue to finalize_list. - * - If !FINALIZABLE but FINALIZED -> rescued after - * finalizer execution. - * - Otherwise just a normal, reachable object. - * - * Objects which are kept are queued to heap_allocated - * tail (we're essentially filtering heap_allocated in - * practice). - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) - if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE(curr))) { - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr)); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); - DUK_DD(DUK_DDPRINT("sweep; reachable, finalizable --> move to finalize_list: %p", (void *) curr)); - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_HEAPHDR_PREINC_REFCOUNT(curr); /* Bump refcount so that refzero never occurs when pending a finalizer call. */ -#endif - DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, curr); -#if defined(DUK_USE_DEBUG) - count_finalize++; -#endif - } - else -#endif /* DUK_USE_FINALIZER_SUPPORT */ - { - if (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZED(curr))) { - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr)); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); - - if (flags & DUK_MS_FLAG_POSTPONE_RESCUE) { - DUK_DD(DUK_DDPRINT("sweep; reachable, finalized, but postponing rescue decisions --> keep object (with FINALIZED set): %!iO", curr)); - count_keep++; - } else { - DUK_DD(DUK_DDPRINT("sweep; reachable, finalized --> rescued after finalization: %p", (void *) curr)); -#if defined(DUK_USE_FINALIZER_SUPPORT) - DUK_HEAPHDR_CLEAR_FINALIZED(curr); -#endif -#if defined(DUK_USE_DEBUG) - count_rescue++; -#endif - } - } else { - DUK_DD(DUK_DDPRINT("sweep; reachable --> keep: %!iO", curr)); - count_keep++; - } - - if (prev != NULL) { - DUK_ASSERT(heap->heap_allocated != NULL); - DUK_HEAPHDR_SET_NEXT(heap, prev, curr); - } else { - DUK_ASSERT(heap->heap_allocated == NULL); - heap->heap_allocated = curr; - } -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - DUK_HEAPHDR_SET_PREV(heap, curr, prev); -#endif - DUK_ASSERT_HEAPHDR_LINKS(heap, prev); - DUK_ASSERT_HEAPHDR_LINKS(heap, curr); - prev = curr; - } - - /* - * Shrink check for value stacks here. We're inside - * ms_prevent_count protection which prevents recursive - * mark-and-sweep and refzero finalizers, so there are - * no side effects that would affect the heap lists. - */ - if (DUK_HEAPHDR_IS_OBJECT(curr) && DUK_HOBJECT_IS_THREAD((duk_hobject *) curr)) { - duk_hthread *thr_curr = (duk_hthread *) curr; - DUK_DD(DUK_DDPRINT("value stack shrink check for thread: %!O", curr)); - duk_valstack_shrink_check_nothrow(thr_curr, flags & DUK_MS_FLAG_EMERGENCY /*snug*/); - } - - DUK_HEAPHDR_CLEAR_REACHABLE(curr); - /* Keep FINALIZED if set, used if rescue decisions are postponed. */ - /* Keep FINALIZABLE for objects on finalize_list. */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr)); - } else { - /* - * Unreachable object: - * - If FINALIZED, object was finalized but not - * rescued. This doesn't affect freeing. - * - Otherwise normal unreachable object. - * - * There's no guard preventing a FINALIZED object - * from being freed while finalizers execute: the - * artificial finalize_list reachability roots can't - * cause an incorrect free decision (but can cause - * an incorrect rescue decision). - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Non-zero refcounts should not happen because we refcount - * finalize all unreachable objects which should cancel out - * refcounts (even for cycles). - */ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) == 0); -#endif - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr)); - -#if defined(DUK_USE_DEBUG) - if (DUK_HEAPHDR_HAS_FINALIZED(curr)) { - DUK_DD(DUK_DDPRINT("sweep; unreachable, finalized --> finalized object not rescued: %p", (void *) curr)); - } else { - DUK_DD(DUK_DDPRINT("sweep; not reachable --> free: %p", (void *) curr)); - } - -#endif - - /* Note: object cannot be a finalizable unreachable object, as - * they have been marked temporarily reachable for this round, - * and are handled above. - */ - -#if defined(DUK_USE_DEBUG) - count_free++; -#endif - - /* Weak refs should be handled here, but no weak refs for - * any non-string objects exist right now. - */ - - /* Free object and all auxiliary (non-heap) allocs. */ - duk_heap_free_heaphdr_raw(heap, curr); - } - - curr = next; - } - - if (prev != NULL) { - DUK_HEAPHDR_SET_NEXT(heap, prev, NULL); - } - DUK_ASSERT_HEAPHDR_LINKS(heap, prev); - -#if defined(DUK_USE_DEBUG) - DUK_D(DUK_DPRINT("mark-and-sweep sweep objects (non-string): %ld freed, %ld kept, %ld rescued, %ld queued for finalization", - (long) count_free, (long) count_keep, (long) count_rescue, (long) count_finalize)); -#endif - *out_count_keep = count_keep; -} - -/* - * Object compaction. - * - * Compaction is assumed to never throw an error. - */ - -DUK_LOCAL int duk__protected_compact_object(duk_hthread *thr, void *udata) { - duk_hobject *obj; - /* XXX: for threads, compact stacks? */ - - DUK_UNREF(udata); - obj = duk_known_hobject(thr, -1); - duk_hobject_compact_props(thr, obj); - return 0; -} - -#if defined(DUK_USE_DEBUG) -DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start, duk_size_t *p_count_check, duk_size_t *p_count_compact, duk_size_t *p_count_bytes_saved) { -#else -DUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start) { -#endif - duk_heaphdr *curr; -#if defined(DUK_USE_DEBUG) - duk_size_t old_size, new_size; -#endif - duk_hobject *obj; - - DUK_UNREF(heap); - - curr = start; - while (curr) { - DUK_DDD(DUK_DDDPRINT("mark-and-sweep compact: %p", (void *) curr)); - - if (DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_OBJECT) { - goto next; - } - obj = (duk_hobject *) curr; - -#if defined(DUK_USE_DEBUG) - old_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), - DUK_HOBJECT_GET_ASIZE(obj), - DUK_HOBJECT_GET_HSIZE(obj)); -#endif - - DUK_DD(DUK_DDPRINT("compact object: %p", (void *) obj)); - duk_push_hobject(thr, obj); - /* XXX: disable error handlers for duration of compaction? */ - duk_safe_call(thr, duk__protected_compact_object, NULL, 1, 0); - -#if defined(DUK_USE_DEBUG) - new_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), - DUK_HOBJECT_GET_ASIZE(obj), - DUK_HOBJECT_GET_HSIZE(obj)); -#endif - -#if defined(DUK_USE_DEBUG) - (*p_count_compact)++; - (*p_count_bytes_saved) += (duk_size_t) (old_size - new_size); -#endif - - next: - curr = DUK_HEAPHDR_GET_NEXT(heap, curr); -#if defined(DUK_USE_DEBUG) - (*p_count_check)++; -#endif - } -} - -DUK_LOCAL void duk__compact_objects(duk_heap *heap) { - /* XXX: which lists should participate? to be finalized? */ -#if defined(DUK_USE_DEBUG) - duk_size_t count_check = 0; - duk_size_t count_compact = 0; - duk_size_t count_bytes_saved = 0; -#endif - - DUK_DD(DUK_DDPRINT("duk__compact_objects: %p", (void *) heap)); - - DUK_ASSERT(heap->heap_thread != NULL); - -#if defined(DUK_USE_DEBUG) - duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated, &count_check, &count_compact, &count_bytes_saved); -#if defined(DUK_USE_FINALIZER_SUPPORT) - duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list, &count_check, &count_compact, &count_bytes_saved); -#endif -#else - duk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated); -#if defined(DUK_USE_FINALIZER_SUPPORT) - duk__compact_object_list(heap, heap->heap_thread, heap->finalize_list); -#endif -#endif -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ -#endif - -#if defined(DUK_USE_DEBUG) - DUK_D(DUK_DPRINT("mark-and-sweep compact objects: %ld checked, %ld compaction attempts, %ld bytes saved by compaction", - (long) count_check, (long) count_compact, (long) count_bytes_saved)); -#endif -} - -/* - * Assertion helpers. - */ - -#if defined(DUK_USE_ASSERTIONS) -DUK_LOCAL void duk__assert_heaphdr_flags(duk_heap *heap) { - duk_heaphdr *hdr; - - hdr = heap->heap_allocated; - while (hdr) { - DUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(hdr)); - DUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr)); - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(hdr)); - /* may have FINALIZED */ - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } - -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ -#endif -} - -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_LOCAL void duk__assert_valid_refcounts(duk_heap *heap) { - duk_heaphdr *hdr = heap->heap_allocated; - while (hdr) { - /* Cannot really assert much w.r.t. refcounts now. */ - - if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0 && - DUK_HEAPHDR_HAS_FINALIZED(hdr)) { - /* An object may be in heap_allocated list with a zero - * refcount if it has just been finalized and is waiting - * to be collected by the next cycle. - * (This doesn't currently happen however.) - */ - } else if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0) { - /* An object may be in heap_allocated list with a zero - * refcount also if it is a temporary object created - * during debugger paused state. It will get collected - * by mark-and-sweep based on its reachability status - * (presumably not reachable because refcount is 0). - */ - } - DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(hdr) >= 0); /* Unsigned. */ - hdr = DUK_HEAPHDR_GET_NEXT(heap, hdr); - } -} - -DUK_LOCAL void duk__clear_assert_refcounts(duk_heap *heap) { - duk_heaphdr *curr; - duk_uint32_t i; - - for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - curr->h_assert_refcount = 0; - } -#if defined(DUK_USE_FINALIZER_SUPPORT) - for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - curr->h_assert_refcount = 0; - } -#endif -#if defined(DUK_USE_REFERENCE_COUNTING) - for (curr = heap->refzero_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - curr->h_assert_refcount = 0; - } -#endif - - for (i = 0; i < heap->st_size; i++) { - duk_hstring *h; - -#if defined(DUK_USE_STRTAB_PTRCOMP) - h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); -#else - h = heap->strtable[i]; -#endif - while (h != NULL) { - ((duk_heaphdr *) h)->h_assert_refcount = 0; - h = h->hdr.h_next; - } - } -} - -DUK_LOCAL void duk__check_refcount_heaphdr(duk_heaphdr *hdr) { - duk_bool_t count_ok; - - /* The refcount check only makes sense for reachable objects on - * heap_allocated or string table, after the sweep phase. Prior to - * sweep phase refcounts will include references that are not visible - * via reachability roots. - * - * Because we're called after the sweep phase, all heap objects on - * heap_allocated are reachable. REACHABLE flags have already been - * cleared so we can't check them. - */ - - /* ROM objects have intentionally incorrect refcount (1), but we won't - * check them. - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr)); - - count_ok = ((duk_size_t) DUK_HEAPHDR_GET_REFCOUNT(hdr) == hdr->h_assert_refcount); - if (!count_ok) { - DUK_D(DUK_DPRINT("refcount mismatch for: %p: header=%ld counted=%ld --> %!iO", - (void *) hdr, (long) DUK_HEAPHDR_GET_REFCOUNT(hdr), - (long) hdr->h_assert_refcount, hdr)); - DUK_ASSERT(0); - } -} - -DUK_LOCAL void duk__check_assert_refcounts(duk_heap *heap) { - duk_heaphdr *curr; - duk_uint32_t i; - - for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - duk__check_refcount_heaphdr(curr); - } -#if defined(DUK_USE_FINALIZER_SUPPORT) - for (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - duk__check_refcount_heaphdr(curr); - } -#endif - - for (i = 0; i < heap->st_size; i++) { - duk_hstring *h; - -#if defined(DUK_USE_STRTAB_PTRCOMP) - h = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]); -#else - h = heap->strtable[i]; -#endif - while (h != NULL) { - duk__check_refcount_heaphdr((duk_heaphdr *) h); - h = h->hdr.h_next; - } - } -} -#endif /* DUK_USE_REFERENCE_COUNTING */ -#endif /* DUK_USE_ASSERTIONS */ - -/* - * Stats dump. - */ - -#if defined(DUK_USE_DEBUG) -DUK_LOCAL void duk__dump_stats(duk_heap *heap) { - DUK_D(DUK_DPRINT("stats executor: opcodes=%ld, interrupt=%ld, throw=%ld", - (long) heap->stats_exec_opcodes, (long) heap->stats_exec_interrupt, - (long) heap->stats_exec_throw)); - DUK_D(DUK_DPRINT("stats call: all=%ld, tailcall=%ld, ecmatoecma=%ld", - (long) heap->stats_call_all, (long) heap->stats_call_tailcall, - (long) heap->stats_call_ecmatoecma)); - DUK_D(DUK_DPRINT("stats safecall: all=%ld, nothrow=%ld, throw=%ld", - (long) heap->stats_safecall_all, (long) heap->stats_safecall_nothrow, - (long) heap->stats_safecall_throw)); - DUK_D(DUK_DPRINT("stats mark-and-sweep: try_count=%ld, skip_count=%ld, emergency_count=%ld", - (long) heap->stats_ms_try_count, (long) heap->stats_ms_skip_count, - (long) heap->stats_ms_emergency_count)); - DUK_D(DUK_DPRINT("stats stringtable: intern_hit=%ld, intern_miss=%ld, resize_check=%ld, resize_grow=%ld, resize_shrink=%ld", - (long) heap->stats_strtab_intern_hit, (long) heap->stats_strtab_intern_miss, - (long) heap->stats_strtab_resize_check, (long) heap->stats_strtab_resize_grow, - (long) heap->stats_strtab_resize_shrink)); - DUK_D(DUK_DPRINT("stats object: realloc_props=%ld, abandon_array=%ld", - (long) heap->stats_object_realloc_props, (long) heap->stats_object_abandon_array)); - DUK_D(DUK_DPRINT("stats getownpropdesc: count=%ld, hit=%ld, miss=%ld", - (long) heap->stats_getownpropdesc_count, (long) heap->stats_getownpropdesc_hit, - (long) heap->stats_getownpropdesc_miss)); - DUK_D(DUK_DPRINT("stats getpropdesc: count=%ld, hit=%ld, miss=%ld", - (long) heap->stats_getpropdesc_count, (long) heap->stats_getpropdesc_hit, - (long) heap->stats_getpropdesc_miss)); - DUK_D(DUK_DPRINT("stats getprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, " - "bufferidx=%ld, bufferlen=%ld, stringidx=%ld, stringlen=%ld, " - "proxy=%ld, arguments=%ld", - (long) heap->stats_getprop_all, (long) heap->stats_getprop_arrayidx, - (long) heap->stats_getprop_bufobjidx, (long) heap->stats_getprop_bufferidx, - (long) heap->stats_getprop_bufferlen, (long) heap->stats_getprop_stringidx, - (long) heap->stats_getprop_stringlen, (long) heap->stats_getprop_proxy, - (long) heap->stats_getprop_arguments)); - DUK_D(DUK_DPRINT("stats putprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, " - "bufferidx=%ld, proxy=%ld", - (long) heap->stats_putprop_all, (long) heap->stats_putprop_arrayidx, - (long) heap->stats_putprop_bufobjidx, (long) heap->stats_putprop_bufferidx, - (long) heap->stats_putprop_proxy)); - DUK_D(DUK_DPRINT("stats getvar: all=%ld", - (long) heap->stats_getvar_all)); - DUK_D(DUK_DPRINT("stats putvar: all=%ld", - (long) heap->stats_putvar_all)); -} -#endif /* DUK_USE_DEBUG */ - -/* - * Main mark-and-sweep function. - * - * 'flags' represents the features requested by the caller. The current - * heap->ms_base_flags is ORed automatically into the flags; the base flags - * mask typically prevents certain mark-and-sweep operation to avoid trouble. - */ - -DUK_INTERNAL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags) { - duk_size_t count_keep_obj; - duk_size_t count_keep_str; -#if defined(DUK_USE_VOLUNTARY_GC) - duk_size_t tmp; -#endif - - DUK_STATS_INC(heap, stats_ms_try_count); -#if defined(DUK_USE_DEBUG) - if (flags & DUK_MS_FLAG_EMERGENCY) { - DUK_STATS_INC(heap, stats_ms_emergency_count); - } -#endif - - /* If debugger is paused, garbage collection is disabled by default. - * This is achieved by bumping ms_prevent_count when becoming paused. - */ - DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) || heap->ms_prevent_count > 0); - - /* Prevention/recursion check as soon as possible because we may - * be called a number of times when voluntary mark-and-sweep is - * pending. - */ - if (heap->ms_prevent_count != 0) { - DUK_DD(DUK_DDPRINT("reject recursive mark-and-sweep")); - DUK_STATS_INC(heap, stats_ms_skip_count); - return; - } - DUK_ASSERT(heap->ms_running == 0); /* ms_prevent_count is bumped when ms_running is set */ - - /* Heap_thread is used during mark-and-sweep for refcount finalization - * (it's also used for finalizer execution once mark-and-sweep is - * complete). Heap allocation code ensures heap_thread is set and - * properly initialized before setting ms_prevent_count to 0. - */ - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(heap->heap_thread->valstack != NULL); - - DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) starting, requested flags: 0x%08lx, effective flags: 0x%08lx", - (unsigned long) flags, (unsigned long) (flags | heap->ms_base_flags))); - - flags |= heap->ms_base_flags; -#if defined(DUK_USE_FINALIZER_SUPPORT) - if (heap->finalize_list != NULL) { - flags |= DUK_MS_FLAG_POSTPONE_RESCUE; - } -#endif - - /* - * Assertions before - */ - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(heap->ms_prevent_count == 0); - DUK_ASSERT(heap->ms_running == 0); - DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap)); - DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)); - DUK_ASSERT(heap->ms_recursion_depth == 0); - duk__assert_heaphdr_flags(heap); -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Note: heap->refzero_free_running may be true; a refcount - * finalizer may trigger a mark-and-sweep. - */ - duk__assert_valid_refcounts(heap); -#endif /* DUK_USE_REFERENCE_COUNTING */ -#endif /* DUK_USE_ASSERTIONS */ - - /* - * Begin - */ - - DUK_ASSERT(heap->ms_prevent_count == 0); - DUK_ASSERT(heap->ms_running == 0); - heap->ms_prevent_count = 1; - heap->ms_running = 1; - - /* - * Free activation/catcher freelists on every mark-and-sweep for now. - * This is an initial rough draft; ideally we'd keep count of the - * freelist size and free only excess entries. - */ - - DUK_D(DUK_DPRINT("freeing temporary freelists")); - duk_heap_free_freelists(heap); - - /* - * Mark roots, hoping that recursion limit is not normally hit. - * If recursion limit is hit, run additional reachability rounds - * starting from "temproots" until marking is complete. - * - * Marking happens in two phases: first we mark actual reachability - * roots (and run "temproots" to complete the process). Then we - * check which objects are unreachable and are finalizable; such - * objects are marked as FINALIZABLE and marked as reachability - * (and "temproots" is run again to complete the process). - * - * The heap finalize_list must also be marked as a reachability root. - * There may be objects on the list from a previous round if the - * previous run had finalizer skip flag. - */ - -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) - duk__clear_assert_refcounts(heap); -#endif - duk__mark_roots_heap(heap); /* Mark main reachability roots. */ -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ -#endif - duk__mark_temproots_by_heap_scan(heap); /* Temproots. */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) - duk__mark_finalizable(heap); /* Mark finalizable as reachability roots. */ - duk__mark_finalize_list(heap); /* Mark finalizer work list as reachability roots. */ -#endif - duk__mark_temproots_by_heap_scan(heap); /* Temproots. */ - - /* - * Sweep garbage and remove marking flags, and move objects with - * finalizers to the finalizer work list. - * - * Objects to be swept need to get their refcounts finalized before - * they are swept. In other words, their target object refcounts - * need to be decreased. This has to be done before freeing any - * objects to avoid decref'ing dangling pointers (which may happen - * even without bugs, e.g. with reference loops) - * - * Because strings don't point to other heap objects, similar - * finalization is not necessary for strings. - */ - - /* XXX: more emergency behavior, e.g. find smaller hash sizes etc */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - duk__finalize_refcounts(heap); -#endif - duk__sweep_heap(heap, flags, &count_keep_obj); - duk__sweep_stringtable(heap, &count_keep_str); -#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING) - duk__check_assert_refcounts(heap); -#endif -#if defined(DUK_USE_REFERENCE_COUNTING) - DUK_ASSERT(heap->refzero_list == NULL); /* Always handled to completion inline in DECREF. */ -#endif -#if defined(DUK_USE_FINALIZER_SUPPORT) - duk__clear_finalize_list_flags(heap); -#endif - - /* - * Object compaction (emergency only). - * - * Object compaction is a separate step after sweeping, as there is - * more free memory for it to work with. Also, currently compaction - * may insert new objects into the heap allocated list and the string - * table which we don't want to do during a sweep (the reachability - * flags of such objects would be incorrect). The objects inserted - * are currently: - * - * - a temporary duk_hbuffer for a new properties allocation - * - if array part is abandoned, string keys are interned - * - * The object insertions go to the front of the list, so they do not - * cause an infinite loop (they are not compacted). - */ - - if ((flags & DUK_MS_FLAG_EMERGENCY) && - !(flags & DUK_MS_FLAG_NO_OBJECT_COMPACTION)) { - duk__compact_objects(heap); - } - - /* - * String table resize check. - * - * This is mainly useful in emergency GC: if the string table load - * factor is really low for some reason, we can shrink the string - * table to a smaller size and free some memory in the process. - * Only execute in emergency GC. String table has internal flags - * to protect against recursive resizing if this mark-and-sweep pass - * was triggered by a string table resize. - */ - - if (flags & DUK_MS_FLAG_EMERGENCY) { - DUK_D(DUK_DPRINT("stringtable resize check in emergency gc")); - duk_heap_strtable_force_resize(heap); - } - - /* - * Finish - */ - - DUK_ASSERT(heap->ms_prevent_count == 1); - heap->ms_prevent_count = 0; - DUK_ASSERT(heap->ms_running == 1); - heap->ms_running = 0; - - /* - * Assertions after - */ - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(heap->ms_prevent_count == 0); - DUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)); - DUK_ASSERT(heap->ms_recursion_depth == 0); - duk__assert_heaphdr_flags(heap); -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Note: heap->refzero_free_running may be true; a refcount - * finalizer may trigger a mark-and-sweep. - */ - duk__assert_valid_refcounts(heap); -#endif /* DUK_USE_REFERENCE_COUNTING */ -#endif /* DUK_USE_ASSERTIONS */ - - /* - * Reset trigger counter - */ - -#if defined(DUK_USE_VOLUNTARY_GC) - tmp = (count_keep_obj + count_keep_str) / 256; - heap->ms_trigger_counter = (duk_int_t) ( - (tmp * DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT) + - DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD); - DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, trigger reset to %ld", - (long) count_keep_obj, (long) count_keep_str, (long) heap->ms_trigger_counter)); -#else - DUK_D(DUK_DPRINT("garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, no voluntary trigger", - (long) count_keep_obj, (long) count_keep_str)); -#endif - - /* - * Stats dump - */ - -#if defined(DUK_USE_DEBUG) - duk__dump_stats(heap); -#endif - - /* - * Finalize objects in the finalization work list. Finalized - * objects are queued back to heap_allocated with FINALIZED set. - * - * Since finalizers may cause arbitrary side effects, they are - * prevented e.g. during string table and object property allocation - * resizing using heap->pf_prevent_count. In this case the objects - * remain in the finalization work list after mark-and-sweep exits - * and they may be finalized on the next pass or any DECREF checking - * for finalize_list. - * - * As of Duktape 2.1 finalization happens outside mark-and-sweep - * protection. Mark-and-sweep is allowed while the finalize_list - * is being processed, but no rescue decisions are done while the - * process is on-going. This avoids incorrect rescue decisions - * if an object is considered reachable (and thus rescued) because - * of a reference via finalize_list (which is considered a reachability - * root). When finalize_list is being processed, reachable objects - * with FINALIZED set will just keep their FINALIZED flag for later - * mark-and-sweep processing. - * - * This could also be handled (a bit better) by having a more refined - * notion of reachability for rescue/free decisions. - * - * XXX: avoid finalizer execution when doing emergency GC? - */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) - /* Attempt to process finalize_list, pf_prevent_count check - * is inside the target. - */ - duk_heap_process_finalize_list(heap); -#endif /* DUK_USE_FINALIZER_SUPPORT */ -} -#line 1 "duk_heap_memory.c" -/* - * Memory allocation handling. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Voluntary GC check - */ - -#if defined(DUK_USE_VOLUNTARY_GC) -DUK_LOCAL DUK_INLINE void duk__check_voluntary_gc(duk_heap *heap) { - if (DUK_UNLIKELY(--(heap)->ms_trigger_counter < 0)) { -#if defined(DUK_USE_DEBUG) - if (heap->ms_prevent_count == 0) { - DUK_D(DUK_DPRINT("triggering voluntary mark-and-sweep")); - } else { - DUK_DD(DUK_DDPRINT("gc blocked -> skip voluntary mark-and-sweep now")); - } -#endif - - /* Prevention checks in the call target handle cases where - * voluntary GC is not allowed. The voluntary GC trigger - * counter is only rewritten if mark-and-sweep actually runs. - */ - duk_heap_mark_and_sweep(heap, DUK_MS_FLAG_VOLUNTARY /*flags*/); - } -} -#define DUK__VOLUNTARY_PERIODIC_GC(heap) do { duk__check_voluntary_gc((heap)); } while (0) -#else -#define DUK__VOLUNTARY_PERIODIC_GC(heap) /* no voluntary gc */ -#endif /* DUK_USE_VOLUNTARY_GC */ - -/* - * Allocate memory with garbage collection - */ - -DUK_INTERNAL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size) { - void *res; - duk_small_int_t i; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT_DISABLE(size >= 0); - - /* - * Voluntary periodic GC (if enabled) - */ - - DUK__VOLUNTARY_PERIODIC_GC(heap); - - /* - * First attempt - */ - -#if defined(DUK_USE_GC_TORTURE) - /* Simulate alloc failure on every alloc, except when mark-and-sweep - * is running. - */ - if (heap->ms_prevent_count == 0) { - DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first alloc attempt fails")); - res = NULL; - DUK_UNREF(res); - goto skip_attempt; - } -#endif - res = heap->alloc_func(heap->heap_udata, size); - if (DUK_LIKELY(res || size == 0)) { - /* For zero size allocations NULL is allowed. */ - return res; - } -#if defined(DUK_USE_GC_TORTURE) - skip_attempt: -#endif - - DUK_D(DUK_DPRINT("first alloc attempt failed, attempt to gc and retry")); - -#if 0 - /* - * Avoid a GC if GC is already running. This can happen at a late - * stage in a GC when we try to e.g. resize the stringtable - * or compact objects. - * - * NOTE: explicit handling isn't actually be needed: if the GC is - * not allowed, duk_heap_mark_and_sweep() will reject it for every - * attempt in the loop below, resulting in a NULL same as here. - */ - - if (heap->ms_prevent_count != 0) { - DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed, gc in progress (gc skipped), alloc size %ld", (long) size)); - return NULL; - } -#endif - - /* - * Retry with several GC attempts. Initial attempts are made without - * emergency mode; later attempts use emergency mode which minimizes - * memory allocations forcibly. - */ - - for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { - duk_small_uint_t flags; - - flags = 0; - if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { - flags |= DUK_MS_FLAG_EMERGENCY; - } - - duk_heap_mark_and_sweep(heap, flags); - - res = heap->alloc_func(heap->heap_udata, size); - if (res) { - DUK_D(DUK_DPRINT("duk_heap_mem_alloc() succeeded after gc (pass %ld), alloc size %ld", - (long) (i + 1), (long) size)); - return res; - } - } - - DUK_D(DUK_DPRINT("duk_heap_mem_alloc() failed even after gc, alloc size %ld", (long) size)); - return NULL; -} - -DUK_INTERNAL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size) { - void *res; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT_DISABLE(size >= 0); - - res = DUK_ALLOC(heap, size); - if (DUK_LIKELY(res != NULL)) { - /* assume memset with zero size is OK */ - DUK_MEMZERO(res, size); - } - return res; -} - -DUK_INTERNAL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size) { - void *res; - - DUK_ASSERT(thr != NULL); - res = duk_heap_mem_alloc(thr->heap, size); - if (DUK_LIKELY(res != NULL || size == 0)) { - return res; - } - DUK_ERROR_ALLOC_FAILED(thr); - return NULL; -} - -DUK_INTERNAL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size) { - void *res; - - DUK_ASSERT(thr != NULL); - res = duk_heap_mem_alloc_zeroed(thr->heap, size); - if (DUK_LIKELY(res != NULL || size == 0)) { - return res; - } - DUK_ERROR_ALLOC_FAILED(thr); - return NULL; -} - -/* - * Reallocate memory with garbage collection - */ - -DUK_INTERNAL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize) { - void *res; - duk_small_int_t i; - - DUK_ASSERT(heap != NULL); - /* ptr may be NULL */ - DUK_ASSERT_DISABLE(newsize >= 0); - - /* - * Voluntary periodic GC (if enabled) - */ - - DUK__VOLUNTARY_PERIODIC_GC(heap); - - /* - * First attempt - */ - -#if defined(DUK_USE_GC_TORTURE) - /* Simulate alloc failure on every realloc, except when mark-and-sweep - * is running. - */ - if (heap->ms_prevent_count == 0) { - DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first realloc attempt fails")); - res = NULL; - DUK_UNREF(res); - goto skip_attempt; - } -#endif - res = heap->realloc_func(heap->heap_udata, ptr, newsize); - if (DUK_LIKELY(res || newsize == 0)) { - /* For zero size allocations NULL is allowed. */ - return res; - } -#if defined(DUK_USE_GC_TORTURE) - skip_attempt: -#endif - - DUK_D(DUK_DPRINT("first realloc attempt failed, attempt to gc and retry")); - -#if 0 - /* - * Avoid a GC if GC is already running. See duk_heap_mem_alloc(). - */ - - if (heap->ms_prevent_count != 0) { - DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize)); - return NULL; - } -#endif - - /* - * Retry with several GC attempts. Initial attempts are made without - * emergency mode; later attempts use emergency mode which minimizes - * memory allocations forcibly. - */ - - for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { - duk_small_uint_t flags; - - flags = 0; - if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { - flags |= DUK_MS_FLAG_EMERGENCY; - } - - duk_heap_mark_and_sweep(heap, flags); - - res = heap->realloc_func(heap->heap_udata, ptr, newsize); - if (res || newsize == 0) { - DUK_D(DUK_DPRINT("duk_heap_mem_realloc() succeeded after gc (pass %ld), alloc size %ld", - (long) (i + 1), (long) newsize)); - return res; - } - } - - DUK_D(DUK_DPRINT("duk_heap_mem_realloc() failed even after gc, alloc size %ld", (long) newsize)); - return NULL; -} - -/* - * Reallocate memory with garbage collection, using a callback to provide - * the current allocated pointer. This variant is used when a mark-and-sweep - * (e.g. finalizers) might change the original pointer. - */ - -DUK_INTERNAL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize) { - void *res; - duk_small_int_t i; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT_DISABLE(newsize >= 0); - - /* - * Voluntary periodic GC (if enabled) - */ - - DUK__VOLUNTARY_PERIODIC_GC(heap); - - /* - * First attempt - */ - -#if defined(DUK_USE_GC_TORTURE) - /* Simulate alloc failure on every realloc, except when mark-and-sweep - * is running. - */ - if (heap->ms_prevent_count == 0) { - DUK_DDD(DUK_DDDPRINT("gc torture enabled, pretend that first indirect realloc attempt fails")); - res = NULL; - DUK_UNREF(res); - goto skip_attempt; - } -#endif - res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize); - if (DUK_LIKELY(res || newsize == 0)) { - /* For zero size allocations NULL is allowed. */ - return res; - } -#if defined(DUK_USE_GC_TORTURE) - skip_attempt: -#endif - - DUK_D(DUK_DPRINT("first indirect realloc attempt failed, attempt to gc and retry")); - -#if 0 - /* - * Avoid a GC if GC is already running. See duk_heap_mem_alloc(). - */ - - if (heap->ms_prevent_count != 0) { - DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed, gc in progress (gc skipped), alloc size %ld", (long) newsize)); - return NULL; - } -#endif - - /* - * Retry with several GC attempts. Initial attempts are made without - * emergency mode; later attempts use emergency mode which minimizes - * memory allocations forcibly. - */ - - for (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) { - duk_small_uint_t flags; - -#if defined(DUK_USE_DEBUG) - void *ptr_pre; - void *ptr_post; -#endif - -#if defined(DUK_USE_DEBUG) - ptr_pre = cb(heap, ud); -#endif - flags = 0; - if (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) { - flags |= DUK_MS_FLAG_EMERGENCY; - } - - duk_heap_mark_and_sweep(heap, flags); -#if defined(DUK_USE_DEBUG) - ptr_post = cb(heap, ud); - if (ptr_pre != ptr_post) { - DUK_DD(DUK_DDPRINT("realloc base pointer changed by mark-and-sweep: %p -> %p", - (void *) ptr_pre, (void *) ptr_post)); - } -#endif - - /* Note: key issue here is to re-lookup the base pointer on every attempt. - * The pointer being reallocated may change after every mark-and-sweep. - */ - - res = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize); - if (res || newsize == 0) { - DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() succeeded after gc (pass %ld), alloc size %ld", - (long) (i + 1), (long) newsize)); - return res; - } - } - - DUK_D(DUK_DPRINT("duk_heap_mem_realloc_indirect() failed even after gc, alloc size %ld", (long) newsize)); - return NULL; -} - -/* - * Free memory - */ - -DUK_INTERNAL void duk_heap_mem_free(duk_heap *heap, void *ptr) { - DUK_ASSERT(heap != NULL); - /* ptr may be NULL */ - - /* Must behave like a no-op with NULL and any pointer returned from - * malloc/realloc with zero size. - */ - heap->free_func(heap->heap_udata, ptr); - - /* Never perform a GC (even voluntary) in a memory free, otherwise - * all call sites doing frees would need to deal with the side effects. - * No need to update voluntary GC counter either. - */ -} - -/* automatic undefs */ -#undef DUK__VOLUNTARY_PERIODIC_GC -#line 1 "duk_heap_misc.c" -/* - * Support functions for duk_heap. - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) { - duk_heaphdr *root; - - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING); - - root = heap->heap_allocated; -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - if (root != NULL) { - DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); - DUK_HEAPHDR_SET_PREV(heap, root, hdr); - } - DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); -#endif - DUK_HEAPHDR_SET_NEXT(heap, hdr, root); - DUK_ASSERT_HEAPHDR_LINKS(heap, hdr); - DUK_ASSERT_HEAPHDR_LINKS(heap, root); - heap->heap_allocated = hdr; -} - -#if defined(DUK_USE_REFERENCE_COUNTING) -DUK_INTERNAL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) { - duk_heaphdr *prev; - duk_heaphdr *next; - - /* Strings are in string table. */ - DUK_ASSERT(hdr != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING); - - /* Target 'hdr' must be in heap_allocated (not e.g. finalize_list). - * If not, heap lists will become corrupted so assert early for it. - */ -#if defined(DUK_USE_ASSERTIONS) - { - duk_heaphdr *tmp; - for (tmp = heap->heap_allocated; tmp != NULL; tmp = DUK_HEAPHDR_GET_NEXT(heap, tmp)) { - if (tmp == hdr) { - break; - } - } - DUK_ASSERT(tmp == hdr); - } -#endif - - /* Read/write only once to minimize pointer compression calls. */ - prev = DUK_HEAPHDR_GET_PREV(heap, hdr); - next = DUK_HEAPHDR_GET_NEXT(heap, hdr); - - if (prev != NULL) { - DUK_ASSERT(heap->heap_allocated != hdr); - DUK_HEAPHDR_SET_NEXT(heap, prev, next); - } else { - DUK_ASSERT(heap->heap_allocated == hdr); - heap->heap_allocated = next; - } - if (next != NULL) { - DUK_HEAPHDR_SET_PREV(heap, next, prev); - } else { - ; - } -} -#endif /* DUK_USE_REFERENCE_COUNTING */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr) { - duk_heaphdr *root; - - root = heap->finalize_list; -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); - if (root != NULL) { - DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); - DUK_HEAPHDR_SET_PREV(heap, root, hdr); - } -#endif - DUK_HEAPHDR_SET_NEXT(heap, hdr, root); - DUK_ASSERT_HEAPHDR_LINKS(heap, hdr); - DUK_ASSERT_HEAPHDR_LINKS(heap, root); - heap->finalize_list = hdr; -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr) { -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - duk_heaphdr *next; - duk_heaphdr *prev; - - next = DUK_HEAPHDR_GET_NEXT(heap, hdr); - prev = DUK_HEAPHDR_GET_PREV(heap, hdr); - if (next != NULL) { - DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, next) == hdr); - DUK_HEAPHDR_SET_PREV(heap, next, prev); - } - if (prev == NULL) { - DUK_ASSERT(hdr == heap->finalize_list); - heap->finalize_list = next; - } else { - DUK_ASSERT(hdr != heap->finalize_list); - DUK_HEAPHDR_SET_NEXT(heap, prev, next); - } -#else - duk_heaphdr *next; - duk_heaphdr *curr; - - /* Random removal is expensive: we need to locate the previous element - * because we don't have a 'prev' pointer. - */ - curr = heap->finalize_list; - if (curr == hdr) { - heap->finalize_list = DUK_HEAPHDR_GET_NEXT(heap, curr); - } else { - DUK_ASSERT(hdr != heap->finalize_list); - for (;;) { - DUK_ASSERT(curr != NULL); /* Caller responsibility. */ - - next = DUK_HEAPHDR_GET_NEXT(heap, curr); - if (next == hdr) { - next = DUK_HEAPHDR_GET_NEXT(heap, hdr); - DUK_HEAPHDR_SET_NEXT(heap, curr, next); - break; - } - } - } -#endif -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -#if defined(DUK_USE_ASSERTIONS) -DUK_INTERNAL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr) { - duk_heaphdr *curr; - DUK_ASSERT(heap != NULL); - - for (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) { - if (curr == ptr) { - return 1; - } - } - return 0; -} -#endif /* DUK_USE_ASSERTIONS */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) -DUK_INTERNAL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr) { - duk_hthread *curr_thr; - - DUK_ASSERT(heap != NULL); - - if (new_thr != NULL) { - curr_thr = heap->curr_thread; - if (curr_thr == NULL) { - /* For initial entry use default value; zero forces an - * interrupt before executing the first insturction. - */ - DUK_DD(DUK_DDPRINT("switch thread, initial entry, init default interrupt counter")); - new_thr->interrupt_counter = 0; - new_thr->interrupt_init = 0; - } else { - /* Copy interrupt counter/init value state to new thread (if any). - * It's OK for new_thr to be the same as curr_thr. - */ -#if defined(DUK_USE_DEBUG) - if (new_thr != curr_thr) { - DUK_DD(DUK_DDPRINT("switch thread, not initial entry, copy interrupt counter")); - } -#endif - new_thr->interrupt_counter = curr_thr->interrupt_counter; - new_thr->interrupt_init = curr_thr->interrupt_init; - } - } else { - DUK_DD(DUK_DDPRINT("switch thread, new thread is NULL, no interrupt counter changes")); - } - - heap->curr_thread = new_thr; /* may be NULL */ -} -#endif /* DUK_USE_INTERRUPT_COUNTER */ -#line 1 "duk_heap_refcount.c" -/* - * Reference counting implementation. - * - * INCREF/DECREF, finalization and freeing of objects whose refcount reaches - * zero (refzero). These operations are very performance sensitive, so - * various small tricks are used in an attempt to maximize speed. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_REFERENCE_COUNTING) - -#if !defined(DUK_USE_DOUBLE_LINKED_HEAP) -#error internal error, reference counting requires a double linked heap -#endif - -/* - * Heap object refcount finalization. - * - * When an object is about to be freed, all other objects it refers to must - * be decref'd. Refcount finalization does NOT free the object or its inner - * allocations (mark-and-sweep shares these helpers), it just manipulates - * the refcounts. - * - * Note that any of the DECREFs may cause a refcount to drop to zero. If so, - * the object won't be refzero processed inline, but will just be queued to - * refzero_list and processed by an earlier caller working on refzero_list, - * eliminating C recursion from even long refzero cascades. If refzero - * finalization is triggered by mark-and-sweep, refzero conditions are ignored - * (objects are not even queued to refzero_list) because mark-and-sweep deals - * with them; refcounts are still updated so that they remain in sync with - * actual references. - */ - -DUK_LOCAL void duk__decref_tvals_norz(duk_hthread *thr, duk_tval *tv, duk_idx_t count) { - DUK_ASSERT(count == 0 || tv != NULL); - - while (count-- > 0) { - DUK_TVAL_DECREF_NORZ(thr, tv); - tv++; - } -} - -DUK_INTERNAL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h) { - duk_hthread *thr; - duk_uint_fast32_t i; - duk_uint_fast32_t n; - duk_propvalue *p_val; - duk_tval *p_tv; - duk_hstring **p_key; - duk_uint8_t *p_flag; - duk_hobject *h_proto; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(h); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h) == DUK_HTYPE_OBJECT); - - thr = heap->heap_thread; - DUK_ASSERT(thr != NULL); - - p_key = DUK_HOBJECT_E_GET_KEY_BASE(heap, h); - p_val = DUK_HOBJECT_E_GET_VALUE_BASE(heap, h); - p_flag = DUK_HOBJECT_E_GET_FLAGS_BASE(heap, h); - n = DUK_HOBJECT_GET_ENEXT(h); - while (n-- > 0) { - duk_hstring *key; - - key = p_key[n]; - if (DUK_UNLIKELY(key == NULL)) { - continue; - } - DUK_HSTRING_DECREF_NORZ(thr, key); - if (DUK_UNLIKELY(p_flag[n] & DUK_PROPDESC_FLAG_ACCESSOR)) { - duk_hobject *h_getset; - h_getset = p_val[n].a.get; - DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset)); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset); - h_getset = p_val[n].a.set; - DUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset)); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset); - } else { - duk_tval *tv_val; - tv_val = &p_val[n].v; - DUK_TVAL_DECREF_NORZ(thr, tv_val); - } - } - - p_tv = DUK_HOBJECT_A_GET_BASE(heap, h); - n = DUK_HOBJECT_GET_ASIZE(h); - while (n-- > 0) { - duk_tval *tv_val; - tv_val = p_tv + n; - DUK_TVAL_DECREF_NORZ(thr, tv_val); - } - - /* Hash part is a 'weak reference' and doesn't contribute to refcounts. */ - - h_proto = (duk_hobject *) DUK_HOBJECT_GET_PROTOTYPE(heap, h); - DUK_ASSERT(h_proto == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_proto)); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_proto); - - /* XXX: Object subclass tests are quite awkward at present, ideally - * we should be able to switch-case here with a dense index (subtype - * number or something). For now, fast path plain objects and arrays - * and bit test the rest individually. - */ - - if (DUK_HOBJECT_HAS_FASTREFS(h)) { - /* Plain object or array, nothing more to do. While a - * duk_harray has additional fields, none of them need - * DECREF updates. - */ - DUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h)); - return; - } - DUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h)); - - /* Slow path: special object, start bit checks from most likely. */ - - /* XXX: reorg, more common first */ - if (DUK_HOBJECT_IS_COMPFUNC(h)) { - duk_hcompfunc *f = (duk_hcompfunc *) h; - duk_tval *tv, *tv_end; - duk_hobject **funcs, **funcs_end; - - DUK_ASSERT_HCOMPFUNC_VALID(f); - - if (DUK_LIKELY(DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL)) { - tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f); - tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f); - while (tv < tv_end) { - DUK_TVAL_DECREF_NORZ(thr, tv); - tv++; - } - - funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f); - funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f); - while (funcs < funcs_end) { - duk_hobject *h_func; - h_func = *funcs; - DUK_ASSERT(h_func != NULL); - DUK_ASSERT(DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_func)); - DUK_HCOMPFUNC_DECREF_NORZ(thr, (duk_hcompfunc *) h_func); - funcs++; - } - } else { - /* May happen in some out-of-memory corner cases. */ - DUK_D(DUK_DPRINT("duk_hcompfunc 'data' is NULL, skipping decref")); - } - - DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f)); - DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f)); - DUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(heap, f)); - } else if (DUK_HOBJECT_IS_DECENV(h)) { - duk_hdecenv *e = (duk_hdecenv *) h; - DUK_ASSERT_HDECENV_VALID(e); - DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, e->thread); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, e->varmap); - } else if (DUK_HOBJECT_IS_OBJENV(h)) { - duk_hobjenv *e = (duk_hobjenv *) h; - DUK_ASSERT_HOBJENV_VALID(e); - DUK_ASSERT(e->target != NULL); /* Required for object environments. */ - DUK_HOBJECT_DECREF_NORZ(thr, e->target); -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - } else if (DUK_HOBJECT_IS_BUFOBJ(h)) { - duk_hbufobj *b = (duk_hbufobj *) h; - DUK_ASSERT_HBUFOBJ_VALID(b); - DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr, (duk_hbuffer *) b->buf); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) b->buf_prop); -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - } else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) { - duk_hboundfunc *f = (duk_hboundfunc *) h; - DUK_ASSERT_HBOUNDFUNC_VALID(f); - DUK_TVAL_DECREF_NORZ(thr, &f->target); - DUK_TVAL_DECREF_NORZ(thr, &f->this_binding); - duk__decref_tvals_norz(thr, f->args, f->nargs); -#if defined(DUK_USE_ES6_PROXY) - } else if (DUK_HOBJECT_IS_PROXY(h)) { - duk_hproxy *p = (duk_hproxy *) h; - DUK_ASSERT_HPROXY_VALID(p); - DUK_HOBJECT_DECREF_NORZ(thr, p->target); - DUK_HOBJECT_DECREF_NORZ(thr, p->handler); -#endif /* DUK_USE_ES6_PROXY */ - } else if (DUK_HOBJECT_IS_THREAD(h)) { - duk_hthread *t = (duk_hthread *) h; - duk_activation *act; - duk_tval *tv; - - DUK_ASSERT_HTHREAD_VALID(t); - - tv = t->valstack; - while (tv < t->valstack_top) { - DUK_TVAL_DECREF_NORZ(thr, tv); - tv++; - } - - for (act = t->callstack_curr; act != NULL; act = act->parent) { - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) DUK_ACT_GET_FUNC(act)); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->var_env); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->lex_env); -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->prev_caller); -#endif -#if 0 /* nothing now */ - for (cat = act->cat; cat != NULL; cat = cat->parent) { - } -#endif - } - - - for (i = 0; i < DUK_NUM_BUILTINS; i++) { - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) t->builtins[i]); - } - - DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, (duk_hthread *) t->resumer); - } else { - /* We may come here if the object should have a FASTREFS flag - * but it's missing for some reason. Assert for never getting - * here; however, other than performance, this is harmless. - */ - DUK_D(DUK_DPRINT("missing FASTREFS flag for: %!iO", h)); - DUK_ASSERT(0); - } -} - -DUK_INTERNAL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(hdr != NULL); - - if (DUK_HEAPHDR_IS_OBJECT(hdr)) { - duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) hdr); - } - /* DUK_HTYPE_BUFFER: nothing to finalize */ - /* DUK_HTYPE_STRING: nothing to finalize */ -} - -/* - * Refzero processing for duk_hobject: queue a refzero'ed object to either - * finalize_list or refzero_list and process the relevent list(s) if - * necessary. - * - * Refzero_list is single linked, with only 'prev' pointers set and valid. - * All 'next' pointers are intentionally left as garbage. This doesn't - * matter because refzero_list is processed to completion before any other - * code (like mark-and-sweep) might walk the list. - * - * In more detail: - * - * - On first insert refzero_list is NULL and the new object becomes the - * first and only element on the list; duk__refcount_free_pending() is - * called and it starts processing the list from the initial element, - * i.e. the list tail. - * - * - As each object is refcount finalized, new objects may be queued to - * refzero_list head. Their 'next' pointers are left as garbage, but - * 'prev' points are set correctly, with the element at refzero_list - * having a NULL 'prev' pointer. The fact that refzero_list is non-NULL - * is used to reject (1) recursive duk__refcount_free_pending() and - * (2) finalize_list processing calls. - * - * - When we're done with the current object, read its 'prev' pointer and - * free the object. If 'prev' is NULL, we've reached head of list and are - * done: set refzero_list to NULL and process pending finalizers. Otherwise - * continue processing the list. - * - * A refzero cascade is free of side effects because it only involves - * queueing more objects and freeing memory; finalizer execution is blocked - * in the code path queueing objects to finalize_list. As a result the - * initial refzero call (which triggers duk__refcount_free_pending()) must - * check finalize_list so that finalizers are executed snappily. - * - * If finalize_list processing starts first, refzero may occur while we're - * processing finalizers. That's fine: that particular refzero cascade is - * handled to completion without side effects. Once the cascade is complete, - * we'll run pending finalizers but notice that we're already doing that and - * return. - * - * This could be expanded to allow incremental freeing: just bail out - * early and resume at a future alloc/decref/refzero. However, if that - * were done, the list structure would need to be kept consistent at all - * times, mark-and-sweep would need to handle refzero_list, etc. - */ - -DUK_LOCAL void duk__refcount_free_pending(duk_heap *heap) { - duk_heaphdr *curr; -#if defined(DUK_USE_DEBUG) - duk_int_t count = 0; -#endif - - DUK_ASSERT(heap != NULL); - - curr = heap->refzero_list; - DUK_ASSERT(curr != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, curr) == NULL); /* We're called on initial insert only. */ - /* curr->next is GARBAGE. */ - - do { - duk_heaphdr *prev; - - DUK_DDD(DUK_DDDPRINT("refzero processing %p: %!O", (void *) curr, (duk_heaphdr *) curr)); - -#if defined(DUK_USE_DEBUG) - count++; -#endif - - DUK_ASSERT(curr != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT); /* currently, always the case */ - /* FINALIZED may be set; don't care about flags here. */ - - /* Refcount finalize 'curr'. Refzero_list must be non-NULL - * here to prevent recursive entry to duk__refcount_free_pending(). - */ - DUK_ASSERT(heap->refzero_list != NULL); - duk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr); - - prev = DUK_HEAPHDR_GET_PREV(heap, curr); - DUK_ASSERT((prev == NULL && heap->refzero_list == curr) || \ - (prev != NULL && heap->refzero_list != curr)); - /* prev->next is intentionally not updated and is garbage. */ - - duk_free_hobject(heap, (duk_hobject *) curr); /* Invalidates 'curr'. */ - - curr = prev; - } while (curr != NULL); - - heap->refzero_list = NULL; - - DUK_DD(DUK_DDPRINT("refzero processed %ld objects", (long) count)); -} - -DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hobject(duk_heap *heap, duk_hobject *obj, duk_bool_t skip_free_pending) { - duk_heaphdr *hdr; - duk_heaphdr *root; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) obj) == DUK_HTYPE_OBJECT); - - hdr = (duk_heaphdr *) obj; - - /* Refzero'd objects must be in heap_allocated. They can't be in - * finalize_list because all objects on finalize_list have an - * artificial +1 refcount bump. - */ -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(duk_heap_in_heap_allocated(heap, (duk_heaphdr *) obj)); -#endif - - DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, hdr); - -#if defined(DUK_USE_FINALIZER_SUPPORT) - /* This finalizer check MUST BE side effect free. It should also be - * as fast as possible because it's applied to every object freed. - */ - if (DUK_UNLIKELY(DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr) != 0U)) { - /* Special case: FINALIZED may be set if mark-and-sweep queued - * object for finalization, the finalizer was executed (and - * FINALIZED set), mark-and-sweep hasn't yet processed the - * object again, but its refcount drops to zero. Free without - * running the finalizer again. - */ - if (DUK_HEAPHDR_HAS_FINALIZED(hdr)) { - DUK_D(DUK_DPRINT("refzero'd object has finalizer and FINALIZED is set -> free")); - } else { - /* Set FINALIZABLE flag so that all objects on finalize_list - * will have it set and are thus detectable based on the - * flag alone. - */ - DUK_HEAPHDR_SET_FINALIZABLE(hdr); - DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(hdr)); - -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Bump refcount on finalize_list insert so that a - * refzero can never occur when an object is waiting - * for its finalizer call. Refzero might otherwise - * now happen because we allow duk_push_heapptr() for - * objects pending finalization. - */ - DUK_HEAPHDR_PREINC_REFCOUNT(hdr); -#endif - DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, hdr); - - /* Process finalizers unless skipping is explicitly - * requested (NORZ) or refzero_list is being processed - * (avoids side effects during a refzero cascade). - * If refzero_list is processed, the initial refzero - * call will run pending finalizers when refzero_list - * is done. - */ - if (!skip_free_pending && heap->refzero_list == NULL) { - duk_heap_process_finalize_list(heap); - } - return; - } - } -#endif /* DUK_USE_FINALIZER_SUPPORT */ - - /* No need to finalize, free object via refzero_list. */ - - root = heap->refzero_list; - - DUK_HEAPHDR_SET_PREV(heap, hdr, NULL); - /* 'next' is left as GARBAGE. */ - heap->refzero_list = hdr; - - if (root == NULL) { - /* Object is now queued. Refzero_list was NULL so - * no-one is currently processing it; do it here. - * With refzero processing just doing a cascade of - * free calls, we can process it directly even when - * NORZ macros are used: there are no side effects. - */ - duk__refcount_free_pending(heap); - DUK_ASSERT(heap->refzero_list == NULL); - - /* Process finalizers only after the entire cascade - * is finished. In most cases there's nothing to - * finalize, so fast path check to avoid a call. - */ -#if defined(DUK_USE_FINALIZER_SUPPORT) - if (!skip_free_pending && DUK_UNLIKELY(heap->finalize_list != NULL)) { - duk_heap_process_finalize_list(heap); - } -#endif - } else { - DUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL); - DUK_HEAPHDR_SET_PREV(heap, root, hdr); - - /* Object is now queued. Because refzero_list was - * non-NULL, it's already being processed by someone - * in the C call stack, so we're done. - */ - } -} - -#if defined(DUK_USE_FINALIZER_SUPPORT) -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_refzero_check_fast(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */ - - if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) { - duk_heap_process_finalize_list(thr->heap); - } -} - -DUK_INTERNAL void duk_refzero_check_slow(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(thr->heap->refzero_list == NULL); /* Processed to completion inline. */ - - if (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) { - duk_heap_process_finalize_list(thr->heap); - } -} -#endif /* DUK_USE_FINALIZER_SUPPORT */ - -/* - * Refzero processing for duk_hstring. - */ - -DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hstring(duk_heap *heap, duk_hstring *str) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(str != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) str) == DUK_HTYPE_STRING); - - duk_heap_strcache_string_remove(heap, str); - duk_heap_strtable_unlink(heap, str); - duk_free_hstring(heap, str); -} - -/* - * Refzero processing for duk_hbuffer. - */ - -DUK_LOCAL DUK_INLINE void duk__refcount_refzero_hbuffer(duk_heap *heap, duk_hbuffer *buf) { - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->heap_thread != NULL); - DUK_ASSERT(buf != NULL); - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) buf) == DUK_HTYPE_BUFFER); - - DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, (duk_heaphdr *) buf); - duk_free_hbuffer(heap, buf); -} - -/* - * Incref and decref functions. - * - * Decref may trigger immediate refzero handling, which may free and finalize - * an arbitrary number of objects (a "DECREF cascade"). - * - * Refzero handling is skipped entirely if (1) mark-and-sweep is running or - * (2) execution is paused in the debugger. The objects are left in the heap, - * and will be freed by mark-and-sweep or eventual heap destruction. - * - * This is necessary during mark-and-sweep because refcounts are also updated - * during the sweep phase (otherwise objects referenced by a swept object - * would have incorrect refcounts) which then calls here. This could be - * avoided by using separate decref macros in mark-and-sweep; however, - * mark-and-sweep also calls finalizers which would use the ordinary decref - * macros anyway. - * - * We can't process refzeros (= free objects) when the debugger is running - * as the debugger might make an object unreachable but still continue - * inspecting it (or even cause it to be pushed back). So we must rely on - * mark-and-sweep to collect them. - * - * The DUK__RZ_SUPPRESS_CHECK() condition is also used in heap destruction - * when running finalizers for remaining objects: the flag prevents objects - * from being moved around in heap linked lists while that's being done. - * - * The suppress condition is important to performance. - */ - -#define DUK__RZ_SUPPRESS_ASSERT1() do { \ - DUK_ASSERT(thr != NULL); \ - DUK_ASSERT(thr->heap != NULL); \ - /* When mark-and-sweep runs, heap_thread must exist. */ \ - DUK_ASSERT(thr->heap->ms_running == 0 || thr->heap->heap_thread != NULL); \ - /* When mark-and-sweep runs, the 'thr' argument always matches heap_thread. \ - * This could be used to e.g. suppress check against 'thr' directly (and \ - * knowing it would be heap_thread); not really used now. \ - */ \ - DUK_ASSERT(thr->heap->ms_running == 0 || thr == thr->heap->heap_thread); \ - /* We may be called when the heap is initializing and we process \ - * refzeros normally, but mark-and-sweep and finalizers are prevented \ - * if that's the case. \ - */ \ - DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->ms_prevent_count > 0); \ - DUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->pf_prevent_count > 0); \ - } while (0) - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -#define DUK__RZ_SUPPRESS_ASSERT2() do { \ - /* When debugger is paused, ms_running is set. */ \ - DUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->ms_running != 0); \ - } while (0) -#define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0) -#else -#define DUK__RZ_SUPPRESS_ASSERT2() do { } while (0) -#define DUK__RZ_SUPPRESS_COND() (heap->ms_running != 0) -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -#define DUK__RZ_SUPPRESS_CHECK() do { \ - DUK__RZ_SUPPRESS_ASSERT1(); \ - DUK__RZ_SUPPRESS_ASSERT2(); \ - if (DUK_UNLIKELY(DUK__RZ_SUPPRESS_COND())) { \ - DUK_DDD(DUK_DDDPRINT("refzero handling suppressed (not even queued) when mark-and-sweep running, object: %p", (void *) h)); \ - return; \ - } \ - } while (0) - -#define DUK__RZ_STRING() do { \ - duk__refcount_refzero_hstring(heap, (duk_hstring *) h); \ - } while (0) -#define DUK__RZ_BUFFER() do { \ - duk__refcount_refzero_hbuffer(heap, (duk_hbuffer *) h); \ - } while (0) -#define DUK__RZ_OBJECT() do { \ - duk__refcount_refzero_hobject(heap, (duk_hobject *) h, skip_free_pending); \ - } while (0) - -/* XXX: test the effect of inlining here vs. NOINLINE in refzero helpers */ -#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -#define DUK__RZ_INLINE DUK_ALWAYS_INLINE -#else -#define DUK__RZ_INLINE /*nop*/ -#endif - -DUK_LOCAL DUK__RZ_INLINE void duk__hstring_refzero_helper(duk_hthread *thr, duk_hstring *h) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - heap = thr->heap; - - DUK__RZ_SUPPRESS_CHECK(); - DUK__RZ_STRING(); -} - -DUK_LOCAL DUK__RZ_INLINE void duk__hbuffer_refzero_helper(duk_hthread *thr, duk_hbuffer *h) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - heap = thr->heap; - - DUK__RZ_SUPPRESS_CHECK(); - DUK__RZ_BUFFER(); -} - -DUK_LOCAL DUK__RZ_INLINE void duk__hobject_refzero_helper(duk_hthread *thr, duk_hobject *h, duk_bool_t skip_free_pending) { - duk_heap *heap; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - heap = thr->heap; - - DUK__RZ_SUPPRESS_CHECK(); - DUK__RZ_OBJECT(); -} - -DUK_LOCAL DUK__RZ_INLINE void duk__heaphdr_refzero_helper(duk_hthread *thr, duk_heaphdr *h, duk_bool_t skip_free_pending) { - duk_heap *heap; - duk_small_uint_t htype; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - heap = thr->heap; - - htype = (duk_small_uint_t) DUK_HEAPHDR_GET_TYPE(h); - DUK__RZ_SUPPRESS_CHECK(); - - switch (htype) { - case DUK_HTYPE_STRING: - /* Strings have no internal references but do have "weak" - * references in the string cache. Also note that strings - * are not on the heap_allocated list like other heap - * elements. - */ - - DUK__RZ_STRING(); - break; - - case DUK_HTYPE_OBJECT: - /* Objects have internal references. Must finalize through - * the "refzero" work list. - */ - - DUK__RZ_OBJECT(); - break; - - default: - /* Buffers have no internal references. However, a dynamic - * buffer has a separate allocation for the buffer. This is - * freed by duk_heap_free_heaphdr_raw(). - */ - - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(h) == DUK_HTYPE_BUFFER); - DUK__RZ_BUFFER(); - break; - } -} - -DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h) { - duk__heaphdr_refzero_helper(thr, h, 0 /*skip_free_pending*/); -} - -DUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h) { - duk__heaphdr_refzero_helper(thr, h, 1 /*skip_free_pending*/); -} - -DUK_INTERNAL DUK_NOINLINE void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h) { - duk__hstring_refzero_helper(thr, h); -} - -DUK_INTERNAL DUK_NOINLINE void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h) { - duk__hbuffer_refzero_helper(thr, h); -} - -DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h) { - duk__hobject_refzero_helper(thr, h, 0 /*skip_free_pending*/); -} - -DUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h) { - duk__hobject_refzero_helper(thr, h, 1 /*skip_free_pending*/); -} - -#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -DUK_INTERNAL void duk_tval_incref(duk_tval *tv) { - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { - duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); - DUK_ASSERT_DISABLE(h->h_refcount >= 0); - DUK_HEAPHDR_PREINC_REFCOUNT(h); - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) != 0); /* No wrapping. */ - } -} - -DUK_INTERNAL void duk_tval_decref(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { - duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1); -#if 0 - if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) { - return; - } - duk_heaphdr_refzero(thr, h); -#else - duk_heaphdr_decref(thr, h); -#endif - } -} - -DUK_INTERNAL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv != NULL); - - if (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) { - duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1); -#if 0 - if (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) { - return; - } - duk_heaphdr_refzero_norz(thr, h); -#else - duk_heaphdr_decref_norz(thr, h); -#endif - } -} -#endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */ - -#define DUK__DECREF_ASSERTS() do { \ - DUK_ASSERT(thr != NULL); \ - DUK_ASSERT(thr->heap != NULL); \ - DUK_ASSERT(h != NULL); \ - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((duk_heaphdr *) h)); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) >= 1); \ - } while (0) -#if defined(DUK_USE_ROM_OBJECTS) -#define DUK__INCREF_SHARED() do { \ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \ - return; \ - } \ - DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \ - } while (0) -#define DUK__DECREF_SHARED() do { \ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \ - return; \ - } \ - if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \ - return; \ - } \ - } while (0) -#else -#define DUK__INCREF_SHARED() do { \ - DUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \ - DUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0); /* No wrapping. */ \ - } while (0) -#define DUK__DECREF_SHARED() do { \ - if (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \ - return; \ - } \ - } while (0) -#endif - -#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT) -/* This will in practice be inlined because it's just an INC instructions - * and a bit test + INC when ROM objects are enabled. - */ -DUK_INTERNAL void duk_heaphdr_incref(duk_heaphdr *h) { - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h)); - DUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(h) >= 0); - - DUK__INCREF_SHARED(); -} - -DUK_INTERNAL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_heaphdr_refzero(thr, h); - - /* Forced mark-and-sweep when GC torture enabled; this could happen - * on any DECREF (but not DECREF_NORZ). - */ - DUK_GC_TORTURE(thr->heap); -} -DUK_INTERNAL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_heaphdr_refzero_norz(thr, h); -} -#endif /* !DUK_USE_FAST_REFCOUNT_DEFAULT */ - -#if 0 /* Not needed. */ -DUK_INTERNAL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hstring_refzero(thr, h); -} -DUK_INTERNAL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hstring_refzero_norz(thr, h); -} -DUK_INTERNAL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hbuffer_refzero(thr, h); -} -DUK_INTERNAL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hbuffer_refzero_norz(thr, h); -} -DUK_INTERNAL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hobject_refzero(thr, h); -} -DUK_INTERNAL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h) { - DUK__DECREF_ASSERTS(); - DUK__DECREF_SHARED(); - duk_hobject_refzero_norz(thr, h); -} -#endif - -#else /* DUK_USE_REFERENCE_COUNTING */ - -/* no refcounting */ - -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* automatic undefs */ -#undef DUK__DECREF_ASSERTS -#undef DUK__DECREF_SHARED -#undef DUK__INCREF_SHARED -#undef DUK__RZ_BUFFER -#undef DUK__RZ_INLINE -#undef DUK__RZ_OBJECT -#undef DUK__RZ_STRING -#undef DUK__RZ_SUPPRESS_ASSERT1 -#undef DUK__RZ_SUPPRESS_ASSERT2 -#undef DUK__RZ_SUPPRESS_CHECK -#undef DUK__RZ_SUPPRESS_COND -#line 1 "duk_heap_stringcache.c" -/* - * String cache. - * - * Provides a cache to optimize indexed string lookups. The cache keeps - * track of (byte offset, char offset) states for a fixed number of strings. - * Otherwise we'd need to scan from either end of the string, as we store - * strings in (extended) UTF-8. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Delete references to given hstring from the heap string cache. - * - * String cache references are 'weak': they are not counted towards - * reference counts, nor serve as roots for mark-and-sweep. When an - * object is about to be freed, such references need to be removed. - */ - -DUK_INTERNAL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h) { - duk_small_int_t i; - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - duk_strcache *c = heap->strcache + i; - if (c->h == h) { - DUK_DD(DUK_DDPRINT("deleting weak strcache reference to hstring %p from heap %p", - (void *) h, (void *) heap)); - c->h = NULL; - - /* XXX: the string shouldn't appear twice, but we now loop to the - * end anyway; if fixed, add a looping assertion to ensure there - * is no duplicate. - */ - } - } -} - -/* - * String scanning helpers - * - * All bytes other than UTF-8 continuation bytes ([0x80,0xbf]) are - * considered to contribute a character. This must match how string - * character length is computed. - */ - -DUK_LOCAL const duk_uint8_t *duk__scan_forwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) { - while (n > 0) { - for (;;) { - p++; - if (p >= q) { - return NULL; - } - if ((*p & 0xc0) != 0x80) { - break; - } - } - n--; - } - return p; -} - -DUK_LOCAL const duk_uint8_t *duk__scan_backwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) { - while (n > 0) { - for (;;) { - p--; - if (p < q) { - return NULL; - } - if ((*p & 0xc0) != 0x80) { - break; - } - } - n--; - } - return p; -} - -/* - * Convert char offset to byte offset - * - * Avoid using the string cache if possible: for ASCII strings byte and - * char offsets are equal and for short strings direct scanning may be - * better than using the string cache (which may evict a more important - * entry). - * - * Typing now assumes 32-bit string byte/char offsets (duk_uint_fast32_t). - * Better typing might be to use duk_size_t. - * - * Caller should ensure 'char_offset' is within the string bounds [0,charlen] - * (endpoint is inclusive). If this is not the case, no memory unsafe - * behavior will happen but an error will be thrown. - */ - -DUK_INTERNAL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset) { - duk_heap *heap; - duk_strcache *sce; - duk_uint_fast32_t byte_offset; - duk_small_int_t i; - duk_bool_t use_cache; - duk_uint_fast32_t dist_start, dist_end, dist_sce; - duk_uint_fast32_t char_length; - const duk_uint8_t *p_start; - const duk_uint8_t *p_end; - const duk_uint8_t *p_found; - - /* - * For ASCII strings, the answer is simple. - */ - - if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) { - return char_offset; - } - - char_length = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h); - DUK_ASSERT(char_offset <= char_length); - - if (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) { - /* Must recheck because the 'is ascii' flag may be set - * lazily. Alternatively, we could just compare charlen - * to bytelen. - */ - return char_offset; - } - - /* - * For non-ASCII strings, we need to scan forwards or backwards - * from some starting point. The starting point may be the start - * or end of the string, or some cached midpoint in the string - * cache. - * - * For "short" strings we simply scan without checking or updating - * the cache. For longer strings we check and update the cache as - * necessary, inserting a new cache entry if none exists. - */ - - DUK_DDD(DUK_DDDPRINT("non-ascii string %p, char_offset=%ld, clen=%ld, blen=%ld", - (void *) h, (long) char_offset, - (long) DUK_HSTRING_GET_CHARLEN(h), - (long) DUK_HSTRING_GET_BYTELEN(h))); - - heap = thr->heap; - sce = NULL; - use_cache = (char_length > DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT); - - if (use_cache) { -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - DUK_DDD(DUK_DDDPRINT("stringcache before char2byte (using cache):")); - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - duk_strcache *c = heap->strcache + i; - DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld", - (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx)); - } -#endif - - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - duk_strcache *c = heap->strcache + i; - - if (c->h == h) { - sce = c; - break; - } - } - } - - /* - * Scan from shortest distance: - * - start of string - * - end of string - * - cache entry (if exists) - */ - - DUK_ASSERT(DUK_HSTRING_GET_CHARLEN(h) >= char_offset); - dist_start = char_offset; - dist_end = char_length - char_offset; - dist_sce = 0; DUK_UNREF(dist_sce); /* initialize for debug prints, needed if sce==NULL */ - - p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - p_end = (const duk_uint8_t *) (p_start + DUK_HSTRING_GET_BYTELEN(h)); - p_found = NULL; - - if (sce) { - if (char_offset >= sce->cidx) { - dist_sce = char_offset - sce->cidx; - if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) { - DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " - "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " - "scan forwards from sce", - (long) use_cache, (void *) (sce ? sce->h : NULL), - (sce ? (long) sce->cidx : (long) -1), - (sce ? (long) sce->bidx : (long) -1), - (long) dist_start, (long) dist_end, (long) dist_sce)); - - p_found = duk__scan_forwards(p_start + sce->bidx, - p_end, - dist_sce); - goto scan_done; - } - } else { - dist_sce = sce->cidx - char_offset; - if ((dist_sce <= dist_start) && (dist_sce <= dist_end)) { - DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " - "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " - "scan backwards from sce", - (long) use_cache, (void *) (sce ? sce->h : NULL), - (sce ? (long) sce->cidx : (long) -1), - (sce ? (long) sce->bidx : (long) -1), - (long) dist_start, (long) dist_end, (long) dist_sce)); - - p_found = duk__scan_backwards(p_start + sce->bidx, - p_start, - dist_sce); - goto scan_done; - } - } - } - - /* no sce, or sce scan not best */ - - if (dist_start <= dist_end) { - DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " - "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " - "scan forwards from string start", - (long) use_cache, (void *) (sce ? sce->h : NULL), - (sce ? (long) sce->cidx : (long) -1), - (sce ? (long) sce->bidx : (long) -1), - (long) dist_start, (long) dist_end, (long) dist_sce)); - - p_found = duk__scan_forwards(p_start, - p_end, - dist_start); - } else { - DUK_DDD(DUK_DDDPRINT("non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, " - "dist_start=%ld, dist_end=%ld, dist_sce=%ld => " - "scan backwards from string end", - (long) use_cache, (void *) (sce ? sce->h : NULL), - (sce ? (long) sce->cidx : (long) -1), - (sce ? (long) sce->bidx : (long) -1), - (long) dist_start, (long) dist_end, (long) dist_sce)); - - p_found = duk__scan_backwards(p_end, - p_start, - dist_end); - } - - scan_done: - - if (DUK_UNLIKELY(p_found == NULL)) { - /* Scan error: this shouldn't normally happen; it could happen if - * string is not valid UTF-8 data, and clen/blen are not consistent - * with the scanning algorithm. - */ - goto scan_error; - } - - DUK_ASSERT(p_found >= p_start); - DUK_ASSERT(p_found <= p_end); /* may be equal */ - byte_offset = (duk_uint32_t) (p_found - p_start); - - DUK_DDD(DUK_DDDPRINT("-> string %p, cidx %ld -> bidx %ld", - (void *) h, (long) char_offset, (long) byte_offset)); - - /* - * Update cache entry (allocating if necessary), and move the - * cache entry to the first place (in an "LRU" policy). - */ - - if (use_cache) { - /* update entry, allocating if necessary */ - if (!sce) { - sce = heap->strcache + DUK_HEAP_STRCACHE_SIZE - 1; /* take last entry */ - sce->h = h; - } - DUK_ASSERT(sce != NULL); - sce->bidx = (duk_uint32_t) (p_found - p_start); - sce->cidx = (duk_uint32_t) char_offset; - - /* LRU: move our entry to first */ - if (sce > &heap->strcache[0]) { - /* - * A C - * B A - * C <- sce ==> B - * D D - */ - duk_strcache tmp; - - tmp = *sce; - DUK_MEMMOVE((void *) (&heap->strcache[1]), - (const void *) (&heap->strcache[0]), - (size_t) (((char *) sce) - ((char *) &heap->strcache[0]))); - heap->strcache[0] = tmp; - - /* 'sce' points to the wrong entry here, but is no longer used */ - } -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - DUK_DDD(DUK_DDDPRINT("stringcache after char2byte (using cache):")); - for (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) { - duk_strcache *c = heap->strcache + i; - DUK_DDD(DUK_DDDPRINT(" [%ld] -> h=%p, cidx=%ld, bidx=%ld", - (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx)); - } -#endif - } - - return byte_offset; - - scan_error: - DUK_ERROR_INTERNAL(thr); - return 0; -} -#line 1 "duk_heap_stringtable.c" -/* - * Heap string table handling, string interning. - */ - -/* #include duk_internal.h -> already included */ - -/* Resize checks not needed if minsize == maxsize, typical for low memory - * targets. - */ -#define DUK__STRTAB_RESIZE_CHECK -#if (DUK_USE_STRTAB_MINSIZE == DUK_USE_STRTAB_MAXSIZE) -#undef DUK__STRTAB_RESIZE_CHECK -#endif - -#if defined(DUK_USE_STRTAB_PTRCOMP) -#define DUK__HEAPPTR_ENC16(heap,ptr) DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (ptr)) -#define DUK__HEAPPTR_DEC16(heap,val) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (val)) -#define DUK__GET_STRTABLE(heap) ((heap)->strtable16) -#else -#define DUK__HEAPPTR_ENC16(heap,ptr) (ptr) -#define DUK__HEAPPTR_DEC16(heap,val) (val) -#define DUK__GET_STRTABLE(heap) ((heap)->strtable) -#endif - -#define DUK__STRTAB_U32_MAX_STRLEN 10 /* 4'294'967'295 */ - -/* - * Debug dump stringtable. - */ - -#if defined(DUK_USE_DEBUG) -DUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *strtable; -#else - duk_hstring **strtable; -#endif - duk_uint32_t i; - duk_hstring *h; - duk_size_t count_total = 0; - duk_size_t count_chain; - duk_size_t count_chain_min = DUK_SIZE_MAX; - duk_size_t count_chain_max = 0; - duk_size_t count_len[8]; /* chain lengths from 0 to 7 */ - - if (heap == NULL) { - DUK_D(DUK_DPRINT("string table, heap=NULL")); - return; - } - - strtable = DUK__GET_STRTABLE(heap); - if (strtable == NULL) { - DUK_D(DUK_DPRINT("string table, strtab=NULL")); - return; - } - - DUK_MEMZERO((void *) count_len, sizeof(count_len)); - for (i = 0; i < heap->st_size; i++) { - h = DUK__HEAPPTR_DEC16(heap, strtable[i]); - count_chain = 0; - while (h != NULL) { - count_chain++; - h = h->hdr.h_next; - } - if (count_chain < sizeof(count_len) / sizeof(duk_size_t)) { - count_len[count_chain]++; - } - count_chain_max = (count_chain > count_chain_max ? count_chain : count_chain_max); - count_chain_min = (count_chain < count_chain_min ? count_chain : count_chain_min); - count_total += count_chain; - } - - DUK_D(DUK_DPRINT("string table, strtab=%p, count=%lu, chain min=%lu max=%lu avg=%lf: " - "counts: %lu %lu %lu %lu %lu %lu %lu %lu ...", - (void *) heap->strtable, (unsigned long) count_total, - (unsigned long) count_chain_min, (unsigned long) count_chain_max, - (double) count_total / (double) heap->st_size, - (unsigned long) count_len[0], (unsigned long) count_len[1], - (unsigned long) count_len[2], (unsigned long) count_len[3], - (unsigned long) count_len[4], (unsigned long) count_len[5], - (unsigned long) count_len[6], (unsigned long) count_len[7])); -} -#endif /* DUK_USE_DEBUG */ - -/* - * Assertion helper to ensure strtable is populated correctly. - */ - -#if defined(DUK_USE_ASSERTIONS) -DUK_LOCAL void duk__strtable_assert_checks(duk_heap *heap) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *strtable; -#else - duk_hstring **strtable; -#endif - duk_uint32_t i; - duk_hstring *h; - duk_size_t count = 0; - - DUK_ASSERT(heap != NULL); - - strtable = DUK__GET_STRTABLE(heap); - if (strtable != NULL) { - DUK_ASSERT(heap->st_size != 0); - DUK_ASSERT(heap->st_mask == heap->st_size - 1); - - for (i = 0; i < heap->st_size; i++) { - h = DUK__HEAPPTR_DEC16(heap, strtable[i]); - while (h != NULL) { - DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i); - count++; - h = h->hdr.h_next; - } - } - } else { - DUK_ASSERT(heap->st_size == 0); - DUK_ASSERT(heap->st_mask == 0); - } - -#if defined(DUK__STRTAB_RESIZE_CHECK) - DUK_ASSERT(count == (duk_size_t) heap->st_count); -#endif -} -#endif /* DUK_USE_ASSERTIONS */ - -/* - * Allocate and initialize a duk_hstring. - * - * Returns a NULL if allocation or initialization fails for some reason. - * - * The string won't be inserted into the string table and isn't tracked in - * any way (link pointers will be NULL). The caller must place the string - * into the string table without any risk of a longjmp, otherwise the string - * is leaked. - */ - -DUK_LOCAL duk_hstring *duk__strtable_alloc_hstring(duk_heap *heap, - const duk_uint8_t *str, - duk_uint32_t blen, - duk_uint32_t strhash, - const duk_uint8_t *extdata) { - duk_hstring *res; - const duk_uint8_t *data; -#if !defined(DUK_USE_HSTRING_ARRIDX) - duk_uarridx_t dummy; -#endif - - DUK_ASSERT(heap != NULL); - DUK_UNREF(extdata); - -#if defined(DUK_USE_STRLEN16) - /* If blen <= 0xffffUL, clen is also guaranteed to be <= 0xffffUL. */ - if (blen > 0xffffUL) { - DUK_D(DUK_DPRINT("16-bit string blen/clen active and blen over 16 bits, reject intern")); - goto alloc_error; - } -#endif - - /* XXX: Memzeroing the allocated structure is not really necessary - * because we could just initialize all fields explicitly (almost - * all fields are initialized explicitly anyway). - */ -#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) - if (extdata) { - res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring_external)); - if (DUK_UNLIKELY(res == NULL)) { - goto alloc_error; - } - DUK_MEMZERO(res, sizeof(duk_hstring_external)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr); -#endif - DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, DUK_HSTRING_FLAG_EXTDATA); - - DUK_ASSERT(extdata[blen] == 0); /* Application responsibility. */ - data = extdata; - ((duk_hstring_external *) res)->extdata = extdata; - } else -#endif /* DUK_USE_HSTRING_EXTDATA && DUK_USE_EXTSTR_INTERN_CHECK */ - { - duk_uint8_t *data_tmp; - - /* NUL terminate for convenient C access */ - DUK_ASSERT(sizeof(duk_hstring) + blen + 1 > blen); /* No wrap, limits ensure. */ - res = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring) + blen + 1); - if (DUK_UNLIKELY(res == NULL)) { - goto alloc_error; - } - DUK_MEMZERO(res, sizeof(duk_hstring)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - DUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr); -#endif - DUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, 0); - - data_tmp = (duk_uint8_t *) (res + 1); - DUK_MEMCPY(data_tmp, str, blen); - data_tmp[blen] = (duk_uint8_t) 0; - data = (const duk_uint8_t *) data_tmp; - } - - DUK_HSTRING_SET_BYTELEN(res, blen); - DUK_HSTRING_SET_HASH(res, strhash); - - DUK_ASSERT(!DUK_HSTRING_HAS_ARRIDX(res)); -#if defined(DUK_USE_HSTRING_ARRIDX) - res->arridx = duk_js_to_arrayindex_string(data, blen); - if (res->arridx != DUK_HSTRING_NO_ARRAY_INDEX) { -#else - dummy = duk_js_to_arrayindex_string(data, blen); - if (dummy != DUK_HSTRING_NO_ARRAY_INDEX) { -#endif - /* Array index strings cannot be symbol strings, - * and they're always pure ASCII so blen == clen. - */ - DUK_HSTRING_SET_ARRIDX(res); - DUK_HSTRING_SET_ASCII(res); - DUK_ASSERT(duk_unicode_unvalidated_utf8_length(data, (duk_size_t) blen) == blen); - } else { - /* Because 'data' is NUL-terminated, we don't need a - * blen > 0 check here. For NUL (0x00) the symbol - * checks will be false. - */ - if (DUK_UNLIKELY(data[0] >= 0x80U)) { - if (data[0] <= 0x81) { - DUK_HSTRING_SET_SYMBOL(res); - } else if (data[0] == 0x82U || data[0] == 0xffU) { - DUK_HSTRING_SET_HIDDEN(res); - DUK_HSTRING_SET_SYMBOL(res); - } - } - - /* Using an explicit 'ASCII' flag has larger footprint (one call site - * only) but is quite useful for the case when there's no explicit - * 'clen' in duk_hstring. - * - * The flag is set lazily for RAM strings. - */ - DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(res)); - -#if defined(DUK_USE_HSTRING_LAZY_CLEN) - /* Charlen initialized to 0, updated on-the-fly. */ -#else - duk_hstring_init_charlen(res); /* Also sets ASCII flag. */ -#endif - } - - DUK_DDD(DUK_DDDPRINT("interned string, hash=0x%08lx, blen=%ld, has_arridx=%ld, has_extdata=%ld", - (unsigned long) DUK_HSTRING_GET_HASH(res), - (long) DUK_HSTRING_GET_BYTELEN(res), - (long) (DUK_HSTRING_HAS_ARRIDX(res) ? 1 : 0), - (long) (DUK_HSTRING_HAS_EXTDATA(res) ? 1 : 0))); - - DUK_ASSERT(res != NULL); - return res; - - alloc_error: - return NULL; -} - -/* - * Grow strtable allocation in-place. - */ - -#if defined(DUK__STRTAB_RESIZE_CHECK) -DUK_LOCAL void duk__strtable_grow_inplace(duk_heap *heap) { - duk_uint32_t new_st_size; - duk_uint32_t old_st_size; - duk_uint32_t i; - duk_hstring *h; - duk_hstring *next; - duk_hstring *prev; -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *new_ptr; - duk_uint16_t *new_ptr_high; -#else - duk_hstring **new_ptr; - duk_hstring **new_ptr_high; -#endif - - DUK_DD(DUK_DDPRINT("grow in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2)); - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->st_resizing == 1); - DUK_ASSERT(heap->st_size >= 2); - DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */ - DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); - - DUK_STATS_INC(heap, stats_strtab_resize_grow); - - new_st_size = heap->st_size << 1U; - DUK_ASSERT(new_st_size > heap->st_size); /* No overflow. */ - - /* Reallocate the strtable first and then work in-place to rehash - * strings. We don't need an indirect allocation here: even if GC - * is triggered to satisfy the allocation, recursive strtable resize - * is prevented by flags. This is also why we don't need to use - * DUK_REALLOC_INDIRECT(). - */ - -#if defined(DUK_USE_STRTAB_PTRCOMP) - new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size); -#else - new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size); -#endif - if (DUK_UNLIKELY(new_ptr == NULL)) { - /* If realloc fails we can continue normally: the string table - * won't "fill up" although chains will gradually get longer. - * When string insertions continue, we'll quite soon try again - * with no special handling. - */ - DUK_D(DUK_DPRINT("string table grow failed, ignoring")); - return; - } -#if defined(DUK_USE_STRTAB_PTRCOMP) - heap->strtable16 = new_ptr; -#else - heap->strtable = new_ptr; -#endif - - /* Rehash a single bucket into two separate ones. When we grow - * by x2 the highest 'new' bit determines whether a string remains - * in its old position (bit is 0) or goes to a new one (bit is 1). - */ - - old_st_size = heap->st_size; - new_ptr_high = new_ptr + old_st_size; - for (i = 0; i < old_st_size; i++) { - duk_hstring *new_root; - duk_hstring *new_root_high; - - h = DUK__HEAPPTR_DEC16(heap, new_ptr[i]); - new_root = h; - new_root_high = NULL; - - prev = NULL; - while (h != NULL) { - duk_uint32_t mask; - - DUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i); - next = h->hdr.h_next; - - /* Example: if previous size was 256, previous mask is 0xFF - * and size is 0x100 which corresponds to the new bit that - * comes into play. - */ - DUK_ASSERT(heap->st_mask == old_st_size - 1); - mask = old_st_size; - if (DUK_HSTRING_GET_HASH(h) & mask) { - if (prev != NULL) { - prev->hdr.h_next = h->hdr.h_next; - } else { - DUK_ASSERT(h == new_root); - new_root = h->hdr.h_next; - } - - h->hdr.h_next = new_root_high; - new_root_high = h; - } else { - prev = h; - } - h = next; - } - - new_ptr[i] = DUK__HEAPPTR_ENC16(heap, new_root); - new_ptr_high[i] = DUK__HEAPPTR_ENC16(heap, new_root_high); - } - - heap->st_size = new_st_size; - heap->st_mask = new_st_size - 1; - -#if defined(DUK_USE_ASSERTIONS) - duk__strtable_assert_checks(heap); -#endif -} -#endif /* DUK__STRTAB_RESIZE_CHECK */ - -/* - * Shrink strtable allocation in-place. - */ - -#if defined(DUK__STRTAB_RESIZE_CHECK) -DUK_LOCAL void duk__strtable_shrink_inplace(duk_heap *heap) { - duk_uint32_t new_st_size; - duk_uint32_t i; - duk_hstring *h; - duk_hstring *other; - duk_hstring *root; -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *old_ptr; - duk_uint16_t *old_ptr_high; - duk_uint16_t *new_ptr; -#else - duk_hstring **old_ptr; - duk_hstring **old_ptr_high; - duk_hstring **new_ptr; -#endif - - DUK_DD(DUK_DDPRINT("shrink in-place: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2)); - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(heap->st_resizing == 1); - DUK_ASSERT(heap->st_size >= 2); - DUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0); /* 2^N */ - DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); - - DUK_STATS_INC(heap, stats_strtab_resize_shrink); - - new_st_size = heap->st_size >> 1U; - - /* Combine two buckets into a single one. When we shrink, one hash - * bit (highest) disappears. - */ - old_ptr = DUK__GET_STRTABLE(heap); - old_ptr_high = old_ptr + new_st_size; - for (i = 0; i < new_st_size; i++) { - h = DUK__HEAPPTR_DEC16(heap, old_ptr[i]); - other = DUK__HEAPPTR_DEC16(heap, old_ptr_high[i]); - - if (h == NULL) { - /* First chain is empty, so use second one as is. */ - root = other; - } else { - /* Find end of first chain, and link in the second. */ - root = h; - while (h->hdr.h_next != NULL) { - h = h->hdr.h_next; - } - h->hdr.h_next = other; - } - - old_ptr[i] = DUK__HEAPPTR_ENC16(heap, root); - } - - heap->st_size = new_st_size; - heap->st_mask = new_st_size - 1; - - /* The strtable is now consistent and we can realloc safely. Even - * if side effects cause string interning or removal the strtable - * updates are safe. Recursive resize has been prevented by caller. - * This is also why we don't need to use DUK_REALLOC_INDIRECT(). - * - * We assume a realloc() to a smaller size is guaranteed to succeed. - * It would be relatively straightforward to handle the error by - * essentially performing a "grow" step to recover. - */ - -#if defined(DUK_USE_STRTAB_PTRCOMP) - new_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size); - DUK_ASSERT(new_ptr != NULL); - heap->strtable16 = new_ptr; -#else - new_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size); - DUK_ASSERT(new_ptr != NULL); - heap->strtable = new_ptr; -#endif - -#if defined(DUK_USE_ASSERTIONS) - duk__strtable_assert_checks(heap); -#endif -} -#endif /* DUK__STRTAB_RESIZE_CHECK */ - -/* - * Grow/shrink check. - */ - -#if defined(DUK__STRTAB_RESIZE_CHECK) -DUK_LOCAL DUK_COLD DUK_NOINLINE void duk__strtable_resize_check(duk_heap *heap) { - duk_uint32_t load_factor; /* fixed point */ - - DUK_ASSERT(heap != NULL); -#if defined(DUK_USE_STRTAB_PTRCOMP) - DUK_ASSERT(heap->strtable16 != NULL); -#else - DUK_ASSERT(heap->strtable != NULL); -#endif - - DUK_STATS_INC(heap, stats_strtab_resize_check); - - /* Prevent recursive resizing. */ - if (DUK_UNLIKELY(heap->st_resizing != 0U)) { - DUK_D(DUK_DPRINT("prevent recursive strtable resize")); - return; - } - - heap->st_resizing = 1; - - DUK_ASSERT(heap->st_size >= 16U); - DUK_ASSERT((heap->st_size >> 4U) >= 1); - load_factor = heap->st_count / (heap->st_size >> 4U); - - DUK_DD(DUK_DDPRINT("resize check string table: size=%lu, count=%lu, load_factor=%lu (fixed point .4; float %lf)", - (unsigned long) heap->st_size, (unsigned long) heap->st_count, - (unsigned long) load_factor, - (double) heap->st_count / (double) heap->st_size)); - - if (load_factor >= DUK_USE_STRTAB_GROW_LIMIT) { - if (heap->st_size >= DUK_USE_STRTAB_MAXSIZE) { - DUK_DD(DUK_DDPRINT("want to grow strtable (based on load factor) but already maximum size")); - } else { - DUK_D(DUK_DPRINT("grow string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2)); -#if defined(DUK_USE_DEBUG) - duk_heap_strtable_dump(heap); -#endif - duk__strtable_grow_inplace(heap); - } - } else if (load_factor <= DUK_USE_STRTAB_SHRINK_LIMIT) { - if (heap->st_size <= DUK_USE_STRTAB_MINSIZE) { - DUK_DD(DUK_DDPRINT("want to shrink strtable (based on load factor) but already minimum size")); - } else { - DUK_D(DUK_DPRINT("shrink string table: %lu -> %lu", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2)); -#if defined(DUK_USE_DEBUG) - duk_heap_strtable_dump(heap); -#endif - duk__strtable_shrink_inplace(heap); - } - } else { - DUK_DD(DUK_DDPRINT("no need for strtable resize")); - } - - heap->st_resizing = 0; -} -#endif /* DUK__STRTAB_RESIZE_CHECK */ - -/* - * Torture grow/shrink: unconditionally grow and shrink back. - */ - -#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK) -DUK_LOCAL void duk__strtable_resize_torture(duk_heap *heap) { - duk_uint32_t old_st_size; - - DUK_ASSERT(heap != NULL); - - old_st_size = heap->st_size; - if (old_st_size >= DUK_USE_STRTAB_MAXSIZE) { - return; - } - - heap->st_resizing = 1; - duk__strtable_grow_inplace(heap); - if (heap->st_size > old_st_size) { - duk__strtable_shrink_inplace(heap); - } - heap->st_resizing = 0; -} -#endif /* DUK_USE_STRTAB_TORTURE && DUK__STRTAB_RESIZE_CHECK */ - -/* - * Raw intern; string already checked not to be present. - */ - -DUK_LOCAL duk_hstring *duk__strtable_do_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) { - duk_hstring *res; - const duk_uint8_t *extdata; -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *slot; -#else - duk_hstring **slot; -#endif - - DUK_DDD(DUK_DDDPRINT("do_intern: heap=%p, str=%p, blen=%lu, strhash=%lx, st_size=%lu, st_count=%lu, load=%lf", - (void *) heap, (const void *) str, (unsigned long) blen, (unsigned long) strhash, - (unsigned long) heap->st_size, (unsigned long) heap->st_count, - (double) heap->st_count / (double) heap->st_size)); - - DUK_ASSERT(heap != NULL); - - /* Prevent any side effects on the string table and the caller provided - * str/blen arguments while interning is in progress. For example, if - * the caller provided str/blen from a dynamic buffer, a finalizer - * might resize or modify that dynamic buffer, invalidating the call - * arguments. - * - * While finalizers must be prevented, mark-and-sweep itself is fine. - * Recursive string table resize is prevented explicitly here. - */ - - heap->pf_prevent_count++; - DUK_ASSERT(heap->pf_prevent_count != 0); /* Wrap. */ - -#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK) - duk__strtable_resize_torture(heap); -#endif - - /* String table grow/shrink check. Because of chaining (and no - * accumulation issues as with hash probe chains and DELETED - * markers) there's never a mandatory need to resize right now. - * Check for the resize only periodically, based on st_count - * bit pattern. Because string table removal doesn't do a shrink - * check, we do that also here. - * - * Do the resize and possible grow/shrink before the new duk_hstring - * has been allocated. Otherwise we may trigger a GC when the result - * duk_hstring is not yet strongly referenced. - */ - -#if defined(DUK__STRTAB_RESIZE_CHECK) - if (DUK_UNLIKELY((heap->st_count & DUK_USE_STRTAB_RESIZE_CHECK_MASK) == 0)) { - duk__strtable_resize_check(heap); - } -#endif - - /* External string check (low memory optimization). */ - -#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) - extdata = (const duk_uint8_t *) DUK_USE_EXTSTR_INTERN_CHECK(heap->heap_udata, (void *) DUK_LOSE_CONST(str), (duk_size_t) blen); -#else - extdata = (const duk_uint8_t *) NULL; -#endif - - /* Allocate and initialize string, not yet linked. This may cause a - * GC which may cause other strings to be interned and inserted into - * the string table before we insert our string. Finalizer execution - * is disabled intentionally to avoid a finalizer from e.g. resizing - * a buffer used as a data area for 'str'. - */ - - res = duk__strtable_alloc_hstring(heap, str, blen, strhash, extdata); - - /* Allow side effects again: GC must be avoided until duk_hstring - * result (if successful) has been INCREF'd. - */ - DUK_ASSERT(heap->pf_prevent_count > 0); - heap->pf_prevent_count--; - - /* Alloc error handling. */ - - if (DUK_UNLIKELY(res == NULL)) { -#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK) - if (extdata != NULL) { - DUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) extdata); - } -#endif - return NULL; - } - - /* Insert into string table. */ - -#if defined(DUK_USE_STRTAB_PTRCOMP) - slot = heap->strtable16 + (strhash & heap->st_mask); -#else - slot = heap->strtable + (strhash & heap->st_mask); -#endif - DUK_ASSERT(res->hdr.h_next == NULL); /* This is the case now, but unnecessary zeroing/NULLing. */ - res->hdr.h_next = DUK__HEAPPTR_DEC16(heap, *slot); - *slot = DUK__HEAPPTR_ENC16(heap, res); - - /* Update string count only for successful inserts. */ - -#if defined(DUK__STRTAB_RESIZE_CHECK) - heap->st_count++; -#endif - - /* The duk_hstring is in the string table but is not yet strongly - * reachable. Calling code MUST NOT make any allocations or other - * side effects before the duk_hstring has been INCREF'd and made - * reachable. - */ - - return res; -} - -/* - * Intern a string from str/blen, returning either an existing duk_hstring - * or adding a new one into the string table. The input string does -not- - * need to be NUL terminated. - * - * The input 'str' argument may point to a Duktape managed data area such as - * the data area of a dynamic buffer. It's crucial to avoid any side effects - * that might affect the data area (e.g. resize the dynamic buffer, or write - * to the buffer) before the string is fully interned. - */ - -#if defined(DUK_USE_ROM_STRINGS) -DUK_LOCAL duk_hstring *duk__strtab_romstring_lookup(duk_heap *heap, const duk_uint8_t *str, duk_size_t blen, duk_uint32_t strhash) { - duk_size_t lookup_hash; - duk_hstring *curr; - - DUK_ASSERT(heap != NULL); - DUK_UNREF(heap); - - lookup_hash = (blen << 4); - if (blen > 0) { - lookup_hash += str[0]; - } - lookup_hash &= 0xff; - - curr = DUK_LOSE_CONST(duk_rom_strings_lookup[lookup_hash]); - while (curr != NULL) { - if (strhash == DUK_HSTRING_GET_HASH(curr) && - blen == DUK_HSTRING_GET_BYTELEN(curr) && - DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(curr), blen) == 0) { - DUK_DDD(DUK_DDDPRINT("intern check: rom string: %!O, computed hash 0x%08lx, rom hash 0x%08lx", - curr, (unsigned long) strhash, (unsigned long) DUK_HSTRING_GET_HASH(curr))); - return curr; - } - curr = curr->hdr.h_next; - } - - return NULL; -} -#endif /* DUK_USE_ROM_STRINGS */ - -DUK_INTERNAL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen) { - duk_uint32_t strhash; - duk_hstring *h; - - DUK_DDD(DUK_DDDPRINT("intern check: heap=%p, str=%p, blen=%lu", (void *) heap, (const void *) str, (unsigned long) blen)); - - /* Preliminaries. */ - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(blen == 0 || str != NULL); - DUK_ASSERT(blen <= DUK_HSTRING_MAX_BYTELEN); /* Caller is responsible for ensuring this. */ - strhash = duk_heap_hashstring(heap, str, (duk_size_t) blen); - - /* String table lookup. */ - - DUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL); - DUK_ASSERT(heap->st_size > 0); - DUK_ASSERT(heap->st_size == heap->st_mask + 1); -#if defined(DUK_USE_STRTAB_PTRCOMP) - h = DUK__HEAPPTR_DEC16(heap, heap->strtable16[strhash & heap->st_mask]); -#else - h = heap->strtable[strhash & heap->st_mask]; -#endif - while (h != NULL) { - if (DUK_HSTRING_GET_HASH(h) == strhash && - DUK_HSTRING_GET_BYTELEN(h) == blen && - DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(h), (size_t) blen) == 0) { - /* Found existing entry. */ - DUK_STATS_INC(heap, stats_strtab_intern_hit); - return h; - } - h = h->hdr.h_next; - } - - /* ROM table lookup. Because this lookup is slower, do it only after - * RAM lookup. This works because no ROM string is ever interned into - * the RAM string table. - */ - -#if defined(DUK_USE_ROM_STRINGS) - h = duk__strtab_romstring_lookup(heap, str, blen, strhash); - if (h != NULL) { - DUK_STATS_INC(heap, stats_strtab_intern_hit); - return h; - } -#endif - - /* Not found in string table; insert. */ - - DUK_STATS_INC(heap, stats_strtab_intern_miss); - h = duk__strtable_do_intern(heap, str, blen, strhash); - return h; /* may be NULL */ -} - -/* - * Intern a string from u32. - */ - -/* XXX: Could arrange some special handling because we know that the result - * will have an arridx flag and an ASCII flag, won't need a clen check, etc. - */ - -DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val) { - duk_uint8_t buf[DUK__STRTAB_U32_MAX_STRLEN]; - duk_uint8_t *p; - - DUK_ASSERT(heap != NULL); - - /* This is smaller and faster than a %lu sprintf. */ - p = buf + sizeof(buf); - do { - p--; - *p = duk_lc_digits[val % 10]; - val = val / 10; - } while (val != 0); /* For val == 0, emit exactly one '0'. */ - DUK_ASSERT(p >= buf); - - return duk_heap_strtable_intern(heap, (const duk_uint8_t *) p, (duk_uint32_t) ((buf + sizeof(buf)) - p)); -} - -/* - * Checked convenience variants. - * - * XXX: Because the main use case is for the checked variants, make them the - * main functionality and provide a safe variant separately (it is only needed - * during heap init). The problem with that is that longjmp state and error - * creation must already be possible to throw. - */ - -DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t blen) { - duk_hstring *res; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(blen == 0 || str != NULL); - - res = duk_heap_strtable_intern(thr->heap, str, blen); - if (DUK_UNLIKELY(res == NULL)) { - DUK_ERROR_ALLOC_FAILED(thr); - } - return res; -} - -DUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val) { - duk_hstring *res; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - - res = duk_heap_strtable_intern_u32(thr->heap, val); - if (DUK_UNLIKELY(res == NULL)) { - DUK_ERROR_ALLOC_FAILED(thr); - } - return res; -} - -/* - * Remove (unlink) a string from the string table. - * - * Just unlinks the duk_hstring, leaving link pointers as garbage. - * Caller must free the string itself. - */ - -#if defined(DUK_USE_REFERENCE_COUNTING) -/* Unlink without a 'prev' pointer. */ -DUK_INTERNAL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *slot; -#else - duk_hstring **slot; -#endif - duk_hstring *other; - duk_hstring *prev; - - DUK_DDD(DUK_DDDPRINT("remove: heap=%p, h=%p, blen=%lu, strhash=%lx", - (void *) heap, (void *) h, - (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0), - (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0))); - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - -#if defined(DUK__STRTAB_RESIZE_CHECK) - DUK_ASSERT(heap->st_count > 0); - heap->st_count--; -#endif - -#if defined(DUK_USE_STRTAB_PTRCOMP) - slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); -#else - slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); -#endif - other = DUK__HEAPPTR_DEC16(heap, *slot); - DUK_ASSERT(other != NULL); /* At least argument string is in the chain. */ - - prev = NULL; - while (other != h) { - prev = other; - other = other->hdr.h_next; - DUK_ASSERT(other != NULL); /* We'll eventually find 'h'. */ - } - if (prev != NULL) { - /* Middle of list. */ - prev->hdr.h_next = h->hdr.h_next; - } else { - /* Head of list. */ - *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next); - } - - /* There's no resize check on a string free. The next string - * intern will do one. - */ -} -#endif /* DUK_USE_REFERENCE_COUNTING */ - -/* Unlink with a 'prev' pointer. */ -DUK_INTERNAL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *slot; -#else - duk_hstring **slot; -#endif - - DUK_DDD(DUK_DDDPRINT("remove: heap=%p, prev=%p, h=%p, blen=%lu, strhash=%lx", - (void *) heap, (void *) prev, (void *) h, - (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0), - (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0))); - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(h != NULL); - DUK_ASSERT(prev == NULL || prev->hdr.h_next == h); - -#if defined(DUK__STRTAB_RESIZE_CHECK) - DUK_ASSERT(heap->st_count > 0); - heap->st_count--; -#endif - - if (prev != NULL) { - /* Middle of list. */ - prev->hdr.h_next = h->hdr.h_next; - } else { - /* Head of list. */ -#if defined(DUK_USE_STRTAB_PTRCOMP) - slot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); -#else - slot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask); -#endif - DUK_ASSERT(DUK__HEAPPTR_DEC16(heap, *slot) == h); - *slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next); - } -} - -/* - * Force string table resize check in mark-and-sweep. - */ - -DUK_INTERNAL void duk_heap_strtable_force_resize(duk_heap *heap) { - /* Does only one grow/shrink step if needed. The heap->st_resizing - * flag protects against recursive resizing. - */ - - DUK_ASSERT(heap != NULL); - DUK_UNREF(heap); - -#if defined(DUK__STRTAB_RESIZE_CHECK) -#if defined(DUK_USE_STRTAB_PTRCOMP) - if (heap->strtable16 != NULL) { -#else - if (heap->strtable != NULL) { -#endif - duk__strtable_resize_check(heap); - } -#endif -} - -/* - * Free strings in the string table and the string table itself. - */ - -DUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap) { -#if defined(DUK_USE_STRTAB_PTRCOMP) - duk_uint16_t *strtable; - duk_uint16_t *st; -#else - duk_hstring **strtable; - duk_hstring **st; -#endif - duk_hstring *h; - - DUK_ASSERT(heap != NULL); - -#if defined(DUK_USE_ASSERTIONS) - duk__strtable_assert_checks(heap); -#endif - - /* Strtable can be NULL if heap init fails. However, in that case - * heap->st_size is 0, so strtable == strtable_end and we skip the - * loop without a special check. - */ - strtable = DUK__GET_STRTABLE(heap); - st = strtable + heap->st_size; - DUK_ASSERT(strtable != NULL || heap->st_size == 0); - - while (strtable != st) { - --st; - h = DUK__HEAPPTR_DEC16(heap, *st); - while (h) { - duk_hstring *h_next; - h_next = h->hdr.h_next; - - /* Strings may have inner refs (extdata) in some cases. */ - duk_free_hstring(heap, h); - - h = h_next; - } - } - - DUK_FREE(heap, strtable); -} - -/* automatic undefs */ -#undef DUK__GET_STRTABLE -#undef DUK__HEAPPTR_DEC16 -#undef DUK__HEAPPTR_ENC16 -#undef DUK__STRTAB_U32_MAX_STRLEN -#line 1 "duk_hobject_alloc.c" -/* - * Hobject allocation. - * - * Provides primitive allocation functions for all object types (plain object, - * compiled function, native function, thread). The object return is not yet - * in "heap allocated" list and has a refcount of zero, so caller must careful. - */ - -/* XXX: In most cases there's no need for plain allocation without pushing - * to the value stack. Maybe rework contract? - */ - -/* #include duk_internal.h -> already included */ - -/* - * Helpers. - */ - -DUK_LOCAL void duk__init_object_parts(duk_heap *heap, duk_uint_t hobject_flags, duk_hobject *obj) { - DUK_ASSERT(obj != NULL); - /* Zeroed by caller. */ - - obj->hdr.h_flags = hobject_flags | DUK_HTYPE_OBJECT; - DUK_ASSERT(DUK_HEAPHDR_GET_TYPE(&obj->hdr) == DUK_HTYPE_OBJECT); /* Assume zero shift. */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - DUK_HOBJECT_SET_PROTOTYPE(heap, obj, NULL); - DUK_HOBJECT_SET_PROPS(heap, obj, NULL); -#endif -#if defined(DUK_USE_HEAPPTR16) - /* Zero encoded pointer is required to match NULL. */ - DUK_HEAPHDR_SET_NEXT(heap, &obj->hdr, NULL); -#if defined(DUK_USE_DOUBLE_LINKED_HEAP) - DUK_HEAPHDR_SET_PREV(heap, &obj->hdr, NULL); -#endif -#endif - DUK_ASSERT_HEAPHDR_LINKS(heap, &obj->hdr); - DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &obj->hdr); - - /* obj->props is intentionally left as NULL, and duk_hobject_props.c must deal - * with this properly. This is intentional: empty objects consume a minimum - * amount of memory. Further, an initial allocation might fail and cause - * 'obj' to "leak" (require a mark-and-sweep) since it is not reachable yet. - */ -} - -DUK_LOCAL void *duk__hobject_alloc_init(duk_hthread *thr, duk_uint_t hobject_flags, duk_size_t size) { - void *res; - - res = (void *) DUK_ALLOC_CHECKED_ZEROED(thr, size); - DUK_ASSERT(res != NULL); - duk__init_object_parts(thr->heap, hobject_flags, (duk_hobject *) res); - return res; -} - -/* - * Allocate an duk_hobject. - * - * The allocated object has no allocation for properties; the caller may - * want to force a resize if a desired size is known. - * - * The allocated object has zero reference count and is not reachable. - * The caller MUST make the object reachable and increase its reference - * count before invoking any operation that might require memory allocation. - */ - -DUK_INTERNAL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) { - duk_hobject *res; - - DUK_ASSERT(heap != NULL); - - /* different memory layout, alloc size, and init */ - DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_COMPFUNC) == 0); - DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_NATFUNC) == 0); - DUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_BOUNDFUNC) == 0); - - res = (duk_hobject *) DUK_ALLOC_ZEROED(heap, sizeof(duk_hobject)); - if (DUK_UNLIKELY(res == NULL)) { - return NULL; - } - DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res)); - - duk__init_object_parts(heap, hobject_flags, res); - - DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res)); - return res; -} - -DUK_INTERNAL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hobject *res; - - res = (duk_hobject *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobject)); - return res; -} - -DUK_INTERNAL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hcompfunc *res; - - res = (duk_hcompfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hcompfunc)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_HEAPPTR16) - /* NULL pointer is required to encode to zero, so memset is enough. */ -#else - res->data = NULL; - res->funcs = NULL; - res->bytecode = NULL; -#endif - res->lex_env = NULL; - res->var_env = NULL; -#endif - - return res; -} - -DUK_INTERNAL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hnatfunc *res; - - res = (duk_hnatfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hnatfunc)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->func = NULL; -#endif - - return res; -} - -DUK_INTERNAL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags) { - duk_hboundfunc *res; - - res = (duk_hboundfunc *) DUK_ALLOC(heap, sizeof(duk_hboundfunc)); - if (!res) { - return NULL; - } - DUK_MEMZERO(res, sizeof(duk_hboundfunc)); - - duk__init_object_parts(heap, hobject_flags, &res->obj); - - DUK_TVAL_SET_UNDEFINED(&res->target); - DUK_TVAL_SET_UNDEFINED(&res->this_binding); - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->args = NULL; -#endif - - return res; -} - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_INTERNAL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hbufobj *res; - - res = (duk_hbufobj *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hbufobj)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->buf = NULL; - res->buf_prop = NULL; -#endif - - DUK_ASSERT_HBUFOBJ_VALID(res); - return res; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* Allocate a new thread. - * - * Leaves the built-ins array uninitialized. The caller must either - * initialize a new global context or share existing built-ins from - * another thread. - */ -DUK_INTERNAL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) { - duk_hthread *res; - - res = (duk_hthread *) DUK_ALLOC(heap, sizeof(duk_hthread)); - if (DUK_UNLIKELY(res == NULL)) { - return NULL; - } - DUK_MEMZERO(res, sizeof(duk_hthread)); - - duk__init_object_parts(heap, hobject_flags, &res->obj); - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->ptr_curr_pc = NULL; - res->heap = NULL; - res->valstack = NULL; - res->valstack_end = NULL; - res->valstack_alloc_end = NULL; - res->valstack_bottom = NULL; - res->valstack_top = NULL; - res->callstack_curr = NULL; - res->resumer = NULL; - res->compile_ctx = NULL, -#if defined(DUK_USE_HEAPPTR16) - res->strs16 = NULL; -#else - res->strs = NULL; -#endif - { - duk_small_uint_t i; - for (i = 0; i < DUK_NUM_BUILTINS; i++) { - res->builtins[i] = NULL; - } - } -#endif - /* When nothing is running, API calls are in non-strict mode. */ - DUK_ASSERT(res->strict == 0); - - res->heap = heap; - - /* XXX: Any reason not to merge duk_hthread_alloc.c here? */ - return res; -} - -DUK_INTERNAL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hthread *res; - - res = duk_hthread_alloc_unchecked(thr->heap, hobject_flags); - if (res == NULL) { - DUK_ERROR_ALLOC_FAILED(thr); - } - return res; -} - -DUK_INTERNAL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_harray *res; - - res = (duk_harray *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_harray)); - - DUK_ASSERT(res->length == 0); - - return res; -} - -DUK_INTERNAL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hdecenv *res; - - res = (duk_hdecenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hdecenv)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->thread = NULL; - res->varmap = NULL; -#endif - - DUK_ASSERT(res->thread == NULL); - DUK_ASSERT(res->varmap == NULL); - DUK_ASSERT(res->regbase_byteoff == 0); - - return res; -} - -DUK_INTERNAL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hobjenv *res; - - res = (duk_hobjenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobjenv)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - res->target = NULL; -#endif - - DUK_ASSERT(res->target == NULL); - - return res; -} - -DUK_INTERNAL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags) { - duk_hproxy *res; - - res = (duk_hproxy *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hproxy)); - - /* Leave ->target and ->handler uninitialized, as caller will always - * explicitly initialize them before any side effects are possible. - */ - - return res; -} -#line 1 "duk_hobject_enum.c" -/* - * Object enumeration support. - * - * Creates an internal enumeration state object to be used e.g. with for-in - * enumeration. The state object contains a snapshot of target object keys - * and internal control state for enumeration. Enumerator flags allow caller - * to e.g. request internal/non-enumerable properties, and to enumerate only - * "own" properties. - * - * Also creates the result value for e.g. Object.keys() based on the same - * internal structure. - * - * This snapshot-based enumeration approach is used to simplify enumeration: - * non-snapshot-based approaches are difficult to reconcile with mutating - * the enumeration target, running multiple long-lived enumerators at the - * same time, garbage collection details, etc. The downside is that the - * enumerator object is memory inefficient especially for iterating arrays. - */ - -/* #include duk_internal.h -> already included */ - -/* XXX: identify enumeration target with an object index (not top of stack) */ - -/* First enumerated key index in enumerator object, must match exactly the - * number of control properties inserted to the enumerator. - */ -#define DUK__ENUM_START_INDEX 2 - -/* Current implementation suffices for ES2015 for now because there's no symbol - * sorting, so commented out for now. - */ - -/* - * Helper to sort enumeration keys using a callback for pairwise duk_hstring - * comparisons. The keys are in the enumeration object entry part, starting - * from DUK__ENUM_START_INDEX, and the entry part is dense. Entry part values - * are all "true", e.g. "1" -> true, "3" -> true, "foo" -> true, "2" -> true, - * so it suffices to just switch keys without switching values. - * - * ES2015 [[OwnPropertyKeys]] enumeration order for ordinary objects: - * (1) array indices in ascending order, - * (2) non-array-index keys in insertion order, and - * (3) symbols in insertion order. - * http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys. - * - * This rule is applied to "own properties" at each inheritance level; - * non-duplicate parent keys always follow child keys. For example, - * an inherited array index will enumerate -after- a symbol in the - * child. - * - * Insertion sort is used because (1) it's simple and compact, (2) works - * in-place, (3) minimizes operations if data is already nearly sorted, - * (4) doesn't reorder elements considered equal. - * http://en.wikipedia.org/wiki/Insertion_sort - */ - -/* Sort key, must hold array indices, "not array index" marker, and one more - * higher value for symbols. - */ -#if !defined(DUK_USE_SYMBOL_BUILTIN) -typedef duk_uint32_t duk__sort_key_t; -#elif defined(DUK_USE_64BIT_OPS) -typedef duk_uint64_t duk__sort_key_t; -#else -typedef duk_double_t duk__sort_key_t; -#endif - -/* Get sort key for a duk_hstring. */ -DUK_LOCAL duk__sort_key_t duk__hstring_sort_key(duk_hstring *x) { - duk__sort_key_t val; - - /* For array indices [0,0xfffffffe] use the array index as is. - * For strings, use 0xffffffff, the marker 'arridx' already in - * duk_hstring. For symbols, any value above 0xffffffff works, - * as long as it is the same for all symbols; currently just add - * the masked flag field into the arridx temporary. - */ - DUK_ASSERT(x != NULL); - DUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(x) || DUK_HSTRING_GET_ARRIDX_FAST(x) == DUK_HSTRING_NO_ARRAY_INDEX); - - val = (duk__sort_key_t) DUK_HSTRING_GET_ARRIDX_FAST(x); - -#if defined(DUK_USE_SYMBOL_BUILTIN) - val = val + (duk__sort_key_t) (DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) x) & DUK_HSTRING_FLAG_SYMBOL); -#endif - - return (duk__sort_key_t) val; -} - -/* Insert element 'b' after element 'a'? */ -DUK_LOCAL duk_bool_t duk__sort_compare_es6(duk_hstring *a, duk_hstring *b, duk__sort_key_t val_b) { - duk__sort_key_t val_a; - - DUK_ASSERT(a != NULL); - DUK_ASSERT(b != NULL); - DUK_UNREF(b); /* Not actually needed now, val_b suffices. */ - - val_a = duk__hstring_sort_key(a); - - if (val_a > val_b) { - return 0; - } else { - return 1; - } -} - -DUK_LOCAL void duk__sort_enum_keys_es6(duk_hthread *thr, duk_hobject *h_obj, duk_int_fast32_t idx_start, duk_int_fast32_t idx_end) { - duk_hstring **keys; - duk_int_fast32_t idx; - - DUK_ASSERT(h_obj != NULL); - DUK_ASSERT(idx_start >= DUK__ENUM_START_INDEX); - DUK_ASSERT(idx_end >= idx_start); - DUK_UNREF(thr); - - if (idx_end <= idx_start + 1) { - return; /* Zero or one element(s). */ - } - - keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, h_obj); - - for (idx = idx_start + 1; idx < idx_end; idx++) { - duk_hstring *h_curr; - duk_int_fast32_t idx_insert; - duk__sort_key_t val_curr; - - h_curr = keys[idx]; - DUK_ASSERT(h_curr != NULL); - - /* Scan backwards for insertion place. This works very well - * when the elements are nearly in order which is the common - * (and optimized for) case. - */ - - val_curr = duk__hstring_sort_key(h_curr); /* Remains same during scanning. */ - for (idx_insert = idx - 1; idx_insert >= idx_start; idx_insert--) { - duk_hstring *h_insert; - h_insert = keys[idx_insert]; - DUK_ASSERT(h_insert != NULL); - - if (duk__sort_compare_es6(h_insert, h_curr, val_curr)) { - break; - } - } - /* If we're out of indices, idx_insert == idx_start - 1 and idx_insert++ - * brings us back to idx_start. - */ - idx_insert++; - DUK_ASSERT(idx_insert >= 0 && idx_insert <= idx); - - /* .-- p_insert .-- p_curr - * v v - * | ... | insert | ... | curr - */ - - /* This could also done when the keys are in order, i.e. - * idx_insert == idx. The result would be an unnecessary - * memmove() but we use an explicit check because the keys - * are very often in order already. - */ - if (idx != idx_insert) { - DUK_MEMMOVE((void *) (keys + idx_insert + 1), - (const void *) (keys + idx_insert), - ((size_t) (idx - idx_insert) * sizeof(duk_hstring *))); - keys[idx_insert] = h_curr; - } - } -} - -/* - * Create an internal enumerator object E, which has its keys ordered - * to match desired enumeration ordering. Also initialize internal control - * properties for enumeration. - * - * Note: if an array was used to hold enumeration keys instead, an array - * scan would be needed to eliminate duplicates found in the prototype chain. - */ - -DUK_LOCAL void duk__add_enum_key(duk_hthread *thr, duk_hstring *k) { - /* 'k' may be unreachable on entry so must push without any - * potential for GC. - */ - duk_push_hstring(thr, k); - duk_push_true(thr); - duk_put_prop(thr, -3); -} - -DUK_LOCAL void duk__add_enum_key_stridx(duk_hthread *thr, duk_small_uint_t stridx) { - duk__add_enum_key(thr, DUK_HTHREAD_GET_STRING(thr, stridx)); -} - -DUK_INTERNAL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags) { - duk_hobject *enum_target; - duk_hobject *curr; - duk_hobject *res; -#if defined(DUK_USE_ES6_PROXY) - duk_hobject *h_proxy_target; - duk_hobject *h_proxy_handler; - duk_hobject *h_trap_result; -#endif - duk_uint_fast32_t i, len; /* used for array, stack, and entry indices */ - duk_uint_fast32_t sort_start_index; - - DUK_ASSERT(thr != NULL); - - enum_target = duk_require_hobject(thr, -1); - DUK_ASSERT(enum_target != NULL); - - duk_push_bare_object(thr); - res = duk_known_hobject(thr, -1); - - /* [enum_target res] */ - - /* Target must be stored so that we can recheck whether or not - * keys still exist when we enumerate. This is not done if the - * enumeration result comes from a proxy trap as there is no - * real object to check against. - */ - duk_push_hobject(thr, enum_target); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_TARGET); - - /* Initialize index so that we skip internal control keys. */ - duk_push_int(thr, DUK__ENUM_START_INDEX); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT); - - /* - * Proxy object handling - */ - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_LIKELY((enum_flags & DUK_ENUM_NO_PROXY_BEHAVIOR) != 0)) { - goto skip_proxy; - } - if (DUK_LIKELY(!duk_hobject_proxy_check(enum_target, - &h_proxy_target, - &h_proxy_handler))) { - goto skip_proxy; - } - - /* XXX: share code with Object.keys() Proxy handling */ - - /* In ES2015 for-in invoked the "enumerate" trap; in ES2016 "enumerate" - * has been obsoleted and "ownKeys" is used instead. - */ - DUK_DDD(DUK_DDDPRINT("proxy enumeration")); - duk_push_hobject(thr, h_proxy_handler); - if (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) { - /* No need to replace the 'enum_target' value in stack, only the - * enum_target reference. This also ensures that the original - * enum target is reachable, which keeps the proxy and the proxy - * target reachable. We do need to replace the internal _Target. - */ - DUK_DDD(DUK_DDDPRINT("no ownKeys trap, enumerate proxy target instead")); - DUK_DDD(DUK_DDDPRINT("h_proxy_target=%!O", (duk_heaphdr *) h_proxy_target)); - enum_target = h_proxy_target; - - duk_push_hobject(thr, enum_target); /* -> [ ... enum_target res handler undefined target ] */ - duk_put_prop_stridx_short(thr, -4, DUK_STRIDX_INT_TARGET); - - duk_pop_2(thr); /* -> [ ... enum_target res ] */ - goto skip_proxy; - } - - /* [ ... enum_target res handler trap ] */ - duk_insert(thr, -2); - duk_push_hobject(thr, h_proxy_target); /* -> [ ... enum_target res trap handler target ] */ - duk_call_method(thr, 1 /*nargs*/); /* -> [ ... enum_target res trap_result ] */ - h_trap_result = duk_require_hobject(thr, -1); - DUK_UNREF(h_trap_result); - - duk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags); - /* -> [ ... enum_target res trap_result keys_array ] */ - - /* Copy cleaned up trap result keys into the enumerator object. */ - /* XXX: result is a dense array; could make use of that. */ - DUK_ASSERT(duk_is_array(thr, -1)); - len = (duk_uint_fast32_t) duk_get_length(thr, -1); - for (i = 0; i < len; i++) { - (void) duk_get_prop_index(thr, -1, (duk_uarridx_t) i); - DUK_ASSERT(duk_is_string(thr, -1)); /* postprocess cleaned up */ - /* [ ... enum_target res trap_result keys_array val ] */ - duk_push_true(thr); - /* [ ... enum_target res trap_result keys_array val true ] */ - duk_put_prop(thr, -5); - } - /* [ ... enum_target res trap_result keys_array ] */ - duk_pop_2(thr); - duk_remove_m2(thr); - - /* [ ... res ] */ - - /* The internal _Target property is kept pointing to the original - * enumeration target (the proxy object), so that the enumerator - * 'next' operation can read property values if so requested. The - * fact that the _Target is a proxy disables key existence check - * during enumeration. - */ - DUK_DDD(DUK_DDDPRINT("proxy enumeration, final res: %!O", (duk_heaphdr *) res)); - goto compact_and_return; - - skip_proxy: -#endif /* DUK_USE_ES6_PROXY */ - - curr = enum_target; - sort_start_index = DUK__ENUM_START_INDEX; - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(res) == DUK__ENUM_START_INDEX); - while (curr) { - duk_uint_fast32_t sort_end_index; -#if !defined(DUK_USE_PREFER_SIZE) - duk_bool_t need_sort = 0; -#endif - - /* Enumeration proceeds by inheritance level. Virtual - * properties need to be handled specially, followed by - * array part, and finally entry part. - * - * If there are array index keys in the entry part or any - * other risk of the ES2015 [[OwnPropertyKeys]] order being - * violated, need_sort is set and an explicit ES2015 sort is - * done for the inheritance level. - */ - - /* XXX: inheriting from proxy */ - - /* - * Virtual properties. - * - * String and buffer indices are virtual and always enumerable, - * 'length' is virtual and non-enumerable. Array and arguments - * object props have special behavior but are concrete. - * - * String and buffer objects don't have an array part so as long - * as virtual array index keys are enumerated first, we don't - * need to set need_sort. - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr) || DUK_HOBJECT_IS_BUFOBJ(curr)) { -#else - if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) { -#endif - duk_bool_t have_length = 1; - - /* String and buffer enumeration behavior is identical now, - * so use shared handler. - */ - if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) { - duk_hstring *h_val; - h_val = duk_hobject_get_internal_value_string(thr->heap, curr); - DUK_ASSERT(h_val != NULL); /* string objects must not created without internal value */ - len = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_val); - } -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - else { - duk_hbufobj *h_bufobj; - DUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(curr)); - h_bufobj = (duk_hbufobj *) curr; - - if (h_bufobj == NULL || !h_bufobj->is_typedarray) { - /* Zero length seems like a good behavior for neutered buffers. - * ArrayBuffer (non-view) and DataView don't have index properties - * or .length property. - */ - len = 0; - have_length = 0; - } else { - /* There's intentionally no check for - * current underlying buffer length. - */ - len = (duk_uint_fast32_t) (h_bufobj->length >> h_bufobj->shift); - } - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - - for (i = 0; i < len; i++) { - duk_hstring *k; - - /* This is a bit fragile: the string is not - * reachable until it is pushed by the helper. - */ - k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i); - DUK_ASSERT(k); - - duk__add_enum_key(thr, k); - - /* [enum_target res] */ - } - - /* 'length' and other virtual properties are not - * enumerable, but are included if non-enumerable - * properties are requested. - */ - - if (have_length && (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) { - duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH); - } - } - - /* - * Array part - */ - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(curr); i++) { - duk_hstring *k; - duk_tval *tv; - - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, curr, i); - if (DUK_TVAL_IS_UNUSED(tv)) { - continue; - } - k = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i); /* Fragile reachability. */ - DUK_ASSERT(k); - - duk__add_enum_key(thr, k); - - /* [enum_target res] */ - } - - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(curr)) { - /* Array .length comes after numeric indices. */ - if (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) { - duk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH); - } - } - - /* - * Entries part - */ - - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(curr); i++) { - duk_hstring *k; - - k = DUK_HOBJECT_E_GET_KEY(thr->heap, curr, i); - if (!k) { - continue; - } - if (!(enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) && - !DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(thr->heap, curr, i)) { - continue; - } - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) { - if (!(enum_flags & DUK_ENUM_INCLUDE_HIDDEN) && - DUK_HSTRING_HAS_HIDDEN(k)) { - continue; - } - if (!(enum_flags & DUK_ENUM_INCLUDE_SYMBOLS)) { - continue; - } -#if !defined(DUK_USE_PREFER_SIZE) - need_sort = 1; -#endif - } else { - DUK_ASSERT(!DUK_HSTRING_HAS_HIDDEN(k)); /* would also have symbol flag */ - if (enum_flags & DUK_ENUM_EXCLUDE_STRINGS) { - continue; - } - } - if (DUK_HSTRING_HAS_ARRIDX(k)) { - /* This in currently only possible if the - * object has no array part: the array part - * is exhaustive when it is present. - */ -#if !defined(DUK_USE_PREFER_SIZE) - need_sort = 1; -#endif - } else { - if (enum_flags & DUK_ENUM_ARRAY_INDICES_ONLY) { - continue; - } - } - - DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, curr, i) || - !DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE_PTR(thr->heap, curr, i)->v)); - - duk__add_enum_key(thr, k); - - /* [enum_target res] */ - } - - /* Sort enumerated keys according to ES2015 requirements for - * the "inheritance level" just processed. This is far from - * optimal, ES2015 semantics could be achieved more efficiently - * by handling array index string keys (and symbol keys) - * specially above in effect doing the sort inline. - * - * Skip the sort if array index sorting is requested because - * we must consider all keys, also inherited, so an explicit - * sort is done for the whole result after we're done with the - * prototype chain. - * - * Also skip the sort if need_sort == 0, i.e. we know for - * certain that the enumerated order is already correct. - */ - sort_end_index = DUK_HOBJECT_GET_ENEXT(res); - - if (!(enum_flags & DUK_ENUM_SORT_ARRAY_INDICES)) { -#if defined(DUK_USE_PREFER_SIZE) - duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index); -#else - if (need_sort) { - DUK_DDD(DUK_DDDPRINT("need to sort")); - duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index); - } else { - DUK_DDD(DUK_DDDPRINT("no need to sort")); - } -#endif - } - - sort_start_index = sort_end_index; - - if (enum_flags & DUK_ENUM_OWN_PROPERTIES_ONLY) { - break; - } - - curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); - } - - /* [enum_target res] */ - - duk_remove_m2(thr); - - /* [res] */ - - if (enum_flags & DUK_ENUM_SORT_ARRAY_INDICES) { - /* Some E5/E5.1 algorithms require that array indices are iterated - * in a strictly ascending order. This is the case for e.g. - * Array.prototype.forEach() and JSON.stringify() PropertyList - * handling. The caller can request an explicit sort in these - * cases. - */ - - /* Sort to ES2015 order which works for pure array incides but - * also for mixed keys. - */ - duk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) DUK__ENUM_START_INDEX, (duk_int_fast32_t) DUK_HOBJECT_GET_ENEXT(res)); - } - -#if defined(DUK_USE_ES6_PROXY) - compact_and_return: -#endif - /* compact; no need to seal because object is internal */ - duk_hobject_compact_props(thr, res); - - DUK_DDD(DUK_DDDPRINT("created enumerator object: %!iT", (duk_tval *) duk_get_tval(thr, -1))); -} - -/* - * Returns non-zero if a key and/or value was enumerated, and: - * - * [enum] -> [key] (get_value == 0) - * [enum] -> [key value] (get_value == 1) - * - * Returns zero without pushing anything on the stack otherwise. - */ -DUK_INTERNAL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value) { - duk_hobject *e; - duk_hobject *enum_target; - duk_hstring *res = NULL; - duk_uint_fast32_t idx; - duk_bool_t check_existence; - - DUK_ASSERT(thr != NULL); - - /* [... enum] */ - - e = duk_require_hobject(thr, -1); - - /* XXX use get tval ptr, more efficient */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_NEXT); - idx = (duk_uint_fast32_t) duk_require_uint(thr, -1); - duk_pop(thr); - DUK_DDD(DUK_DDDPRINT("enumeration: index is: %ld", (long) idx)); - - /* Enumeration keys are checked against the enumeration target (to see - * that they still exist). In the proxy enumeration case _Target will - * be the proxy, and checking key existence against the proxy is not - * required (or sensible, as the keys may be fully virtual). - */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TARGET); - enum_target = duk_require_hobject(thr, -1); - DUK_ASSERT(enum_target != NULL); -#if defined(DUK_USE_ES6_PROXY) - check_existence = (!DUK_HOBJECT_IS_PROXY(enum_target)); -#else - check_existence = 1; -#endif - duk_pop(thr); /* still reachable */ - - DUK_DDD(DUK_DDDPRINT("getting next enum value, enum_target=%!iO, enumerator=%!iT", - (duk_heaphdr *) enum_target, (duk_tval *) duk_get_tval(thr, -1))); - - /* no array part */ - for (;;) { - duk_hstring *k; - - if (idx >= DUK_HOBJECT_GET_ENEXT(e)) { - DUK_DDD(DUK_DDDPRINT("enumeration: ran out of elements")); - break; - } - - /* we know these because enum objects are internally created */ - k = DUK_HOBJECT_E_GET_KEY(thr->heap, e, idx); - DUK_ASSERT(k != NULL); - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, e, idx)); - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE(thr->heap, e, idx).v)); - - idx++; - - /* recheck that the property still exists */ - if (check_existence && !duk_hobject_hasprop_raw(thr, enum_target, k)) { - DUK_DDD(DUK_DDDPRINT("property deleted during enumeration, skip")); - continue; - } - - DUK_DDD(DUK_DDDPRINT("enumeration: found element, key: %!O", (duk_heaphdr *) k)); - res = k; - break; - } - - DUK_DDD(DUK_DDDPRINT("enumeration: updating next index to %ld", (long) idx)); - - duk_push_u32(thr, (duk_uint32_t) idx); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT); - - /* [... enum] */ - - if (res) { - duk_push_hstring(thr, res); - if (get_value) { - duk_push_hobject(thr, enum_target); - duk_dup_m2(thr); /* -> [... enum key enum_target key] */ - duk_get_prop(thr, -2); /* -> [... enum key enum_target val] */ - duk_remove_m2(thr); /* -> [... enum key val] */ - duk_remove(thr, -3); /* -> [... key val] */ - } else { - duk_remove_m2(thr); /* -> [... key] */ - } - return 1; - } else { - duk_pop(thr); /* -> [...] */ - return 0; - } -} - -/* - * Get enumerated keys in an Ecmascript array. Matches Object.keys() behavior - * described in E5 Section 15.2.3.14. - */ - -DUK_INTERNAL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags) { - duk_hobject *e; - duk_hstring **keys; - duk_tval *tv; - duk_uint_fast32_t count; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(duk_get_hobject(thr, -1) != NULL); - - /* Create a temporary enumerator to get the (non-duplicated) key list; - * the enumerator state is initialized without being needed, but that - * has little impact. - */ - - duk_hobject_enumerator_create(thr, enum_flags); - e = duk_known_hobject(thr, -1); - - /* [enum_target enum res] */ - - /* Create dense result array to exact size. */ - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(e) >= DUK__ENUM_START_INDEX); - count = (duk_uint32_t) (DUK_HOBJECT_GET_ENEXT(e) - DUK__ENUM_START_INDEX); - - /* XXX: uninit would be OK */ - tv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count); - DUK_ASSERT(count == 0 || tv != NULL); - - /* Fill result array, no side effects. */ - - keys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, e); - keys += DUK__ENUM_START_INDEX; - - while (count-- > 0) { - duk_hstring *k; - - k = *keys++; - DUK_ASSERT(k != NULL); /* enumerator must have no keys deleted */ - - DUK_TVAL_SET_STRING(tv, k); - tv++; - DUK_HSTRING_INCREF(thr, k); - } - - /* [enum_target enum res] */ - duk_remove_m2(thr); - - /* [enum_target res] */ - - return 1; /* return 1 to allow callers to tail call */ -} - -/* automatic undefs */ -#undef DUK__ENUM_START_INDEX -#line 1 "duk_hobject_misc.c" -/* - * Misc support functions - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop) { - duk_uint_t sanity; - - DUK_ASSERT(thr != NULL); - - /* False if the object is NULL or the prototype 'p' is NULL. - * In particular, false if both are NULL (don't compare equal). - */ - if (h == NULL || p == NULL) { - return 0; - } - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (h == p) { - return 1; - } - - if (sanity-- == 0) { - if (ignore_loop) { - break; - } else { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - } - h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); - } while (h); - - return 0; -} - -DUK_INTERNAL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p) { -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_hobject *tmp; - - DUK_ASSERT(h); - tmp = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, p); /* avoid problems if p == h->prototype */ - DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); -#else - DUK_ASSERT(h); - DUK_UNREF(thr); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p); -#endif -} -#line 1 "duk_hobject_pc2line.c" -/* - * Helpers for creating and querying pc2line debug data, which - * converts a bytecode program counter to a source line number. - * - * The run-time pc2line data is bit-packed, and documented in: - * - * doc/function-objects.rst - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_PC2LINE) - -/* Generate pc2line data for an instruction sequence, leaving a buffer on stack top. */ -DUK_INTERNAL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length) { - duk_hbuffer_dynamic *h_buf; - duk_bitencoder_ctx be_ctx_alloc; - duk_bitencoder_ctx *be_ctx = &be_ctx_alloc; - duk_uint32_t *hdr; - duk_size_t new_size; - duk_uint_fast32_t num_header_entries; - duk_uint_fast32_t curr_offset; - duk_int_fast32_t curr_line, next_line, diff_line; - duk_uint_fast32_t curr_pc; - duk_uint_fast32_t hdr_index; - - DUK_ASSERT(length <= DUK_COMPILER_MAX_BYTECODE_LENGTH); - - num_header_entries = (length + DUK_PC2LINE_SKIP - 1) / DUK_PC2LINE_SKIP; - curr_offset = (duk_uint_fast32_t) (sizeof(duk_uint32_t) + num_header_entries * sizeof(duk_uint32_t) * 2); - - duk_push_dynamic_buffer(thr, (duk_size_t) curr_offset); - h_buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h_buf) && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)); - - hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf); - DUK_ASSERT(hdr != NULL); - hdr[0] = (duk_uint32_t) length; /* valid pc range is [0, length[ */ - - curr_pc = 0U; - while (curr_pc < length) { - new_size = (duk_size_t) (curr_offset + DUK_PC2LINE_MAX_DIFF_LENGTH); - duk_hbuffer_resize(thr, h_buf, new_size); - - hdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf); - DUK_ASSERT(hdr != NULL); - DUK_ASSERT(curr_pc < length); - hdr_index = 1 + (curr_pc / DUK_PC2LINE_SKIP) * 2; - curr_line = (duk_int_fast32_t) instrs[curr_pc].line; - hdr[hdr_index + 0] = (duk_uint32_t) curr_line; - hdr[hdr_index + 1] = (duk_uint32_t) curr_offset; - -#if 0 - DUK_DDD(DUK_DDDPRINT("hdr[%ld]: pc=%ld line=%ld offset=%ld", - (long) (curr_pc / DUK_PC2LINE_SKIP), - (long) curr_pc, - (long) hdr[hdr_index + 0], - (long) hdr[hdr_index + 1])); -#endif - - DUK_MEMZERO(be_ctx, sizeof(*be_ctx)); - be_ctx->data = ((duk_uint8_t *) hdr) + curr_offset; - be_ctx->length = (duk_size_t) DUK_PC2LINE_MAX_DIFF_LENGTH; - - for (;;) { - curr_pc++; - if ( ((curr_pc % DUK_PC2LINE_SKIP) == 0) || /* end of diff run */ - (curr_pc >= length) ) { /* end of bytecode */ - break; - } - DUK_ASSERT(curr_pc < length); - next_line = (duk_int32_t) instrs[curr_pc].line; - diff_line = next_line - curr_line; - -#if 0 - DUK_DDD(DUK_DDDPRINT("curr_line=%ld, next_line=%ld -> diff_line=%ld", - (long) curr_line, (long) next_line, (long) diff_line)); -#endif - - if (diff_line == 0) { - /* 0 */ - duk_be_encode(be_ctx, 0, 1); - } else if (diff_line >= 1 && diff_line <= 4) { - /* 1 0 <2 bits> */ - duk_be_encode(be_ctx, (duk_uint32_t) ((0x02 << 2) + (diff_line - 1)), 4); - } else if (diff_line >= -0x80 && diff_line <= 0x7f) { - /* 1 1 0 <8 bits> */ - DUK_ASSERT(diff_line + 0x80 >= 0 && diff_line + 0x80 <= 0xff); - duk_be_encode(be_ctx, (duk_uint32_t) ((0x06 << 8) + (diff_line + 0x80)), 11); - } else { - /* 1 1 1 <32 bits> - * Encode in two parts to avoid bitencode 24-bit limitation - */ - duk_be_encode(be_ctx, (duk_uint32_t) ((0x07 << 16) + ((next_line >> 16) & 0xffff)), 19); - duk_be_encode(be_ctx, (duk_uint32_t) (next_line & 0xffff), 16); - } - - curr_line = next_line; - } - - duk_be_finish(be_ctx); - DUK_ASSERT(!be_ctx->truncated); - - /* be_ctx->offset == length of encoded bitstream */ - curr_offset += (duk_uint_fast32_t) be_ctx->offset; - } - - /* compact */ - new_size = (duk_size_t) curr_offset; - duk_hbuffer_resize(thr, h_buf, new_size); - - (void) duk_to_fixed_buffer(thr, -1, NULL); - - DUK_DDD(DUK_DDDPRINT("final pc2line data: pc_limit=%ld, length=%ld, %lf bits/opcode --> %!ixT", - (long) length, (long) new_size, (double) new_size * 8.0 / (double) length, - (duk_tval *) duk_get_tval(thr, -1))); -} - -/* PC is unsigned. If caller does PC arithmetic and gets a negative result, - * it will map to a large PC which is out of bounds and causes a zero to be - * returned. - */ -DUK_LOCAL duk_uint_fast32_t duk__hobject_pc2line_query_raw(duk_hthread *thr, duk_hbuffer_fixed *buf, duk_uint_fast32_t pc) { - duk_bitdecoder_ctx bd_ctx_alloc; - duk_bitdecoder_ctx *bd_ctx = &bd_ctx_alloc; - duk_uint32_t *hdr; - duk_uint_fast32_t start_offset; - duk_uint_fast32_t pc_limit; - duk_uint_fast32_t hdr_index; - duk_uint_fast32_t pc_base; - duk_uint_fast32_t n; - duk_uint_fast32_t curr_line; - - DUK_ASSERT(buf != NULL); - DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) buf) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) buf)); - DUK_UNREF(thr); - - /* - * Use the index in the header to find the right starting point - */ - - hdr_index = pc / DUK_PC2LINE_SKIP; - pc_base = hdr_index * DUK_PC2LINE_SKIP; - n = pc - pc_base; - - if (DUK_HBUFFER_FIXED_GET_SIZE(buf) <= sizeof(duk_uint32_t)) { - DUK_DD(DUK_DDPRINT("pc2line lookup failed: buffer is smaller than minimal header")); - goto pc2line_error; - } - - hdr = (duk_uint32_t *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, buf); - pc_limit = hdr[0]; - if (pc >= pc_limit) { - /* Note: pc is unsigned and cannot be negative */ - DUK_DD(DUK_DDPRINT("pc2line lookup failed: pc out of bounds (pc=%ld, limit=%ld)", - (long) pc, (long) pc_limit)); - goto pc2line_error; - } - - curr_line = hdr[1 + hdr_index * 2]; - start_offset = hdr[1 + hdr_index * 2 + 1]; - if ((duk_size_t) start_offset > DUK_HBUFFER_FIXED_GET_SIZE(buf)) { - DUK_DD(DUK_DDPRINT("pc2line lookup failed: start_offset out of bounds (start_offset=%ld, buffer_size=%ld)", - (long) start_offset, (long) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) buf))); - goto pc2line_error; - } - - /* - * Iterate the bitstream (line diffs) until PC is reached - */ - - DUK_MEMZERO(bd_ctx, sizeof(*bd_ctx)); - bd_ctx->data = ((duk_uint8_t *) hdr) + start_offset; - bd_ctx->length = (duk_size_t) (DUK_HBUFFER_FIXED_GET_SIZE(buf) - start_offset); - -#if 0 - DUK_DDD(DUK_DDDPRINT("pc2line lookup: pc=%ld -> hdr_index=%ld, pc_base=%ld, n=%ld, start_offset=%ld", - (long) pc, (long) hdr_index, (long) pc_base, (long) n, (long) start_offset)); -#endif - - while (n > 0) { -#if 0 - DUK_DDD(DUK_DDDPRINT("lookup: n=%ld, curr_line=%ld", (long) n, (long) curr_line)); -#endif - - if (duk_bd_decode_flag(bd_ctx)) { - if (duk_bd_decode_flag(bd_ctx)) { - if (duk_bd_decode_flag(bd_ctx)) { - /* 1 1 1 <32 bits> */ - duk_uint_fast32_t t; - t = duk_bd_decode(bd_ctx, 16); /* workaround: max nbits = 24 now */ - t = (t << 16) + duk_bd_decode(bd_ctx, 16); - curr_line = t; - } else { - /* 1 1 0 <8 bits> */ - duk_uint_fast32_t t; - t = duk_bd_decode(bd_ctx, 8); - curr_line = curr_line + t - 0x80; - } - } else { - /* 1 0 <2 bits> */ - duk_uint_fast32_t t; - t = duk_bd_decode(bd_ctx, 2); - curr_line = curr_line + t + 1; - } - } else { - /* 0: no change */ - } - - n--; - } - - DUK_DDD(DUK_DDDPRINT("pc2line lookup result: pc %ld -> line %ld", (long) pc, (long) curr_line)); - return curr_line; - - pc2line_error: - DUK_D(DUK_DPRINT("pc2line conversion failed for pc=%ld", (long) pc)); - return 0; -} - -DUK_INTERNAL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc) { - duk_hbuffer_fixed *pc2line; - duk_uint_fast32_t line; - - /* XXX: now that pc2line is used by the debugger quite heavily in - * checked execution, this should be optimized to avoid value stack - * and perhaps also implement some form of pc2line caching (see - * future work in debugger.rst). - */ - - duk_get_prop_stridx(thr, idx_func, DUK_STRIDX_INT_PC2LINE); - pc2line = (duk_hbuffer_fixed *) duk_get_hbuffer(thr, -1); - if (pc2line != NULL) { - DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) pc2line) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) pc2line)); - line = duk__hobject_pc2line_query_raw(thr, pc2line, (duk_uint_fast32_t) pc); - } else { - line = 0; - } - duk_pop(thr); - - return line; -} - -#endif /* DUK_USE_PC2LINE */ -#line 1 "duk_hobject_props.c" -/* - * duk_hobject property access functionality. - * - * This is very central functionality for size, performance, and compliance. - * It is also rather intricate; see hobject-algorithms.rst for discussion on - * the algorithms and memory-management.rst for discussion on refcounts and - * side effect issues. - * - * Notes: - * - * - It might be tempting to assert "refcount nonzero" for objects - * being operated on, but that's not always correct: objects with - * a zero refcount may be operated on by the refcount implementation - * (finalization) for instance. Hence, no refcount assertions are made. - * - * - Many operations (memory allocation, identifier operations, etc) - * may cause arbitrary side effects (e.g. through GC and finalization). - * These side effects may invalidate duk_tval pointers which point to - * areas subject to reallocation (like value stack). Heap objects - * themselves have stable pointers. Holding heap object pointers or - * duk_tval copies is not problematic with respect to side effects; - * care must be taken when holding and using argument duk_tval pointers. - * - * - If a finalizer is executed, it may operate on the the same object - * we're currently dealing with. For instance, the finalizer might - * delete a certain property which has already been looked up and - * confirmed to exist. Ideally finalizers would be disabled if GC - * happens during property access. At the moment property table realloc - * disables finalizers, and all DECREFs may cause arbitrary changes so - * handle DECREF carefully. - * - * - The order of operations for a DECREF matters. When DECREF is executed, - * the entire object graph must be consistent; note that a refzero may - * lead to a mark-and-sweep through a refcount finalizer. Use NORZ macros - * and an explicit DUK_REFZERO_CHECK_xxx() if achieving correct order is hard. - */ - -/* - * XXX: array indices are mostly typed as duk_uint32_t here; duk_uarridx_t - * might be more appropriate. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Local defines - */ - -#define DUK__NO_ARRAY_INDEX DUK_HSTRING_NO_ARRAY_INDEX - -/* Marker values for hash part. */ -#define DUK__HASH_UNUSED DUK_HOBJECT_HASHIDX_UNUSED -#define DUK__HASH_DELETED DUK_HOBJECT_HASHIDX_DELETED - -/* Valstack space that suffices for all local calls, excluding any recursion - * into Ecmascript or Duktape/C calls (Proxy, getters, etc). - */ -#define DUK__VALSTACK_SPACE 10 - -/* Valstack space allocated especially for proxy lookup which does a - * recursive property lookup. - */ -#define DUK__VALSTACK_PROXY_LOOKUP 20 - -/* - * Local prototypes - */ - -DUK_LOCAL_DECL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc); -DUK_LOCAL_DECL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag); -DUK_LOCAL_DECL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc); - -DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len); -DUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj); - -DUK_LOCAL_DECL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags); -DUK_LOCAL_DECL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags); - -/* - * Misc helpers - */ - -/* Convert a duk_tval number (caller checks) to a 32-bit index. Returns - * DUK__NO_ARRAY_INDEX if the number is not whole or not a valid array - * index. - */ -/* XXX: for fastints, could use a variant which assumes a double duk_tval - * (and doesn't need to check for fastint again). - */ -DUK_LOCAL duk_uint32_t duk__tval_number_to_arr_idx(duk_tval *tv) { - duk_double_t dbl; - duk_uint32_t idx; - - DUK_ASSERT(tv != NULL); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - - /* -0 is accepted here as index 0 because ToString(-0) == "0" which is - * in canonical form and thus an array index. - */ - dbl = DUK_TVAL_GET_NUMBER(tv); - idx = (duk_uint32_t) dbl; - if ((duk_double_t) idx == dbl) { - /* Is whole and within 32 bit range. If the value happens to be 0xFFFFFFFF, - * it's not a valid array index but will then match DUK__NO_ARRAY_INDEX. - */ - return idx; - } - return DUK__NO_ARRAY_INDEX; -} - -#if defined(DUK_USE_FASTINT) -/* Convert a duk_tval fastint (caller checks) to a 32-bit index. */ -DUK_LOCAL duk_uint32_t duk__tval_fastint_to_arr_idx(duk_tval *tv) { - duk_int64_t t; - - DUK_ASSERT(tv != NULL); - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); - - t = DUK_TVAL_GET_FASTINT(tv); - if (((duk_uint64_t) t & ~DUK_U64_CONSTANT(0xffffffff)) != 0) { - /* Catches >0x100000000 and negative values. */ - return DUK__NO_ARRAY_INDEX; - } - - /* If the value happens to be 0xFFFFFFFF, it's not a valid array index - * but will then match DUK__NO_ARRAY_INDEX. - */ - return (duk_uint32_t) t; -} -#endif /* DUK_USE_FASTINT */ - -/* Convert a duk_tval on the value stack (in a trusted index we don't validate) - * to a string or symbol using ES2015 ToPropertyKey(): - * http://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey. - * - * Also check if it's a valid array index and return that (or DUK__NO_ARRAY_INDEX - * if not). - */ -DUK_LOCAL duk_uint32_t duk__to_property_key(duk_hthread *thr, duk_idx_t idx, duk_hstring **out_h) { - duk_uint32_t arr_idx; - duk_hstring *h; - duk_tval *tv_dst; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(out_h != NULL); - DUK_ASSERT(duk_is_valid_index(thr, idx)); - DUK_ASSERT(idx < 0); - - /* XXX: The revised ES2015 ToPropertyKey() handling (ES5.1 was just - * ToString()) involves a ToPrimitive(), a symbol check, and finally - * a ToString(). Figure out the best way to have a good fast path - * but still be compliant and share code. - */ - - tv_dst = DUK_GET_TVAL_NEGIDX(thr, idx); /* intentionally unvalidated */ - if (DUK_TVAL_IS_STRING(tv_dst)) { - /* Most important path: strings and plain symbols are used as - * is. For symbols the array index check below is unnecessary - * (they're never valid array indices) but checking that the - * string is a symbol would make the plain string path slower - * unnecessarily. - */ - h = DUK_TVAL_GET_STRING(tv_dst); - } else { - h = duk_to_property_key_hstring(thr, idx); - } - DUK_ASSERT(h != NULL); - *out_h = h; - - arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(h); - return arr_idx; -} - -DUK_LOCAL duk_uint32_t duk__push_tval_to_property_key(duk_hthread *thr, duk_tval *tv_key, duk_hstring **out_h) { - duk_push_tval(thr, tv_key); /* XXX: could use an unsafe push here */ - return duk__to_property_key(thr, -1, out_h); -} - -/* String is an own (virtual) property of a plain buffer. */ -DUK_LOCAL duk_bool_t duk__key_is_plain_buf_ownprop(duk_hthread *thr, duk_hbuffer *buf, duk_hstring *key, duk_uint32_t arr_idx) { - DUK_UNREF(thr); - - /* Virtual index properties. Checking explicitly for - * 'arr_idx != DUK__NO_ARRAY_INDEX' is not necessary - * because DUK__NO_ARRAY_INDEXi is always larger than - * maximum allowed buffer size. - */ - DUK_ASSERT(DUK__NO_ARRAY_INDEX >= DUK_HBUFFER_GET_SIZE(buf)); - if (arr_idx < DUK_HBUFFER_GET_SIZE(buf)) { - return 1; - } - - /* Other virtual properties. */ - return (key == DUK_HTHREAD_STRING_LENGTH(thr)); -} - -/* - * Helpers for managing property storage size - */ - -/* Get default hash part size for a certain entry part size. */ -#if defined(DUK_USE_HOBJECT_HASH_PART) -DUK_LOCAL duk_uint32_t duk__get_default_h_size(duk_uint32_t e_size) { - DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES); - - if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) { - duk_uint32_t res; - duk_uint32_t tmp; - - /* Hash size should be 2^N where N is chosen so that 2^N is - * larger than e_size. Extra shifting is used to ensure hash - * is relatively sparse. - */ - tmp = e_size; - res = 2; /* Result will be 2 ** (N + 1). */ - while (tmp >= 0x40) { - tmp >>= 6; - res <<= 6; - } - while (tmp != 0) { - tmp >>= 1; - res <<= 1; - } - DUK_ASSERT((DUK_HOBJECT_MAX_PROPERTIES << 2U) > DUK_HOBJECT_MAX_PROPERTIES); /* Won't wrap, even shifted by 2. */ - DUK_ASSERT(res > e_size); - return res; - } else { - return 0; - } -} -#endif /* USE_PROP_HASH_PART */ - -/* Get minimum entry part growth for a certain size. */ -DUK_LOCAL duk_uint32_t duk__get_min_grow_e(duk_uint32_t e_size) { - duk_uint32_t res; - - DUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES); - - res = (e_size + DUK_USE_HOBJECT_ENTRY_MINGROW_ADD) / DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR; - DUK_ASSERT(res >= 1); /* important for callers */ - return res; -} - -/* Get minimum array part growth for a certain size. */ -DUK_LOCAL duk_uint32_t duk__get_min_grow_a(duk_uint32_t a_size) { - duk_uint32_t res; - - DUK_ASSERT((duk_size_t) a_size <= DUK_HOBJECT_MAX_PROPERTIES); - - res = (a_size + DUK_USE_HOBJECT_ARRAY_MINGROW_ADD) / DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR; - DUK_ASSERT(res >= 1); /* important for callers */ - return res; -} - -/* Count actually used entry part entries (non-NULL keys). */ -DUK_LOCAL duk_uint32_t duk__count_used_e_keys(duk_hthread *thr, duk_hobject *obj) { - duk_uint_fast32_t i; - duk_uint_fast32_t n = 0; - duk_hstring **e; - - DUK_ASSERT(obj != NULL); - DUK_UNREF(thr); - - e = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, obj); - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - if (*e++) { - n++; - } - } - return (duk_uint32_t) n; -} - -/* Count actually used array part entries and array minimum size. - * NOTE: 'out_min_size' can be computed much faster by starting from the - * end and breaking out early when finding first used entry, but this is - * not needed now. - */ -DUK_LOCAL void duk__compute_a_stats(duk_hthread *thr, duk_hobject *obj, duk_uint32_t *out_used, duk_uint32_t *out_min_size) { - duk_uint_fast32_t i; - duk_uint_fast32_t used = 0; - duk_uint_fast32_t highest_idx = (duk_uint_fast32_t) -1; /* see below */ - duk_tval *a; - - DUK_ASSERT(obj != NULL); - DUK_ASSERT(out_used != NULL); - DUK_ASSERT(out_min_size != NULL); - DUK_UNREF(thr); - - a = DUK_HOBJECT_A_GET_BASE(thr->heap, obj); - for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { - duk_tval *tv = a++; - if (!DUK_TVAL_IS_UNUSED(tv)) { - used++; - highest_idx = i; - } - } - - /* Initial value for highest_idx is -1 coerced to unsigned. This - * is a bit odd, but (highest_idx + 1) will then wrap to 0 below - * for out_min_size as intended. - */ - - *out_used = (duk_uint32_t) used; - *out_min_size = (duk_uint32_t) (highest_idx + 1); /* 0 if no used entries */ -} - -/* Check array density and indicate whether or not the array part should be abandoned. */ -DUK_LOCAL duk_bool_t duk__abandon_array_density_check(duk_uint32_t a_used, duk_uint32_t a_size) { - /* - * Array abandon check; abandon if: - * - * new_used / new_size < limit - * new_used < limit * new_size || limit is 3 bits fixed point - * new_used < limit' / 8 * new_size || *8 - * 8*new_used < limit' * new_size || :8 - * new_used < limit' * (new_size / 8) - * - * Here, new_used = a_used, new_size = a_size. - * - * Note: some callers use approximate values for a_used and/or a_size - * (e.g. dropping a '+1' term). This doesn't affect the usefulness - * of the check, but may confuse debugging. - */ - - return (a_used < DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT * (a_size >> 3)); -} - -/* Fast check for extending array: check whether or not a slow density check is required. */ -DUK_LOCAL duk_bool_t duk__abandon_array_slow_check_required(duk_uint32_t arr_idx, duk_uint32_t old_size) { - /* - * In a fast check we assume old_size equals old_used (i.e., existing - * array is fully dense). - * - * Slow check if: - * - * (new_size - old_size) / old_size > limit - * new_size - old_size > limit * old_size - * new_size > (1 + limit) * old_size || limit' is 3 bits fixed point - * new_size > (1 + (limit' / 8)) * old_size || * 8 - * 8 * new_size > (8 + limit') * old_size || : 8 - * new_size > (8 + limit') * (old_size / 8) - * new_size > limit'' * (old_size / 8) || limit'' = 9 -> max 25% increase - * arr_idx + 1 > limit'' * (old_size / 8) - * - * This check doesn't work well for small values, so old_size is rounded - * up for the check (and the '+ 1' of arr_idx can be ignored in practice): - * - * arr_idx > limit'' * ((old_size + 7) / 8) - */ - - return (arr_idx > DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT * ((old_size + 7) >> 3)); -} - -/* - * Proxy helpers - */ - -#if defined(DUK_USE_ES6_PROXY) -DUK_INTERNAL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler) { - duk_hproxy *h_proxy; - - DUK_ASSERT(obj != NULL); - DUK_ASSERT(out_target != NULL); - DUK_ASSERT(out_handler != NULL); - - /* Caller doesn't need to check exotic proxy behavior (but does so for - * some fast paths). - */ - if (DUK_LIKELY(!DUK_HOBJECT_IS_PROXY(obj))) { - return 0; - } - h_proxy = (duk_hproxy *) obj; - DUK_ASSERT_HPROXY_VALID(h_proxy); - - DUK_ASSERT(h_proxy->handler != NULL); - DUK_ASSERT(h_proxy->target != NULL); - *out_handler = h_proxy->handler; - *out_target = h_proxy->target; - - return 1; -} -#endif /* DUK_USE_ES6_PROXY */ - -/* Get Proxy target object. If the argument is not a Proxy, return it as is. - * If a Proxy is revoked, an error is thrown. - */ -#if defined(DUK_USE_ES6_PROXY) -DUK_INTERNAL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj) { - DUK_ASSERT(obj != NULL); - - /* Resolve Proxy targets until Proxy chain ends. No explicit check for - * a Proxy loop: user code cannot create such a loop (it would only be - * possible by editing duk_hproxy references directly). - */ - - while (DUK_HOBJECT_IS_PROXY(obj)) { - duk_hproxy *h_proxy; - - h_proxy = (duk_hproxy *) obj; - DUK_ASSERT_HPROXY_VALID(h_proxy); - obj = h_proxy->target; - DUK_ASSERT(obj != NULL); - } - - DUK_ASSERT(obj != NULL); - return obj; -} -#endif /* DUK_USE_ES6_PROXY */ - -#if defined(DUK_USE_ES6_PROXY) -DUK_LOCAL duk_bool_t duk__proxy_check_prop(duk_hthread *thr, duk_hobject *obj, duk_small_uint_t stridx_trap, duk_tval *tv_key, duk_hobject **out_target) { - duk_hobject *h_handler; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(tv_key != NULL); - DUK_ASSERT(out_target != NULL); - - if (!duk_hobject_proxy_check(obj, out_target, &h_handler)) { - return 0; - } - DUK_ASSERT(*out_target != NULL); - DUK_ASSERT(h_handler != NULL); - - /* XXX: At the moment Duktape accesses internal keys like _Finalizer using a - * normal property set/get which would allow a proxy handler to interfere with - * such behavior and to get access to internal key strings. This is not a problem - * as such because internal key strings can be created in other ways too (e.g. - * through buffers). The best fix is to change Duktape internal lookups to - * skip proxy behavior. Until that, internal property accesses bypass the - * proxy and are applied to the target (as if the handler did not exist). - * This has some side effects, see test-bi-proxy-internal-keys.js. - */ - - if (DUK_TVAL_IS_STRING(tv_key)) { - duk_hstring *h_key = (duk_hstring *) DUK_TVAL_GET_STRING(tv_key); - DUK_ASSERT(h_key != NULL); - if (DUK_HSTRING_HAS_HIDDEN(h_key)) { - /* Symbol accesses must go through proxy lookup in ES2015. - * Hidden symbols behave like Duktape 1.x internal keys - * and currently won't. - */ - DUK_DDD(DUK_DDDPRINT("hidden key, skip proxy handler and apply to target")); - return 0; - } - } - - /* The handler is looked up with a normal property lookup; it may be an - * accessor or the handler object itself may be a proxy object. If the - * handler is a proxy, we need to extend the valstack as we make a - * recursive proxy check without a function call in between (in fact - * there is no limit to the potential recursion here). - * - * (For sanity, proxy creation rejects another proxy object as either - * the handler or the target at the moment so recursive proxy cases - * are not realized now.) - */ - - /* XXX: C recursion limit if proxies are allowed as handler/target values */ - - duk_require_stack(thr, DUK__VALSTACK_PROXY_LOOKUP); - duk_push_hobject(thr, h_handler); - if (duk_get_prop_stridx_short(thr, -1, stridx_trap)) { - /* -> [ ... handler trap ] */ - duk_insert(thr, -2); /* -> [ ... trap handler ] */ - - /* stack prepped for func call: [ ... trap handler ] */ - return 1; - } else { - duk_pop_2_unsafe(thr); - return 0; - } -} -#endif /* DUK_USE_ES6_PROXY */ - -/* - * Reallocate property allocation, moving properties to the new allocation. - * - * Includes key compaction, rehashing, and can also optionally abandon - * the array part, 'migrating' array entries into the beginning of the - * new entry part. - * - * There is no support for in-place reallocation or just compacting keys - * without resizing the property allocation. This is intentional to keep - * code size minimal, but would be useful future work. - * - * The implementation is relatively straightforward, except for the array - * abandonment process. Array abandonment requires that new string keys - * are interned, which may trigger GC. All keys interned so far must be - * reachable for GC at all times and correctly refcounted for; valstack is - * used for that now. - * - * Also, a GC triggered during this reallocation process must not interfere - * with the object being resized. This is currently controlled by preventing - * finalizers (as they may affect ANY object) and object compaction in - * mark-and-sweep. It would suffice to protect only this particular object - * from compaction, however. DECREF refzero cascades are side effect free - * and OK. - * - * Note: because we need to potentially resize the valstack (as part - * of abandoning the array part), any tval pointers to the valstack - * will become invalid after this call. - */ - -DUK_INTERNAL void duk_hobject_realloc_props(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_e_size, - duk_uint32_t new_a_size, - duk_uint32_t new_h_size, - duk_bool_t abandon_array) { - duk_small_uint_t prev_ms_base_flags; - duk_uint32_t new_alloc_size; - duk_uint32_t new_e_size_adjusted; - duk_uint8_t *new_p; - duk_hstring **new_e_k; - duk_propvalue *new_e_pv; - duk_uint8_t *new_e_f; - duk_tval *new_a; - duk_uint32_t *new_h; - duk_uint32_t new_e_next; - duk_uint_fast32_t i; - duk_size_t array_copy_size; -#if defined(DUK_USE_ASSERTIONS) - duk_bool_t prev_error_not_allowed; -#endif - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(!abandon_array || new_a_size == 0); /* if abandon_array, new_a_size must be 0 */ - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL || (DUK_HOBJECT_GET_ESIZE(obj) == 0 && DUK_HOBJECT_GET_ASIZE(obj) == 0)); - DUK_ASSERT(new_h_size == 0 || new_h_size >= new_e_size); /* required to guarantee success of rehashing, - * intentionally use unadjusted new_e_size - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_STATS_INC(thr->heap, stats_object_realloc_props); - - /* - * Pre resize assertions. - */ - -#if defined(DUK_USE_ASSERTIONS) - /* XXX: pre-checks (such as no duplicate keys) */ -#endif - - /* - * For property layout 1, tweak e_size to ensure that the whole entry - * part (key + val + flags) is a suitable multiple for alignment - * (platform specific). - * - * Property layout 2 does not require this tweaking and is preferred - * on low RAM platforms requiring alignment. - */ - -#if defined(DUK_USE_HOBJECT_LAYOUT_2) || defined(DUK_USE_HOBJECT_LAYOUT_3) - DUK_DDD(DUK_DDDPRINT("using layout 2 or 3, no need to pad e_size: %ld", (long) new_e_size)); - new_e_size_adjusted = new_e_size; -#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && (DUK_HOBJECT_ALIGN_TARGET == 1) - DUK_DDD(DUK_DDDPRINT("using layout 1, but no need to pad e_size: %ld", (long) new_e_size)); - new_e_size_adjusted = new_e_size; -#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && ((DUK_HOBJECT_ALIGN_TARGET == 4) || (DUK_HOBJECT_ALIGN_TARGET == 8)) - new_e_size_adjusted = (new_e_size + (duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U) & - (~((duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U)); - DUK_DDD(DUK_DDDPRINT("using layout 1, and alignment target is %ld, adjusted e_size: %ld -> %ld", - (long) DUK_HOBJECT_ALIGN_TARGET, (long) new_e_size, (long) new_e_size_adjusted)); - DUK_ASSERT(new_e_size_adjusted >= new_e_size); -#else -#error invalid hobject layout defines -#endif - - /* - * Debug logging after adjustment. - */ - - DUK_DDD(DUK_DDDPRINT("attempt to resize hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to " - "{e_size=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld", - (void *) obj, - (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), - DUK_HOBJECT_GET_ASIZE(obj), - DUK_HOBJECT_GET_HSIZE(obj)), - (long) DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size), - (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj), - (long) DUK_HOBJECT_GET_ESIZE(obj), - (long) DUK_HOBJECT_GET_ENEXT(obj), - (long) DUK_HOBJECT_GET_ASIZE(obj), - (long) DUK_HOBJECT_GET_HSIZE(obj), - (long) new_e_size_adjusted, - (long) new_a_size, - (long) new_h_size, - (long) abandon_array, - (long) new_e_size)); - - /* - * Property count check. This is the only point where we ensure that - * we don't get more (allocated) property space that we can handle. - * There aren't hard limits as such, but some algorithms may fail - * if we get too close to the 4G property limit. - * - * Since this works based on allocation size (not actually used size), - * the limit is a bit approximate but good enough in practice. - */ - - if (new_e_size_adjusted + new_a_size > DUK_HOBJECT_MAX_PROPERTIES) { - DUK_ERROR_ALLOC_FAILED(thr); - } - - /* - * Compute new alloc size and alloc new area. - * - * The new area is not tracked in the heap at all, so it's critical - * we get to free/keep it in a controlled manner. - */ - -#if defined(DUK_USE_ASSERTIONS) - /* Whole path must be error throw free, but we may be called from - * within error handling so can't assert for error_not_allowed == 0. - */ - prev_error_not_allowed = thr->heap->error_not_allowed; - thr->heap->error_not_allowed = 1; -#endif - prev_ms_base_flags = thr->heap->ms_base_flags; - thr->heap->ms_base_flags |= - DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* Avoid attempt to compact the current object (all objects really). */ - thr->heap->pf_prevent_count++; /* Avoid finalizers. */ - DUK_ASSERT(thr->heap->pf_prevent_count != 0); /* Wrap. */ - - new_alloc_size = DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size); - DUK_DDD(DUK_DDDPRINT("new hobject allocation size is %ld", (long) new_alloc_size)); - if (new_alloc_size == 0) { - DUK_ASSERT(new_e_size_adjusted == 0); - DUK_ASSERT(new_a_size == 0); - DUK_ASSERT(new_h_size == 0); - new_p = NULL; - } else { - /* Alloc may trigger mark-and-sweep but no compaction, and - * cannot throw. - */ -#if 0 /* XXX: inject test */ - if (1) { - new_p = NULL; - goto alloc_failed; - } -#endif - new_p = (duk_uint8_t *) DUK_ALLOC(thr->heap, new_alloc_size); - if (new_p == NULL) { - /* NULL always indicates alloc failure because - * new_alloc_size > 0. - */ - goto alloc_failed; - } - } - - /* Set up pointers to the new property area: this is hidden behind a macro - * because it is memory layout specific. - */ - DUK_HOBJECT_P_SET_REALLOC_PTRS(new_p, new_e_k, new_e_pv, new_e_f, new_a, new_h, - new_e_size_adjusted, new_a_size, new_h_size); - DUK_UNREF(new_h); /* happens when hash part dropped */ - new_e_next = 0; - - /* if new_p == NULL, all of these pointers are NULL */ - DUK_ASSERT((new_p != NULL) || - (new_e_k == NULL && new_e_pv == NULL && new_e_f == NULL && - new_a == NULL && new_h == NULL)); - - DUK_DDD(DUK_DDDPRINT("new alloc size %ld, new_e_k=%p, new_e_pv=%p, new_e_f=%p, new_a=%p, new_h=%p", - (long) new_alloc_size, (void *) new_e_k, (void *) new_e_pv, (void *) new_e_f, - (void *) new_a, (void *) new_h)); - - /* - * Migrate array part to start of entries if requested. - * - * Note: from an enumeration perspective the order of entry keys matters. - * Array keys should appear wherever they appeared before the array abandon - * operation. (This no longer matters much because keys are ES2015 sorted.) - */ - - if (abandon_array) { - /* Assuming new_a_size == 0, and that entry part contains - * no conflicting keys, refcounts do not need to be adjusted for - * the values, as they remain exactly the same. - * - * The keys, however, need to be interned, incref'd, and be - * reachable for GC. Any intern attempt may trigger a GC and - * claim any non-reachable strings, so every key must be reachable - * at all times. Refcounts must be correct to satisfy refcount - * assertions. - * - * A longjmp must not occur here, as the new_p allocation would - * leak. Refcounts would come out correctly as the interned - * strings are valstack tracked. - */ - DUK_ASSERT(new_a_size == 0); - - DUK_STATS_INC(thr->heap, stats_object_abandon_array); - - for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { - duk_tval *tv1; - duk_tval *tv2; - duk_hstring *key; - - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); - - tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); - if (DUK_TVAL_IS_UNUSED(tv1)) { - continue; - } - - DUK_ASSERT(new_p != NULL && new_e_k != NULL && - new_e_pv != NULL && new_e_f != NULL); - - /* - * Intern key via the valstack to ensure reachability behaves - * properly. We must avoid longjmp's here so use non-checked - * primitives. - * - * Note: duk_check_stack() potentially reallocs the valstack, - * invalidating any duk_tval pointers to valstack. Callers - * must be careful. - */ - -#if 0 /* XXX: inject test */ - if (1) { - goto abandon_error; - } -#endif - /* Never shrinks; auto-adds DUK_VALSTACK_INTERNAL_EXTRA, which - * is generous. - */ - if (!duk_check_stack(thr, 1)) { - goto abandon_error; - } - DUK_ASSERT_VALSTACK_SPACE(thr, 1); - key = duk_heap_strtable_intern_u32(thr->heap, (duk_uint32_t) i); - if (key == NULL) { - goto abandon_error; - } - duk_push_hstring(thr, key); /* keep key reachable for GC etc; guaranteed not to fail */ - - /* Key is now reachable in the valstack, don't INCREF - * the new allocation yet (we'll steal the refcounts - * from the value stack once all keys are done). - */ - - new_e_k[new_e_next] = key; - tv2 = &new_e_pv[new_e_next].v; /* array entries are all plain values */ - DUK_TVAL_SET_TVAL(tv2, tv1); - new_e_f[new_e_next] = DUK_PROPDESC_FLAG_WRITABLE | - DUK_PROPDESC_FLAG_ENUMERABLE | - DUK_PROPDESC_FLAG_CONFIGURABLE; - new_e_next++; - - /* Note: new_e_next matches pushed temp key count, and nothing can - * fail above between the push and this point. - */ - } - - /* Steal refcounts from value stack. */ - DUK_DDD(DUK_DDDPRINT("abandon array: pop %ld key temps from valstack", (long) new_e_next)); - duk_pop_n_nodecref_unsafe(thr, (duk_idx_t) new_e_next); - } - - /* - * Copy keys and values in the entry part (compacting them at the same time). - */ - - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - duk_hstring *key; - - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); - - key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); - if (key == NULL) { - continue; - } - - DUK_ASSERT(new_p != NULL && new_e_k != NULL && - new_e_pv != NULL && new_e_f != NULL); - - new_e_k[new_e_next] = key; - new_e_pv[new_e_next] = DUK_HOBJECT_E_GET_VALUE(thr->heap, obj, i); - new_e_f[new_e_next] = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i); - new_e_next++; - } - /* the entries [new_e_next, new_e_size_adjusted[ are left uninitialized on purpose (ok, not gc reachable) */ - - /* - * Copy array elements to new array part. If the new array part is - * larger, initialize the unused entries as UNUSED because they are - * GC reachable. - */ - -#if defined(DUK_USE_ASSERTIONS) - /* Caller must have decref'd values above new_a_size (if that is necessary). */ - if (!abandon_array) { - for (i = new_a_size; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { - duk_tval *tv; - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); - DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv)); - } - } -#endif - if (new_a_size > DUK_HOBJECT_GET_ASIZE(obj)) { - array_copy_size = sizeof(duk_tval) * DUK_HOBJECT_GET_ASIZE(obj); - } else { - array_copy_size = sizeof(duk_tval) * new_a_size; - } - if (array_copy_size > 0) { - /* Avoid zero copy with an invalid pointer. If obj->p is NULL, - * the 'new_a' pointer will be invalid which is not allowed even - * when copy size is zero. - */ - DUK_ASSERT(new_a != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) > 0); - DUK_MEMCPY((void *) new_a, - (const void *) DUK_HOBJECT_A_GET_BASE(thr->heap, obj), - array_copy_size); - } - for (i = DUK_HOBJECT_GET_ASIZE(obj); i < new_a_size; i++) { - duk_tval *tv = &new_a[i]; - DUK_TVAL_SET_UNUSED(tv); - } - - /* - * Rebuild the hash part always from scratch (guaranteed to finish - * as long as caller gave consistent parameters). - * - * Any resize of hash part requires rehashing. In addition, by rehashing - * get rid of any elements marked deleted (DUK__HASH_DELETED) which is critical - * to ensuring the hash part never fills up. - */ - -#if defined(DUK_USE_HOBJECT_HASH_PART) - if (new_h_size == 0) { - DUK_DDD(DUK_DDDPRINT("no hash part, no rehash")); - } else { - duk_uint32_t mask; - - DUK_ASSERT(new_h != NULL); - - /* fill new_h with u32 0xff = UNUSED */ - DUK_ASSERT(new_h_size > 0); - DUK_MEMSET(new_h, 0xff, sizeof(duk_uint32_t) * new_h_size); - - DUK_ASSERT(new_e_next <= new_h_size); /* equality not actually possible */ - - mask = new_h_size - 1; - for (i = 0; i < new_e_next; i++) { - duk_hstring *key = new_e_k[i]; - duk_uint32_t j, step; - - DUK_ASSERT(key != NULL); - j = DUK_HSTRING_GET_HASH(key) & mask; - step = 1; /* Cache friendly but clustering prone. */ - - for (;;) { - DUK_ASSERT(new_h[j] != DUK__HASH_DELETED); /* should never happen */ - if (new_h[j] == DUK__HASH_UNUSED) { - DUK_DDD(DUK_DDDPRINT("rebuild hit %ld -> %ld", (long) j, (long) i)); - new_h[j] = (duk_uint32_t) i; - break; - } - DUK_DDD(DUK_DDDPRINT("rebuild miss %ld, step %ld", (long) j, (long) step)); - j = (j + step) & mask; - - /* Guaranteed to finish (hash is larger than #props). */ - } - } - } -#endif /* DUK_USE_HOBJECT_HASH_PART */ - - /* - * Nice debug log. - */ - - DUK_DD(DUK_DDPRINT("resized hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to " - "{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld", - (void *) obj, - (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj), - DUK_HOBJECT_GET_ASIZE(obj), - DUK_HOBJECT_GET_HSIZE(obj)), - (long) new_alloc_size, - (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj), - (long) DUK_HOBJECT_GET_ESIZE(obj), - (long) DUK_HOBJECT_GET_ENEXT(obj), - (long) DUK_HOBJECT_GET_ASIZE(obj), - (long) DUK_HOBJECT_GET_HSIZE(obj), - (void *) new_p, - (long) new_e_size_adjusted, - (long) new_e_next, - (long) new_a_size, - (long) new_h_size, - (long) abandon_array, - (long) new_e_size)); - - /* - * All done, switch properties ('p') allocation to new one. - */ - - DUK_FREE_CHECKED(thr, DUK_HOBJECT_GET_PROPS(thr->heap, obj)); /* NULL obj->p is OK */ - DUK_HOBJECT_SET_PROPS(thr->heap, obj, new_p); - DUK_HOBJECT_SET_ESIZE(obj, new_e_size_adjusted); - DUK_HOBJECT_SET_ENEXT(obj, new_e_next); - DUK_HOBJECT_SET_ASIZE(obj, new_a_size); - DUK_HOBJECT_SET_HSIZE(obj, new_h_size); - - /* Clear array part flag only after switching. */ - if (abandon_array) { - DUK_HOBJECT_CLEAR_ARRAY_PART(obj); - } - - DUK_DDD(DUK_DDDPRINT("resize result: %!O", (duk_heaphdr *) obj)); - - DUK_ASSERT(thr->heap->pf_prevent_count > 0); - thr->heap->pf_prevent_count--; - thr->heap->ms_base_flags = prev_ms_base_flags; -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(thr->heap->error_not_allowed == 1); - thr->heap->error_not_allowed = prev_error_not_allowed; -#endif - - /* - * Post resize assertions. - */ - -#if defined(DUK_USE_ASSERTIONS) - /* XXX: post-checks (such as no duplicate keys) */ -#endif - return; - - /* - * Abandon array failed. We don't need to DECREF anything - * because the references in the new allocation are not - * INCREF'd until abandon is complete. The string interned - * keys are on the value stack and are handled normally by - * unwind. - */ - - abandon_error: - alloc_failed: - DUK_D(DUK_DPRINT("object property table resize failed")); - - DUK_FREE_CHECKED(thr, new_p); /* OK for NULL. */ - - thr->heap->pf_prevent_count--; - thr->heap->ms_base_flags = prev_ms_base_flags; -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(thr->heap->error_not_allowed == 1); - thr->heap->error_not_allowed = prev_error_not_allowed; -#endif - - DUK_ERROR_ALLOC_FAILED(thr); -} - -/* - * Helpers to resize properties allocation on specific needs. - */ - -DUK_INTERNAL void duk_hobject_resize_entrypart(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_e_size) { - duk_uint32_t old_e_size; - duk_uint32_t new_a_size; - duk_uint32_t new_h_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - - old_e_size = DUK_HOBJECT_GET_ESIZE(obj); - if (old_e_size > new_e_size) { - new_e_size = old_e_size; - } -#if defined(DUK_USE_HOBJECT_HASH_PART) - new_h_size = duk__get_default_h_size(new_e_size); -#else - new_h_size = 0; -#endif - new_a_size = DUK_HOBJECT_GET_ASIZE(obj); - - duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); -} - -#if 0 /*unused */ -DUK_INTERNAL void duk_hobject_resize_arraypart(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t new_a_size) { - duk_uint32_t old_a_size; - duk_uint32_t new_e_size; - duk_uint32_t new_h_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - - if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - return; - } - old_a_size = DUK_HOBJECT_GET_ASIZE(obj); - if (old_a_size > new_a_size) { - new_a_size = old_a_size; - } - new_e_size = DUK_HOBJECT_GET_ESIZE(obj); - new_h_size = DUK_HOBJECT_GET_HSIZE(obj); - - duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); -} -#endif - -/* Grow entry part allocation for one additional entry. */ -DUK_LOCAL void duk__grow_props_for_new_entry_item(duk_hthread *thr, duk_hobject *obj) { - duk_uint32_t old_e_used; /* actually used, non-NULL entries */ - duk_uint32_t new_e_size; - duk_uint32_t new_a_size; - duk_uint32_t new_h_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - - /* Duktape 0.11.0 and prior tried to optimize the resize by not - * counting the number of actually used keys prior to the resize. - * This worked mostly well but also caused weird leak-like behavior - * as in: test-bug-object-prop-alloc-unbounded.js. So, now we count - * the keys explicitly to compute the new entry part size. - */ - - old_e_used = duk__count_used_e_keys(thr, obj); - new_e_size = old_e_used + duk__get_min_grow_e(old_e_used); -#if defined(DUK_USE_HOBJECT_HASH_PART) - new_h_size = duk__get_default_h_size(new_e_size); -#else - new_h_size = 0; -#endif - new_a_size = DUK_HOBJECT_GET_ASIZE(obj); - DUK_ASSERT(new_e_size >= old_e_used + 1); /* duk__get_min_grow_e() is always >= 1 */ - - duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); -} - -/* Grow array part for a new highest array index. */ -DUK_LOCAL void duk__grow_props_for_array_item(duk_hthread *thr, duk_hobject *obj, duk_uint32_t highest_arr_idx) { - duk_uint32_t new_e_size; - duk_uint32_t new_a_size; - duk_uint32_t new_h_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(highest_arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)); - - /* minimum new length is highest_arr_idx + 1 */ - - new_e_size = DUK_HOBJECT_GET_ESIZE(obj); - new_h_size = DUK_HOBJECT_GET_HSIZE(obj); - new_a_size = highest_arr_idx + duk__get_min_grow_a(highest_arr_idx); - DUK_ASSERT(new_a_size >= highest_arr_idx + 1); /* duk__get_min_grow_a() is always >= 1 */ - - duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0); -} - -/* Abandon array part, moving array entries into entries part. - * This requires a props resize, which is a heavy operation. - * We also compact the entries part while we're at it, although - * this is not strictly required. - */ -DUK_LOCAL void duk__abandon_array_checked(duk_hthread *thr, duk_hobject *obj) { - duk_uint32_t new_e_size; - duk_uint32_t new_a_size; - duk_uint32_t new_h_size; - duk_uint32_t e_used; /* actually used, non-NULL keys */ - duk_uint32_t a_used; - duk_uint32_t a_size; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - - e_used = duk__count_used_e_keys(thr, obj); - duk__compute_a_stats(thr, obj, &a_used, &a_size); - - /* - * Must guarantee all actually used array entries will fit into - * new entry part. Add one growth step to ensure we don't run out - * of space right away. - */ - - new_e_size = e_used + a_used; - new_e_size = new_e_size + duk__get_min_grow_e(new_e_size); - new_a_size = 0; -#if defined(DUK_USE_HOBJECT_HASH_PART) - new_h_size = duk__get_default_h_size(new_e_size); -#else - new_h_size = 0; -#endif - - DUK_DD(DUK_DDPRINT("abandon array part for hobject %p, " - "array stats before: e_used=%ld, a_used=%ld, a_size=%ld; " - "resize to e_size=%ld, a_size=%ld, h_size=%ld", - (void *) obj, (long) e_used, (long) a_used, (long) a_size, - (long) new_e_size, (long) new_a_size, (long) new_h_size)); - - duk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 1); -} - -/* - * Compact an object. Minimizes allocation size for objects which are - * not likely to be extended. This is useful for internal and non- - * extensible objects, but can also be called for non-extensible objects. - * May abandon the array part if it is computed to be too sparse. - * - * This call is relatively expensive, as it needs to scan both the - * entries and the array part. - * - * The call may fail due to allocation error. - */ - -DUK_INTERNAL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj) { - duk_uint32_t e_size; /* currently used -> new size */ - duk_uint32_t a_size; /* currently required */ - duk_uint32_t a_used; /* actually used */ - duk_uint32_t h_size; - duk_bool_t abandon_array; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - -#if defined(DUK_USE_ROM_OBJECTS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_DD(DUK_DDPRINT("ignore attempt to compact a rom object")); - return; - } -#endif - - e_size = duk__count_used_e_keys(thr, obj); - duk__compute_a_stats(thr, obj, &a_used, &a_size); - - DUK_DD(DUK_DDPRINT("compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, " - "resized array density would be: %ld/%ld = %lf", - (long) e_size, (long) a_used, (long) a_size, - (long) a_used, (long) a_size, - (double) a_used / (double) a_size)); - - if (duk__abandon_array_density_check(a_used, a_size)) { - DUK_DD(DUK_DDPRINT("decided to abandon array during compaction, a_used=%ld, a_size=%ld", - (long) a_used, (long) a_size)); - abandon_array = 1; - e_size += a_used; - a_size = 0; - } else { - DUK_DD(DUK_DDPRINT("decided to keep array during compaction")); - abandon_array = 0; - } - -#if defined(DUK_USE_HOBJECT_HASH_PART) - if (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) { - h_size = duk__get_default_h_size(e_size); - } else { - h_size = 0; - } -#else - h_size = 0; -#endif - - DUK_DD(DUK_DDPRINT("compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld", - (long) e_size, (long) a_size, (long) h_size, (long) abandon_array)); - - duk_hobject_realloc_props(thr, obj, e_size, a_size, h_size, abandon_array); -} - -/* - * Find an existing key from entry part either by linear scan or by - * using the hash index (if it exists). - * - * Sets entry index (and possibly the hash index) to output variables, - * which allows the caller to update the entry and hash entries in-place. - * If entry is not found, both values are set to -1. If entry is found - * but there is no hash part, h_idx is set to -1. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx) { - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(e_idx != NULL); - DUK_ASSERT(h_idx != NULL); - DUK_UNREF(heap); - - if (DUK_LIKELY(DUK_HOBJECT_GET_HSIZE(obj) == 0)) - { - /* Linear scan: more likely because most objects are small. - * This is an important fast path. - * - * XXX: this might be worth inlining for property lookups. - */ - duk_uint_fast32_t i; - duk_uint_fast32_t n; - duk_hstring **h_keys_base; - DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using linear scan for lookup")); - - h_keys_base = DUK_HOBJECT_E_GET_KEY_BASE(heap, obj); - n = DUK_HOBJECT_GET_ENEXT(obj); - for (i = 0; i < n; i++) { - if (h_keys_base[i] == key) { - *e_idx = (duk_int_t) i; - *h_idx = -1; - return 1; - } - } - } -#if defined(DUK_USE_HOBJECT_HASH_PART) - else - { - /* hash lookup */ - duk_uint32_t n; - duk_uint32_t i, step; - duk_uint32_t *h_base; - duk_uint32_t mask; - - DUK_DDD(DUK_DDDPRINT("duk_hobject_find_existing_entry() using hash part for lookup")); - - h_base = DUK_HOBJECT_H_GET_BASE(heap, obj); - n = DUK_HOBJECT_GET_HSIZE(obj); - mask = n - 1; - i = DUK_HSTRING_GET_HASH(key) & mask; - step = 1; /* Cache friendly but clustering prone. */ - - for (;;) { - duk_uint32_t t; - - DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ - DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj)); - t = h_base[i]; - DUK_ASSERT(t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED || - (t < DUK_HOBJECT_GET_ESIZE(obj))); /* t >= 0 always true, unsigned */ - - if (t == DUK__HASH_UNUSED) { - break; - } else if (t == DUK__HASH_DELETED) { - DUK_DDD(DUK_DDDPRINT("lookup miss (deleted) i=%ld, t=%ld", - (long) i, (long) t)); - } else { - DUK_ASSERT(t < DUK_HOBJECT_GET_ESIZE(obj)); - if (DUK_HOBJECT_E_GET_KEY(heap, obj, t) == key) { - DUK_DDD(DUK_DDDPRINT("lookup hit i=%ld, t=%ld -> key %p", - (long) i, (long) t, (void *) key)); - *e_idx = (duk_int_t) t; - *h_idx = (duk_int_t) i; - return 1; - } - DUK_DDD(DUK_DDDPRINT("lookup miss i=%ld, t=%ld", - (long) i, (long) t)); - } - i = (i + step) & mask; - - /* Guaranteed to finish (hash is larger than #props). */ - } - } -#endif /* DUK_USE_HOBJECT_HASH_PART */ - - /* Not found, leave e_idx and h_idx unset. */ - return 0; -} - -/* For internal use: get non-accessor entry value */ -DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key) { - duk_int_t e_idx; - duk_int_t h_idx; - - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_UNREF(heap); - - if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) { - DUK_ASSERT(e_idx >= 0); - if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) { - return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx); - } - } - return NULL; -} - -/* For internal use: get non-accessor entry value and attributes */ -DUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs) { - duk_int_t e_idx; - duk_int_t h_idx; - - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(out_attrs != NULL); - DUK_UNREF(heap); - - if (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) { - DUK_ASSERT(e_idx >= 0); - if (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) { - *out_attrs = DUK_HOBJECT_E_GET_FLAGS(heap, obj, e_idx); - return DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx); - } - } - /* If not found, out_attrs is left unset. */ - return NULL; -} - -/* For internal use: get array part value */ -DUK_INTERNAL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i) { - duk_tval *tv; - - DUK_ASSERT(obj != NULL); - DUK_UNREF(heap); - - if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - return NULL; - } - if (i >= DUK_HOBJECT_GET_ASIZE(obj)) { - return NULL; - } - tv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, obj, i); - return tv; -} - -/* - * Allocate and initialize a new entry, resizing the properties allocation - * if necessary. Returns entry index (e_idx) or throws an error if alloc fails. - * - * Sets the key of the entry (increasing the key's refcount), and updates - * the hash part if it exists. Caller must set value and flags, and update - * the entry value refcount. A decref for the previous value is not necessary. - */ - -DUK_LOCAL duk_int_t duk__hobject_alloc_entry_checked(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) { - duk_uint32_t idx; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) <= DUK_HOBJECT_GET_ESIZE(obj)); - -#if defined(DUK_USE_ASSERTIONS) - /* key must not already exist in entry part */ - { - duk_uint_fast32_t i; - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != key); - } - } -#endif - - if (DUK_HOBJECT_GET_ENEXT(obj) >= DUK_HOBJECT_GET_ESIZE(obj)) { - /* only need to guarantee 1 more slot, but allocation growth is in chunks */ - DUK_DDD(DUK_DDDPRINT("entry part full, allocate space for one more entry")); - duk__grow_props_for_new_entry_item(thr, obj); - } - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) < DUK_HOBJECT_GET_ESIZE(obj)); - idx = DUK_HOBJECT_POSTINC_ENEXT(obj); - - /* previous value is assumed to be garbage, so don't touch it */ - DUK_HOBJECT_E_SET_KEY(thr->heap, obj, idx, key); - DUK_HSTRING_INCREF(thr, key); - -#if defined(DUK_USE_HOBJECT_HASH_PART) - if (DUK_UNLIKELY(DUK_HOBJECT_GET_HSIZE(obj) > 0)) { - duk_uint32_t n, mask; - duk_uint32_t i, step; - duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj); - - n = DUK_HOBJECT_GET_HSIZE(obj); - mask = n - 1; - i = DUK_HSTRING_GET_HASH(key) & mask; - step = 1; /* Cache friendly but clustering prone. */ - - for (;;) { - duk_uint32_t t = h_base[i]; - if (t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED) { - DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() inserted key into hash part, %ld -> %ld", - (long) i, (long) idx)); - DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ - DUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj)); - DUK_ASSERT_DISABLE(idx >= 0); - DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj)); - h_base[i] = idx; - break; - } - DUK_DDD(DUK_DDDPRINT("duk__hobject_alloc_entry_checked() miss %ld", (long) i)); - i = (i + step) & mask; - - /* Guaranteed to finish (hash is larger than #props). */ - } - } -#endif /* DUK_USE_HOBJECT_HASH_PART */ - - /* Note: we could return the hash index here too, but it's not - * needed right now. - */ - - DUK_ASSERT_DISABLE(idx >= 0); - DUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj)); - DUK_ASSERT(idx < DUK_HOBJECT_GET_ENEXT(obj)); - return (duk_int_t) idx; -} - -/* - * Object internal value - * - * Returned value is guaranteed to be reachable / incref'd, caller does not need - * to incref OR decref. No proxies or accessors are invoked, no prototype walk. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv_out) { - duk_int_t e_idx; - duk_int_t h_idx; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(tv_out != NULL); - - /* Always in entry part, no need to look up parents etc. */ - if (duk_hobject_find_existing_entry(heap, obj, DUK_HEAP_STRING_INT_VALUE(heap), &e_idx, &h_idx)) { - DUK_ASSERT(e_idx >= 0); - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)); - DUK_TVAL_SET_TVAL(tv_out, DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx)); - return 1; - } - DUK_TVAL_SET_UNDEFINED(tv_out); - return 0; -} - -DUK_INTERNAL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj) { - duk_tval tv; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(obj != NULL); - - /* This is not strictly necessary, but avoids compiler warnings; e.g. - * gcc won't reliably detect that no uninitialized data is read below. - */ - DUK_MEMZERO((void *) &tv, sizeof(duk_tval)); - - if (duk_hobject_get_internal_value(heap, obj, &tv)) { - duk_hstring *h; - DUK_ASSERT(DUK_TVAL_IS_STRING(&tv)); - h = DUK_TVAL_GET_STRING(&tv); - /* No explicit check for string vs. symbol, accept both. */ - return h; - } - - return NULL; -} - -/* - * Arguments handling helpers (argument map mainly). - * - * An arguments object has exotic behavior for some numeric indices. - * Accesses may translate to identifier operations which may have - * arbitrary side effects (potentially invalidating any duk_tval - * pointers). - */ - -/* Lookup 'key' from arguments internal 'map', perform a variable lookup - * if mapped, and leave the result on top of stack (and return non-zero). - * Used in E5 Section 10.6 algorithms [[Get]] and [[GetOwnProperty]]. - */ -DUK_LOCAL -duk_bool_t duk__lookup_arguments_map(duk_hthread *thr, - duk_hobject *obj, - duk_hstring *key, - duk_propdesc *temp_desc, - duk_hobject **out_map, - duk_hobject **out_varenv) { - duk_hobject *map; - duk_hobject *varenv; - duk_bool_t rc; - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_DDD(DUK_DDDPRINT("arguments map lookup: thr=%p, obj=%p, key=%p, temp_desc=%p " - "(obj -> %!O, key -> %!O)", - (void *) thr, (void *) obj, (void *) key, (void *) temp_desc, - (duk_heaphdr *) obj, (duk_heaphdr *) key)); - - if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - DUK_DDD(DUK_DDDPRINT("-> no 'map'")); - return 0; - } - - map = duk_require_hobject(thr, -1); - DUK_ASSERT(map != NULL); - duk_pop_unsafe(thr); /* map is reachable through obj */ - - if (!duk_hobject_get_own_propdesc(thr, map, key, temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - DUK_DDD(DUK_DDDPRINT("-> 'map' exists, but key not in map")); - return 0; - } - - /* [... varname] */ - DUK_DDD(DUK_DDDPRINT("-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T", - (duk_tval *) duk_get_tval(thr, -1))); - DUK_ASSERT(duk_is_string(thr, -1)); /* guaranteed when building arguments */ - - /* get varenv for varname (callee's declarative lexical environment) */ - rc = duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_VARENV(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE); - DUK_UNREF(rc); - DUK_ASSERT(rc != 0); /* arguments MUST have an initialized lexical environment reference */ - varenv = duk_require_hobject(thr, -1); - DUK_ASSERT(varenv != NULL); - duk_pop_unsafe(thr); /* varenv remains reachable through 'obj' */ - - DUK_DDD(DUK_DDDPRINT("arguments varenv is: %!dO", (duk_heaphdr *) varenv)); - - /* success: leave varname in stack */ - *out_map = map; - *out_varenv = varenv; - return 1; /* [... varname] */ -} - -/* Lookup 'key' from arguments internal 'map', and leave replacement value - * on stack top if mapped (and return non-zero). - * Used in E5 Section 10.6 algorithm for [[GetOwnProperty]] (used by [[Get]]). - */ -DUK_LOCAL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) { - duk_hobject *map; - duk_hobject *varenv; - duk_hstring *varname; - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) { - DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic get behavior")); - return 0; - } - - /* [... varname] */ - - varname = duk_require_hstring(thr, -1); - DUK_ASSERT(varname != NULL); - duk_pop_unsafe(thr); /* varname is still reachable */ - - DUK_DDD(DUK_DDDPRINT("arguments object automatic getvar for a bound variable; " - "key=%!O, varname=%!O", - (duk_heaphdr *) key, - (duk_heaphdr *) varname)); - - (void) duk_js_getvar_envrec(thr, varenv, varname, 1 /*throw*/); - - /* [... value this_binding] */ - - duk_pop_unsafe(thr); - - /* leave result on stack top */ - return 1; -} - -/* Lookup 'key' from arguments internal 'map', perform a variable write if mapped. - * Used in E5 Section 10.6 algorithm for [[DefineOwnProperty]] (used by [[Put]]). - * Assumes stack top contains 'put' value (which is NOT popped). - */ -DUK_LOCAL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag) { - duk_hobject *map; - duk_hobject *varenv; - duk_hstring *varname; - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - if (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) { - DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic put behavior")); - return; - } - - /* [... put_value varname] */ - - varname = duk_require_hstring(thr, -1); - DUK_ASSERT(varname != NULL); - duk_pop_unsafe(thr); /* varname is still reachable */ - - DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; " - "key=%!O, varname=%!O, value=%!T", - (duk_heaphdr *) key, - (duk_heaphdr *) varname, - (duk_tval *) duk_require_tval(thr, -1))); - - /* [... put_value] */ - - /* - * Note: although arguments object variable mappings are only established - * for non-strict functions (and a call to a non-strict function created - * the arguments object in question), an inner strict function may be doing - * the actual property write. Hence the throw_flag applied here comes from - * the property write call. - */ - - duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, -1), throw_flag); - - /* [... put_value] */ -} - -/* Lookup 'key' from arguments internal 'map', delete mapping if found. - * Used in E5 Section 10.6 algorithm for [[Delete]]. Note that the - * variable/argument itself (where the map points) is not deleted. - */ -DUK_LOCAL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) { - duk_hobject *map; - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - if (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - DUK_DDD(DUK_DDDPRINT("arguments: key not mapped, no exotic delete behavior")); - return; - } - - map = duk_require_hobject(thr, -1); - DUK_ASSERT(map != NULL); - duk_pop_unsafe(thr); /* map is reachable through obj */ - - DUK_DDD(DUK_DDDPRINT("-> have 'map', delete key %!O from map (if exists)); ignore result", - (duk_heaphdr *) key)); - - /* Note: no recursion issue, we can trust 'map' to behave */ - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(map)); - DUK_DDD(DUK_DDDPRINT("map before deletion: %!O", (duk_heaphdr *) map)); - (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ - DUK_DDD(DUK_DDDPRINT("map after deletion: %!O", (duk_heaphdr *) map)); -} - -/* - * Ecmascript compliant [[GetOwnProperty]](P), for internal use only. - * - * If property is found: - * - Fills descriptor fields to 'out_desc' - * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the - * property onto the stack ('undefined' for accessor properties). - * - Returns non-zero - * - * If property is not found: - * - 'out_desc' is left in untouched state (possibly garbage) - * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE - * set) - * - Returns zero - * - * Notes: - * - * - Getting a property descriptor may cause an allocation (and hence - * GC) to take place, hence reachability and refcount of all related - * values matter. Reallocation of value stack, properties, etc may - * invalidate many duk_tval pointers (concretely, those which reside - * in memory areas subject to reallocation). However, heap object - * pointers are never affected (heap objects have stable pointers). - * - * - The value of a plain property is always reachable and has a non-zero - * reference count. - * - * - The value of a virtual property is not necessarily reachable from - * elsewhere and may have a refcount of zero. Hence we push it onto - * the valstack for the caller, which ensures it remains reachable - * while it is needed. - * - * - There are no virtual accessor properties. Hence, all getters and - * setters are always related to concretely stored properties, which - * ensures that the get/set functions in the resulting descriptor are - * reachable and have non-zero refcounts. Should there be virtual - * accessor properties later, this would need to change. - */ - -DUK_LOCAL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags) { - duk_tval *tv; - - DUK_DDD(DUK_DDDPRINT("duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, " - "arr_idx=%ld (obj -> %!O, key -> %!O)", - (void *) thr, (void *) obj, (void *) key, (void *) out_desc, - (long) flags, (long) arr_idx, - (duk_heaphdr *) obj, (duk_heaphdr *) key)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(out_desc != NULL); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_STATS_INC(thr->heap, stats_getownpropdesc_count); - - /* Each code path returning 1 (= found) must fill in all the output - * descriptor fields. We don't do it beforehand because it'd be - * unnecessary work if the property isn't found and would happen - * multiple times for an inheritance chain. - */ - DUK_ASSERT_SET_GARBAGE(out_desc, sizeof(*out_desc)); -#if 0 - out_desc->flags = 0; - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; -#endif - - /* - * Try entries part first because it's the common case. - * - * Array part lookups are usually handled by the array fast path, and - * are not usually inherited. Array and entry parts never contain the - * same keys so the entry part vs. array part order doesn't matter. - */ - - if (duk_hobject_find_existing_entry(thr->heap, obj, key, &out_desc->e_idx, &out_desc->h_idx)) { - duk_int_t e_idx = out_desc->e_idx; - DUK_ASSERT(out_desc->e_idx >= 0); - out_desc->a_idx = -1; - out_desc->flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, e_idx); - out_desc->get = NULL; - out_desc->set = NULL; - if (DUK_UNLIKELY(out_desc->flags & DUK_PROPDESC_FLAG_ACCESSOR)) { - DUK_DDD(DUK_DDDPRINT("-> found accessor property in entry part")); - out_desc->get = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, e_idx); - out_desc->set = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, e_idx); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - /* a dummy undefined value is pushed to make valstack - * behavior uniform for caller - */ - duk_push_undefined(thr); - } - } else { - DUK_DDD(DUK_DDDPRINT("-> found plain property in entry part")); - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_push_tval(thr, tv); - } - } - goto prop_found; - } - - /* - * Try array part. - */ - - if (DUK_HOBJECT_HAS_ARRAY_PART(obj) && arr_idx != DUK__NO_ARRAY_INDEX) { - if (arr_idx < DUK_HOBJECT_GET_ASIZE(obj)) { - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); - if (!DUK_TVAL_IS_UNUSED(tv)) { - DUK_DDD(DUK_DDDPRINT("-> found in array part")); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_push_tval(thr, tv); - } - /* implicit attributes */ - out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE | - DUK_PROPDESC_FLAG_CONFIGURABLE | - DUK_PROPDESC_FLAG_ENUMERABLE; - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = (duk_int_t) arr_idx; /* XXX: limit 2G due to being signed */ - goto prop_found; - } - } - } - - DUK_DDD(DUK_DDDPRINT("-> not found as a concrete property")); - - /* - * Not found as a concrete property, check for virtual properties. - */ - - if (!DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(obj)) { - /* Quick skip. */ - goto prop_not_found; - } - - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - duk_harray *a; - - DUK_DDD(DUK_DDDPRINT("array object exotic property get for key: %!O, arr_idx: %ld", - (duk_heaphdr *) key, (long) arr_idx)); - - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); - - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_push_uint(thr, (duk_uint_t) a->length); - } - out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; - if (DUK_HARRAY_LENGTH_WRITABLE(a)) { - out_desc->flags |= DUK_PROPDESC_FLAG_WRITABLE; - } - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; - - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); - goto prop_found_noexotic; /* cannot be arguments exotic */ - } - } else if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj)) { - DUK_DDD(DUK_DDDPRINT("string object exotic property get for key: %!O, arr_idx: %ld", - (duk_heaphdr *) key, (long) arr_idx)); - - /* XXX: charlen; avoid multiple lookups? */ - - if (arr_idx != DUK__NO_ARRAY_INDEX) { - duk_hstring *h_val; - - DUK_DDD(DUK_DDDPRINT("array index exists")); - - h_val = duk_hobject_get_internal_value_string(thr->heap, obj); - DUK_ASSERT(h_val); - if (arr_idx < DUK_HSTRING_GET_CHARLEN(h_val)) { - DUK_DDD(DUK_DDDPRINT("-> found, array index inside string")); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_push_hstring(thr, h_val); - duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */ - } - out_desc->flags = DUK_PROPDESC_FLAG_ENUMERABLE | /* E5 Section 15.5.5.2 */ - DUK_PROPDESC_FLAG_VIRTUAL; - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; - - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); - goto prop_found_noexotic; /* cannot be arguments exotic */ - } else { - /* index is above internal string length -> property is fully normal */ - DUK_DDD(DUK_DDDPRINT("array index outside string -> normal property")); - } - } else if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - duk_hstring *h_val; - - DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); - - h_val = duk_hobject_get_internal_value_string(thr->heap, obj); - DUK_ASSERT(h_val != NULL); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_val)); - } - out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; /* E5 Section 15.5.5.1 */ - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; - - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); - goto prop_found_noexotic; /* cannot be arguments exotic */ - } - } -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - else if (DUK_HOBJECT_IS_BUFOBJ(obj)) { - duk_hbufobj *h_bufobj; - duk_uint_t byte_off; - duk_small_uint_t elem_size; - - h_bufobj = (duk_hbufobj *) obj; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - DUK_DDD(DUK_DDDPRINT("bufobj property get for key: %!O, arr_idx: %ld", - (duk_heaphdr *) key, (long) arr_idx)); - - if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { - DUK_DDD(DUK_DDDPRINT("array index exists")); - - /* Careful with wrapping: arr_idx upshift may easily wrap, whereas - * length downshift won't. - */ - if (arr_idx < (h_bufobj->length >> h_bufobj->shift)) { - byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ - elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - duk_uint8_t *data; - - if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { - data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; - duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size); - } else { - DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)")); - duk_push_uint(thr, 0); - } - } - out_desc->flags = DUK_PROPDESC_FLAG_WRITABLE | - DUK_PROPDESC_FLAG_VIRTUAL; - if (DUK_HOBJECT_GET_CLASS_NUMBER(obj) != DUK_HOBJECT_CLASS_ARRAYBUFFER) { - /* ArrayBuffer indices are non-standard and are - * non-enumerable to avoid their serialization. - */ - out_desc->flags |= DUK_PROPDESC_FLAG_ENUMERABLE; - } - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; - - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); - goto prop_found_noexotic; /* cannot be e.g. arguments exotic, since exotic 'traits' are mutually exclusive */ - } else { - /* index is above internal buffer length -> property is fully normal */ - DUK_DDD(DUK_DDDPRINT("array index outside buffer -> normal property")); - } - } else if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { - DUK_DDD(DUK_DDDPRINT("-> found, key is 'length', length exotic behavior")); - - if (flags & DUK_GETDESC_FLAG_PUSH_VALUE) { - /* Length in elements: take into account shift, but - * intentionally don't check the underlying buffer here. - */ - duk_push_uint(thr, h_bufobj->length >> h_bufobj->shift); - } - out_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL; - out_desc->get = NULL; - out_desc->set = NULL; - out_desc->e_idx = -1; - out_desc->h_idx = -1; - out_desc->a_idx = -1; - - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)); - goto prop_found_noexotic; /* cannot be arguments exotic */ - } - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - - /* Array properties have exotic behavior but they are concrete, - * so no special handling here. - * - * Arguments exotic behavior (E5 Section 10.6, [[GetOwnProperty]] - * is only relevant as a post-check implemented below; hence no - * check here. - */ - - /* - * Not found as concrete or virtual. - */ - - prop_not_found: - DUK_DDD(DUK_DDDPRINT("-> not found (virtual, entry part, or array part)")); - DUK_STATS_INC(thr->heap, stats_getownpropdesc_miss); - return 0; - - /* - * Found. - * - * Arguments object has exotic post-processing, see E5 Section 10.6, - * description of [[GetOwnProperty]] variant for arguments. - */ - - prop_found: - DUK_DDD(DUK_DDDPRINT("-> property found, checking for arguments exotic post-behavior")); - - /* Notes: - * - Only numbered indices are relevant, so arr_idx fast reject is good - * (this is valid unless there are more than 4**32-1 arguments). - * - Since variable lookup has no side effects, this can be skipped if - * DUK_GETDESC_FLAG_PUSH_VALUE is not set. - */ - - if (DUK_UNLIKELY(DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) && - arr_idx != DUK__NO_ARRAY_INDEX && - (flags & DUK_GETDESC_FLAG_PUSH_VALUE))) { - duk_propdesc temp_desc; - - /* Magically bound variable cannot be an accessor. However, - * there may be an accessor property (or a plain property) in - * place with magic behavior removed. This happens e.g. when - * a magic property is redefined with defineProperty(). - * Cannot assert for "not accessor" here. - */ - - /* replaces top of stack with new value if necessary */ - DUK_ASSERT((flags & DUK_GETDESC_FLAG_PUSH_VALUE) != 0); - - /* This can perform a variable lookup but only into a declarative - * environment which has no side effects. - */ - if (duk__check_arguments_map_for_get(thr, obj, key, &temp_desc)) { - DUK_DDD(DUK_DDDPRINT("-> arguments exotic behavior overrides result: %!T -> %!T", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - /* [... old_result result] -> [... result] */ - duk_remove_m2(thr); - } - } - - prop_found_noexotic: - DUK_STATS_INC(thr->heap, stats_getownpropdesc_hit); - return 1; -} - -DUK_INTERNAL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(out_desc != NULL); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - return duk__get_own_propdesc_raw(thr, obj, key, DUK_HSTRING_GET_ARRIDX_SLOW(key), out_desc, flags); -} - -/* - * Ecmascript compliant [[GetProperty]](P), for internal use only. - * - * If property is found: - * - Fills descriptor fields to 'out_desc' - * - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the - * property onto the stack ('undefined' for accessor properties). - * - Returns non-zero - * - * If property is not found: - * - 'out_desc' is left in untouched state (possibly garbage) - * - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE - * set) - * - Returns zero - * - * May cause arbitrary side effects and invalidate (most) duk_tval - * pointers. - */ - -DUK_LOCAL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) { - duk_hobject *curr; - duk_uint32_t arr_idx; - duk_uint_t sanity; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(out_desc != NULL); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_STATS_INC(thr->heap, stats_getpropdesc_count); - - arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key); - - DUK_DDD(DUK_DDDPRINT("duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, " - "arr_idx=%ld (obj -> %!O, key -> %!O)", - (void *) thr, (void *) obj, (void *) key, (void *) out_desc, - (long) flags, (long) arr_idx, - (duk_heaphdr *) obj, (duk_heaphdr *) key)); - - curr = obj; - DUK_ASSERT(curr != NULL); - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (duk__get_own_propdesc_raw(thr, curr, key, arr_idx, out_desc, flags)) { - /* stack contains value (if requested), 'out_desc' is set */ - DUK_STATS_INC(thr->heap, stats_getpropdesc_hit); - return 1; - } - - /* not found in 'curr', next in prototype chain; impose max depth */ - if (DUK_UNLIKELY(sanity-- == 0)) { - if (flags & DUK_GETDESC_FLAG_IGNORE_PROTOLOOP) { - /* treat like property not found */ - break; - } else { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - } - curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); - } while (curr != NULL); - - /* out_desc is left untouched (possibly garbage), caller must use return - * value to determine whether out_desc can be looked up - */ - - DUK_STATS_INC(thr->heap, stats_getpropdesc_miss); - return 0; -} - -/* - * Shallow fast path checks for accessing array elements with numeric - * indices. The goal is to try to avoid coercing an array index to an - * (interned) string for the most common lookups, in particular, for - * standard Array objects. - * - * Interning is avoided but only for a very narrow set of cases: - * - Object has array part, index is within array allocation, and - * value is not unused (= key exists) - * - Object has no interfering exotic behavior (e.g. arguments or - * string object exotic behaviors interfere, array exotic - * behavior does not). - * - * Current shortcoming: if key does not exist (even if it is within - * the array allocation range) a slow path lookup with interning is - * always required. This can probably be fixed so that there is a - * quick fast path for non-existent elements as well, at least for - * standard Array objects. - */ - -#if defined(DUK_USE_ARRAY_PROP_FASTPATH) -DUK_LOCAL duk_tval *duk__getprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) { - duk_tval *tv; - duk_uint32_t idx; - - DUK_UNREF(thr); - - if (!(DUK_HOBJECT_HAS_ARRAY_PART(obj) && - !DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) && - !DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj) && - !DUK_HOBJECT_IS_BUFOBJ(obj) && - !DUK_HOBJECT_IS_PROXY(obj))) { - /* Must have array part and no conflicting exotic behaviors. - * Doesn't need to have array special behavior, e.g. Arguments - * object has array part. - */ - return NULL; - } - - /* Arrays never have other exotic behaviors. */ - - DUK_DDD(DUK_DDDPRINT("fast path attempt (no exotic string/arguments/buffer " - "behavior, object has array part)")); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - idx = duk__tval_fastint_to_arr_idx(tv_key); - } else -#endif - if (DUK_TVAL_IS_DOUBLE(tv_key)) { - idx = duk__tval_number_to_arr_idx(tv_key); - } else { - DUK_DDD(DUK_DDDPRINT("key is not a number")); - return NULL; - } - - /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which - * is 0xffffffffUL. We don't need to check for that explicitly - * because 0xffffffffUL will never be inside object 'a_size'. - */ - - if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) { - DUK_DDD(DUK_DDDPRINT("key is not an array index or outside array part")); - return NULL; - } - DUK_ASSERT(idx != 0xffffffffUL); - DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); - - /* XXX: for array instances we could take a shortcut here and assume - * Array.prototype doesn't contain an array index property. - */ - - DUK_DDD(DUK_DDDPRINT("key is a valid array index and inside array part")); - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx); - if (!DUK_TVAL_IS_UNUSED(tv)) { - DUK_DDD(DUK_DDDPRINT("-> fast path successful")); - return tv; - } - - DUK_DDD(DUK_DDDPRINT("fast path attempt failed, fall back to slow path")); - return NULL; -} - -DUK_LOCAL duk_bool_t duk__putprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) { - duk_tval *tv; - duk_harray *a; - duk_uint32_t idx; - duk_uint32_t old_len, new_len; - - if (!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj) && - DUK_HOBJECT_HAS_ARRAY_PART(obj) && - DUK_HOBJECT_HAS_EXTENSIBLE(obj))) { - return 0; - } - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures */ - - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - idx = duk__tval_fastint_to_arr_idx(tv_key); - } else -#endif - if (DUK_TVAL_IS_DOUBLE(tv_key)) { - idx = duk__tval_number_to_arr_idx(tv_key); - } else { - DUK_DDD(DUK_DDDPRINT("key is not a number")); - return 0; - } - - /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which - * is 0xffffffffUL. We don't need to check for that explicitly - * because 0xffffffffUL will never be inside object 'a_size'. - */ - - if (idx >= DUK_HOBJECT_GET_ASIZE(obj)) { /* for resizing of array part, use slow path */ - return 0; - } - DUK_ASSERT(idx != 0xffffffffUL); - DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); - - old_len = a->length; - - if (idx >= old_len) { - DUK_DDD(DUK_DDDPRINT("write new array entry requires length update " - "(arr_idx=%ld, old_len=%ld)", - (long) idx, (long) old_len)); - if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { - /* The correct behavior here is either a silent error - * or a TypeError, depending on strictness. Fall back - * to the slow path to handle the situation. - */ - return 0; - } - new_len = idx + 1; - - ((duk_harray *) obj)->length = new_len; - } - - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects */ - - DUK_DDD(DUK_DDDPRINT("array fast path success for index %ld", (long) idx)); - return 1; -} -#endif /* DUK_USE_ARRAY_PROP_FASTPATH */ - -/* - * Fast path for bufobj getprop/putprop - */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_LOCAL duk_bool_t duk__getprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) { - duk_uint32_t idx; - duk_hbufobj *h_bufobj; - duk_uint_t byte_off; - duk_small_uint_t elem_size; - duk_uint8_t *data; - - if (!DUK_HOBJECT_IS_BUFOBJ(obj)) { - return 0; - } - h_bufobj = (duk_hbufobj *) obj; - if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { - return 0; - } - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - idx = duk__tval_fastint_to_arr_idx(tv_key); - } else -#endif - if (DUK_TVAL_IS_DOUBLE(tv_key)) { - idx = duk__tval_number_to_arr_idx(tv_key); - } else { - return 0; - } - - /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which - * is 0xffffffffUL. We don't need to check for that explicitly - * because 0xffffffffUL will never be inside bufobj length. - */ - - /* Careful with wrapping (left shifting idx would be unsafe). */ - if (idx >= (h_bufobj->length >> h_bufobj->shift)) { - return 0; - } - DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); - - byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ - elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); - - if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { - data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; - duk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size); - } else { - DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (read zero)")); - duk_push_uint(thr, 0); - } - - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) -DUK_LOCAL duk_bool_t duk__putprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) { - duk_uint32_t idx; - duk_hbufobj *h_bufobj; - duk_uint_t byte_off; - duk_small_uint_t elem_size; - duk_uint8_t *data; - - if (!(DUK_HOBJECT_IS_BUFOBJ(obj) && - DUK_TVAL_IS_NUMBER(tv_val))) { - return 0; - } - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); /* caller ensures; rom objects are never bufobjs now */ - - h_bufobj = (duk_hbufobj *) obj; - if (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { - return 0; - } - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - idx = duk__tval_fastint_to_arr_idx(tv_key); - } else -#endif - if (DUK_TVAL_IS_DOUBLE(tv_key)) { - idx = duk__tval_number_to_arr_idx(tv_key); - } else { - return 0; - } - - /* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which - * is 0xffffffffUL. We don't need to check for that explicitly - * because 0xffffffffUL will never be inside bufobj length. - */ - - /* Careful with wrapping (left shifting idx would be unsafe). */ - if (idx >= (h_bufobj->length >> h_bufobj->shift)) { - return 0; - } - DUK_ASSERT(idx != DUK__NO_ARRAY_INDEX); - - byte_off = idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ - elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); - - /* Value is required to be a number in the fast path so there - * are no side effects in write coercion. - */ - duk_push_tval(thr, tv_val); - DUK_ASSERT(duk_is_number(thr, -1)); - - if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { - data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; - duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size); - } else { - DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)")); - } - - duk_pop_unsafe(thr); - return 1; -} -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - -/* - * GETPROP: Ecmascript property read. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) { - duk_tval tv_obj_copy; - duk_tval tv_key_copy; - duk_hobject *curr = NULL; - duk_hstring *key = NULL; - duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX; - duk_propdesc desc; - duk_uint_t sanity; - - DUK_DDD(DUK_DDDPRINT("getprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", - (void *) thr, (void *) tv_obj, (void *) tv_key, - (duk_tval *) tv_obj, (duk_tval *) tv_key)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(tv_obj != NULL); - DUK_ASSERT(tv_key != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_STATS_INC(thr->heap, stats_getprop_all); - - /* - * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of - * them being invalidated by a valstack resize. - * - * XXX: this is now an overkill for many fast paths. Rework this - * to be faster (although switching to a valstack discipline might - * be a better solution overall). - */ - - DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj); - DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); - tv_obj = &tv_obj_copy; - tv_key = &tv_key_copy; - - /* - * Coercion and fast path processing - */ - - switch (DUK_TVAL_GET_TAG(tv_obj)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: { - /* Note: unconditional throw */ - DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject")); -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); -#else - DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot read property %s of %s", - duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); -#endif - return 0; - } - - case DUK_TAG_BOOLEAN: { - DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype")); - curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]; - break; - } - - case DUK_TAG_STRING: { - duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); - duk_int_t pop_count; - - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - /* Symbols (ES2015 or hidden) don't have virtual properties. */ - DUK_DDD(DUK_DDDPRINT("base object is a symbol, start lookup from symbol prototype")); - curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE]; - break; - } - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - arr_idx = duk__tval_fastint_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } else -#endif - if (DUK_TVAL_IS_NUMBER(tv_key)) { - arr_idx = duk__tval_number_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object string, key is a fast-path number; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } else { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - pop_count = 1; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { - duk_pop_n_unsafe(thr, pop_count); - duk_push_hstring(thr, h); - duk_substring(thr, -1, arr_idx, arr_idx + 1); /* [str] -> [substr] */ - - DUK_STATS_INC(thr->heap, stats_getprop_stringidx); - DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is an index inside string length " - "after coercion -> return char)", - (duk_tval *) duk_get_tval(thr, -1))); - return 1; - } - - if (pop_count == 0) { - /* This is a pretty awkward control flow, but we need to recheck the - * key coercion here. - */ - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object string, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - duk_pop_unsafe(thr); /* [key] -> [] */ - duk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); /* [] -> [res] */ - - DUK_STATS_INC(thr->heap, stats_getprop_stringlen); - DUK_DDD(DUK_DDDPRINT("-> %!T (base is string, key is 'length' after coercion -> " - "return string length)", - (duk_tval *) duk_get_tval(thr, -1))); - return 1; - } - - DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype")); - curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE]; - goto lookup; /* avoid double coercion */ - } - - case DUK_TAG_OBJECT: { -#if defined(DUK_USE_ARRAY_PROP_FASTPATH) - duk_tval *tmp; -#endif - - curr = DUK_TVAL_GET_OBJECT(tv_obj); - DUK_ASSERT(curr != NULL); - - /* XXX: array .length fast path (important in e.g. loops)? */ - -#if defined(DUK_USE_ARRAY_PROP_FASTPATH) - tmp = duk__getprop_shallow_fastpath_array_tval(thr, curr, tv_key); - if (tmp) { - duk_push_tval(thr, tmp); - - DUK_DDD(DUK_DDDPRINT("-> %!T (base is object, key is a number, array part " - "fast path)", - (duk_tval *) duk_get_tval(thr, -1))); - DUK_STATS_INC(thr->heap, stats_getprop_arrayidx); - return 1; - } -#endif - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - if (duk__getprop_fastpath_bufobj_tval(thr, curr, tv_key) != 0) { - /* Read value pushed on stack. */ - DUK_DDD(DUK_DDDPRINT("-> %!T (base is bufobj, key is a number, bufobj " - "fast path)", - (duk_tval *) duk_get_tval(thr, -1))); - DUK_STATS_INC(thr->heap, stats_getprop_bufobjidx); - return 1; - } -#endif - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(curr))) { - duk_hobject *h_target; - - if (duk__proxy_check_prop(thr, curr, DUK_STRIDX_GET, tv_key, &h_target)) { - /* -> [ ... trap handler ] */ - DUK_DDD(DUK_DDDPRINT("-> proxy object 'get' for key %!T", (duk_tval *) tv_key)); - DUK_STATS_INC(thr->heap, stats_getprop_proxy); - duk_push_hobject(thr, h_target); /* target */ - duk_push_tval(thr, tv_key); /* P */ - duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */ - duk_call_method(thr, 3 /*nargs*/); - - /* Target object must be checked for a conflicting - * non-configurable property. - */ - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - duk_tval *tv_hook = duk_require_tval(thr, -3); /* value from hook */ - duk_tval *tv_targ = duk_require_tval(thr, -1); /* value from target */ - duk_bool_t datadesc_reject; - duk_bool_t accdesc_reject; - - DUK_DDD(DUK_DDDPRINT("proxy 'get': target has matching property %!O, check for " - "conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, " - "desc.get=%p, desc.set=%p", - (duk_heaphdr *) key, (duk_tval *) tv_hook, (duk_tval *) tv_targ, - (unsigned long) desc.flags, - (void *) desc.get, (void *) desc.set)); - - datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && - !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && - !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) && - !duk_js_samevalue(tv_hook, tv_targ); - accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && - !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && - (desc.get == NULL) && - !DUK_TVAL_IS_UNDEFINED(tv_hook); - if (datadesc_reject || accdesc_reject) { - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - - duk_pop_2_unsafe(thr); - } else { - duk_pop_unsafe(thr); - } - return 1; /* return value */ - } - - curr = h_target; /* resume lookup from target */ - DUK_TVAL_SET_OBJECT(tv_obj, curr); - } -#endif /* DUK_USE_ES6_PROXY */ - - if (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(curr)) { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - DUK_STATS_INC(thr->heap, stats_getprop_arguments); - if (duk__check_arguments_map_for_get(thr, curr, key, &desc)) { - DUK_DDD(DUK_DDDPRINT("-> %!T (base is object with arguments exotic behavior, " - "key matches magically bound property -> skip standard " - "Get with replacement value)", - (duk_tval *) duk_get_tval(thr, -1))); - - /* no need for 'caller' post-check, because 'key' must be an array index */ - - duk_remove_m2(thr); /* [key result] -> [result] */ - return 1; - } - - goto lookup; /* avoid double coercion */ - } - break; - } - - /* Buffer has virtual properties similar to string, but indexed values - * are numbers, not 1-byte buffers/strings which would perform badly. - */ - case DUK_TAG_BUFFER: { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); - duk_int_t pop_count; - - /* - * Because buffer values are often looped over, a number fast path - * is important. - */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - arr_idx = duk__tval_fastint_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } - else -#endif - if (DUK_TVAL_IS_NUMBER(tv_key)) { - arr_idx = duk__tval_number_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } else { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - pop_count = 1; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HBUFFER_GET_SIZE(h)) { - duk_pop_n_unsafe(thr, pop_count); - duk_push_uint(thr, ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h))[arr_idx]); - DUK_STATS_INC(thr->heap, stats_getprop_bufferidx); - DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is an index inside buffer length " - "after coercion -> return byte as number)", - (duk_tval *) duk_get_tval(thr, -1))); - return 1; - } - - if (pop_count == 0) { - /* This is a pretty awkward control flow, but we need to recheck the - * key coercion here. - */ - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - duk_pop_unsafe(thr); /* [key] -> [] */ - duk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h)); /* [] -> [res] */ - DUK_STATS_INC(thr->heap, stats_getprop_bufferlen); - - DUK_DDD(DUK_DDDPRINT("-> %!T (base is buffer, key is 'length' " - "after coercion -> return buffer length)", - (duk_tval *) duk_get_tval(thr, -1))); - return 1; - } - - DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype")); - curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - goto lookup; /* avoid double coercion */ - } - - case DUK_TAG_POINTER: { - DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype")); - curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; - break; - } - - case DUK_TAG_LIGHTFUNC: { - /* Lightfuncs inherit getter .name and .length from %NativeFunctionPrototype%. */ - DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype")); - curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; - break; - } - -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - /* number */ - DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype")); - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_obj)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj)); - curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]; - break; - } - } - - /* key coercion (unless already coerced above) */ - DUK_ASSERT(key == NULL); - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - /* - * Property lookup - */ - - lookup: - /* [key] (coerced) */ - DUK_ASSERT(curr != NULL); - DUK_ASSERT(key != NULL); - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - goto next_in_chain; - } - - if (desc.get != NULL) { - /* accessor with defined getter */ - DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0); - - duk_pop_unsafe(thr); /* [key undefined] -> [key] */ - duk_push_hobject(thr, desc.get); - duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */ -#if defined(DUK_USE_NONSTD_GETTER_KEY_ARGUMENT) - duk_dup_m3(thr); - duk_call_method(thr, 1); /* [key getter this key] -> [key retval] */ -#else - duk_call_method(thr, 0); /* [key getter this] -> [key retval] */ -#endif - } else { - /* [key value] or [key undefined] */ - - /* data property or accessor without getter */ - DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) || - (desc.get == NULL)); - - /* if accessor without getter, return value is undefined */ - DUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) || - duk_is_undefined(thr, -1)); - - /* Note: for an accessor without getter, falling through to - * check for "caller" exotic behavior is unnecessary as - * "undefined" will never activate the behavior. But it does - * no harm, so we'll do it anyway. - */ - } - - goto found; /* [key result] */ - - next_in_chain: - /* XXX: option to pretend property doesn't exist if sanity limit is - * hit might be useful. - */ - if (DUK_UNLIKELY(sanity-- == 0)) { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); - } while (curr != NULL); - - /* - * Not found - */ - - duk_to_undefined(thr, -1); /* [key] -> [undefined] (default value) */ - - DUK_DDD(DUK_DDDPRINT("-> %!T (not found)", (duk_tval *) duk_get_tval(thr, -1))); - return 0; - - /* - * Found; post-processing (Function and arguments objects) - */ - - found: - /* [key result] */ - -#if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - /* Special behavior for 'caller' property of (non-bound) function objects - * and non-strict Arguments objects: if 'caller' -value- (!) is a strict - * mode function, throw a TypeError (E5 Sections 15.3.5.4, 10.6). - * Quite interestingly, a non-strict function with no formal arguments - * will get an arguments object -without- special 'caller' behavior! - * - * The E5.1 spec is a bit ambiguous if this special behavior applies when - * a bound function is the base value (not the 'caller' value): Section - * 15.3.4.5 (describing bind()) states that [[Get]] for bound functions - * matches that of Section 15.3.5.4 ([[Get]] for Function instances). - * However, Section 13.3.5.4 has "NOTE: Function objects created using - * Function.prototype.bind use the default [[Get]] internal method." - * The current implementation assumes this means that bound functions - * should not have the special [[Get]] behavior. - * - * The E5.1 spec is also a bit unclear if the TypeError throwing is - * applied if the 'caller' value is a strict bound function. The - * current implementation will throw even for both strict non-bound - * and strict bound functions. - * - * See test-dev-strict-func-as-caller-prop-value.js for quite extensive - * tests. - * - * This exotic behavior is disabled when the non-standard 'caller' property - * is enabled, as it conflicts with the free use of 'caller'. - */ - if (key == DUK_HTHREAD_STRING_CALLER(thr) && - DUK_TVAL_IS_OBJECT(tv_obj)) { - duk_hobject *orig = DUK_TVAL_GET_OBJECT(tv_obj); - DUK_ASSERT(orig != NULL); - - if (DUK_HOBJECT_IS_NONBOUND_FUNCTION(orig) || - DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) { - duk_hobject *h; - - /* XXX: The TypeError is currently not applied to bound - * functions because the 'strict' flag is not copied by - * bind(). This may or may not be correct, the specification - * only refers to the value being a "strict mode Function - * object" which is ambiguous. - */ - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(orig)); - - h = duk_get_hobject(thr, -1); /* NULL if not an object */ - if (h && - DUK_HOBJECT_IS_FUNCTION(h) && - DUK_HOBJECT_HAS_STRICT(h)) { - /* XXX: sufficient to check 'strict', assert for 'is function' */ - DUK_ERROR_TYPE(thr, DUK_STR_STRICT_CALLER_READ); - } - } - } -#endif /* !DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */ - - duk_remove_m2(thr); /* [key result] -> [result] */ - - DUK_DDD(DUK_DDDPRINT("-> %!T (found)", (duk_tval *) duk_get_tval(thr, -1))); - return 1; -} - -/* - * HASPROP: Ecmascript property existence check ("in" operator). - * - * Interestingly, the 'in' operator does not do any coercion of - * the target object. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) { - duk_tval tv_key_copy; - duk_hobject *obj; - duk_hstring *key; - duk_uint32_t arr_idx; - duk_bool_t rc; - duk_propdesc desc; - - DUK_DDD(DUK_DDDPRINT("hasprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", - (void *) thr, (void *) tv_obj, (void *) tv_key, - (duk_tval *) tv_obj, (duk_tval *) tv_key)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(tv_obj != NULL); - DUK_ASSERT(tv_key != NULL); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); - tv_key = &tv_key_copy; - - /* - * The 'in' operator requires an object as its right hand side, - * throwing a TypeError unconditionally if this is not the case. - * - * However, lightfuncs need to behave like fully fledged objects - * here to be maximally transparent, so we need to handle them - * here. Same goes for plain buffers which behave like ArrayBuffers. - */ - - /* XXX: Refactor key coercion so that it's only called once. It can't - * be trivially lifted here because the object must be type checked - * first. - */ - - if (DUK_TVAL_IS_OBJECT(tv_obj)) { - obj = DUK_TVAL_GET_OBJECT(tv_obj); - DUK_ASSERT(obj != NULL); - - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - } else if (DUK_TVAL_IS_BUFFER(tv_obj)) { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - if (duk__key_is_plain_buf_ownprop(thr, DUK_TVAL_GET_BUFFER(tv_obj), key, arr_idx)) { - rc = 1; - goto pop_and_return; - } - obj = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - - /* If not found, resume existence check from %NativeFunctionPrototype%. - * We can just substitute the value in this case; nothing will - * need the original base value (as would be the case with e.g. - * setters/getters. - */ - obj = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; - } else { - /* Note: unconditional throw */ - DUK_DDD(DUK_DDDPRINT("base object is not an object -> reject")); - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); - } - - /* XXX: fast path for arrays? */ - - DUK_ASSERT(key != NULL); - DUK_ASSERT(obj != NULL); - DUK_UNREF(arr_idx); - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) { - duk_hobject *h_target; - duk_bool_t tmp_bool; - - /* XXX: the key in 'key in obj' is string coerced before we're called - * (which is the required behavior in E5/E5.1/E6) so the key is a string - * here already. - */ - - if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_HAS, tv_key, &h_target)) { - /* [ ... key trap handler ] */ - DUK_DDD(DUK_DDDPRINT("-> proxy object 'has' for key %!T", (duk_tval *) tv_key)); - duk_push_hobject(thr, h_target); /* target */ - duk_push_tval(thr, tv_key); /* P */ - duk_call_method(thr, 2 /*nargs*/); - tmp_bool = duk_to_boolean(thr, -1); - if (!tmp_bool) { - /* Target object must be checked for a conflicting - * non-configurable property. - */ - - if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ - DUK_DDD(DUK_DDDPRINT("proxy 'has': target has matching property %!O, check for " - "conflicting property; desc.flags=0x%08lx, " - "desc.get=%p, desc.set=%p", - (duk_heaphdr *) key, (unsigned long) desc.flags, - (void *) desc.get, (void *) desc.set)); - /* XXX: Extensibility check for target uses IsExtensible(). If we - * implemented the isExtensible trap and didn't reject proxies as - * proxy targets, it should be respected here. - */ - if (!((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && /* property is configurable and */ - DUK_HOBJECT_HAS_EXTENSIBLE(h_target))) { /* ... target is extensible */ - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - } - } - - duk_pop_2_unsafe(thr); /* [ key trap_result ] -> [] */ - return tmp_bool; - } - - obj = h_target; /* resume check from proxy target */ - } -#endif /* DUK_USE_ES6_PROXY */ - - /* XXX: inline into a prototype walking loop? */ - - rc = duk__get_propdesc(thr, obj, key, &desc, 0 /*flags*/); /* don't push value */ - /* fall through */ - - pop_and_return: - duk_pop_unsafe(thr); /* [ key ] -> [] */ - return rc; -} - -/* - * HASPROP variant used internally. - * - * This primitive must never throw an error, callers rely on this. - * In particular, don't throw an error for prototype loops; instead, - * pretend like the property doesn't exist if a prototype sanity limit - * is reached. - * - * Does not implement proxy behavior: if applied to a proxy object, - * returns key existence on the proxy object itself. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) { - duk_propdesc dummy; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - return duk__get_propdesc(thr, obj, key, &dummy, DUK_GETDESC_FLAG_IGNORE_PROTOLOOP); /* don't push value */ -} - -/* - * Helper: handle Array object 'length' write which automatically - * deletes properties, see E5 Section 15.4.5.1, step 3. This is - * quite tricky to get right. - * - * Used by duk_hobject_putprop(). - */ - -/* Coerce a new .length candidate to a number and check that it's a valid - * .length. - */ -DUK_LOCAL duk_uint32_t duk__to_new_array_length_checked(duk_hthread *thr, duk_tval *tv) { - duk_uint32_t res; - duk_double_t d; - -#if !defined(DUK_USE_PREFER_SIZE) -#if defined(DUK_USE_FASTINT) - /* When fastints are enabled, the most interesting case is assigning - * a fastint to .length (e.g. arr.length = 0). - */ - if (DUK_TVAL_IS_FASTINT(tv)) { - /* Very common case. */ - duk_int64_t fi; - fi = DUK_TVAL_GET_FASTINT(tv); - if (fi < 0 || fi > DUK_I64_CONSTANT(0xffffffff)) { - goto fail_range; - } - return (duk_uint32_t) fi; - } -#else /* DUK_USE_FASTINT */ - /* When fastints are not enabled, the most interesting case is any - * number. - */ - if (DUK_TVAL_IS_DOUBLE(tv)) { - d = DUK_TVAL_GET_NUMBER(tv); - } -#endif /* DUK_USE_FASTINT */ - else -#endif /* !DUK_USE_PREFER_SIZE */ - { - /* In all other cases, and when doing a size optimized build, - * fall back to the comprehensive handler. - */ - d = duk_js_tonumber(thr, tv); - } - - /* Refuse to update an Array's 'length' to a value outside the - * 32-bit range. Negative zero is accepted as zero. - */ - res = (duk_uint32_t) d; - if ((duk_double_t) res != d) { - goto fail_range; - } - - return res; - - fail_range: - DUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARRAY_LENGTH); - return 0; /* unreachable */ -} - -/* Delete elements required by a smaller length, taking into account - * potentially non-configurable elements. Returns non-zero if all - * elements could be deleted, and zero if all or some elements could - * not be deleted. Also writes final "target length" to 'out_result_len'. - * This is the length value that should go into the 'length' property - * (must be set by the caller). Never throws an error. - */ -DUK_LOCAL -duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, - duk_hobject *obj, - duk_uint32_t old_len, - duk_uint32_t new_len, - duk_bool_t force_flag, - duk_uint32_t *out_result_len) { - duk_uint32_t target_len; - duk_uint_fast32_t i; - duk_uint32_t arr_idx; - duk_hstring *key; - duk_tval *tv; - duk_bool_t rc; - - DUK_DDD(DUK_DDDPRINT("new array length smaller than old (%ld -> %ld), " - "probably need to remove elements", - (long) old_len, (long) new_len)); - - /* - * New length is smaller than old length, need to delete properties above - * the new length. - * - * If array part exists, this is straightforward: array entries cannot - * be non-configurable so this is guaranteed to work. - * - * If array part does not exist, array-indexed values are scattered - * in the entry part, and some may not be configurable (preventing length - * from becoming lower than their index + 1). To handle the algorithm - * in E5 Section 15.4.5.1, step l correctly, we scan the entire property - * set twice. - */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(new_len < old_len); - DUK_ASSERT(out_result_len != NULL); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); - DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj)); - - if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - /* - * All defined array-indexed properties are in the array part - * (we assume the array part is comprehensive), and all array - * entries are writable, configurable, and enumerable. Thus, - * nothing can prevent array entries from being deleted. - */ - - DUK_DDD(DUK_DDDPRINT("have array part, easy case")); - - if (old_len < DUK_HOBJECT_GET_ASIZE(obj)) { - /* XXX: assertion that entries >= old_len are already unused */ - i = old_len; - } else { - i = DUK_HOBJECT_GET_ASIZE(obj); - } - DUK_ASSERT(i <= DUK_HOBJECT_GET_ASIZE(obj)); - - while (i > new_len) { - i--; - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); - DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */ - } - - *out_result_len = new_len; - return 1; - } else { - /* - * Entries part is a bit more complex. - */ - - /* Stage 1: find highest preventing non-configurable entry (if any). - * When forcing, ignore non-configurability. - */ - - DUK_DDD(DUK_DDDPRINT("no array part, slow case")); - - DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 1: find target_len " - "(highest preventing non-configurable entry (if any))")); - - target_len = new_len; - if (force_flag) { - DUK_DDD(DUK_DDDPRINT("array length write, no array part; force flag -> skip stage 1")); - goto skip_stage1; - } - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); - if (!key) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i)); - continue; - } - if (!DUK_HSTRING_HAS_ARRIDX(key)) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i)); - continue; - } - - DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */ - arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); - DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); - DUK_ASSERT(arr_idx < old_len); /* consistency requires this */ - - if (arr_idx < new_len) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below new_len", - (long) i, (long) arr_idx)); - continue; - } - if (DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is a relevant array index %ld, but configurable", - (long) i, (long) arr_idx)); - continue; - } - - /* relevant array index is non-configurable, blocks write */ - if (arr_idx >= target_len) { - DUK_DDD(DUK_DDDPRINT("entry at index %ld has arr_idx %ld, is not configurable, " - "update target_len %ld -> %ld", - (long) i, (long) arr_idx, (long) target_len, - (long) (arr_idx + 1))); - target_len = arr_idx + 1; - } - } - skip_stage1: - - /* stage 2: delete configurable entries above target length */ - - DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld, target_len=%ld", - (long) old_len, (long) new_len, (long) target_len)); - - DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 2: remove " - "entries >= target_len")); - - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - key = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i); - if (!key) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: null key", (long) i)); - continue; - } - if (!DUK_HSTRING_HAS_ARRIDX(key)) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key not an array index", (long) i)); - continue; - } - - DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key)); /* XXX: macro checks for array index flag, which is unnecessary here */ - arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); - DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); - DUK_ASSERT(arr_idx < old_len); /* consistency requires this */ - - if (arr_idx < target_len) { - DUK_DDD(DUK_DDDPRINT("skip entry index %ld: key is array index %ld, below target_len", - (long) i, (long) arr_idx)); - continue; - } - DUK_ASSERT(force_flag || DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)); /* stage 1 guarantees */ - - DUK_DDD(DUK_DDDPRINT("delete entry index %ld: key is array index %ld", - (long) i, (long) arr_idx)); - - /* - * Slow delete, but we don't care as we're already in a very slow path. - * The delete always succeeds: key has no exotic behavior, property - * is configurable, and no resize occurs. - */ - rc = duk_hobject_delprop_raw(thr, obj, key, force_flag ? DUK_DELPROP_FLAG_FORCE : 0); - DUK_UNREF(rc); - DUK_ASSERT(rc != 0); - } - - /* stage 3: update length (done by caller), decide return code */ - - DUK_DDD(DUK_DDDPRINT("array length write, no array part, stage 3: update length (done by caller)")); - - *out_result_len = target_len; - - if (target_len == new_len) { - DUK_DDD(DUK_DDDPRINT("target_len matches new_len, return success")); - return 1; - } - DUK_DDD(DUK_DDDPRINT("target_len does not match new_len (some entry prevented " - "full length adjustment), return error")); - return 0; - } - - DUK_UNREACHABLE(); -} - -/* XXX: is valstack top best place for argument? */ -DUK_LOCAL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj) { - duk_harray *a; - duk_uint32_t old_len; - duk_uint32_t new_len; - duk_uint32_t result_len; - duk_bool_t rc; - - DUK_DDD(DUK_DDDPRINT("handling a put operation to array 'length' exotic property, " - "new val: %!T", - (duk_tval *) duk_get_tval(thr, -1))); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(obj != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); - DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj)); - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - - DUK_ASSERT(duk_is_valid_index(thr, -1)); - - /* - * Get old and new length - */ - - old_len = a->length; - new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1)); - DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) old_len, (long) new_len)); - - /* - * Writability check - */ - - if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { - DUK_DDD(DUK_DDDPRINT("length is not writable, fail")); - return 0; - } - - /* - * New length not lower than old length => no changes needed - * (not even array allocation). - */ - - if (new_len >= old_len) { - DUK_DDD(DUK_DDDPRINT("new length is same or higher than old length, just update length, no deletions")); - a->length = new_len; - return 1; - } - - DUK_DDD(DUK_DDDPRINT("new length is lower than old length, probably must delete entries")); - - /* - * New length lower than old length => delete elements, then - * update length. - * - * Note: even though a bunch of elements have been deleted, the 'desc' is - * still valid as properties haven't been resized (and entries compacted). - */ - - rc = duk__handle_put_array_length_smaller(thr, obj, old_len, new_len, 0 /*force_flag*/, &result_len); - DUK_ASSERT(result_len >= new_len && result_len <= old_len); - - a->length = result_len; - - /* XXX: shrink array allocation or entries compaction here? */ - - return rc; -} - -/* - * PUTPROP: Ecmascript property write. - * - * Unlike Ecmascript primitive which returns nothing, returns 1 to indicate - * success and 0 to indicate failure (assuming throw is not set). - * - * This is an extremely tricky function. Some examples: - * - * * Currently a decref may trigger a GC, which may compact an object's - * property allocation. Consequently, any entry indices (e_idx) will - * be potentially invalidated by a decref. - * - * * Exotic behaviors (strings, arrays, arguments object) require, - * among other things: - * - * - Preprocessing before and postprocessing after an actual property - * write. For example, array index write requires pre-checking the - * array 'length' property for access control, and may require an - * array 'length' update after the actual write has succeeded (but - * not if it fails). - * - * - Deletion of multiple entries, as a result of array 'length' write. - * - * * Input values are taken as pointers which may point to the valstack. - * If valstack is resized because of the put (this may happen at least - * when the array part is abandoned), the pointers can be invalidated. - * (We currently make a copy of all of the input values to avoid issues.) - */ - -DUK_INTERNAL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag) { - duk_tval tv_obj_copy; - duk_tval tv_key_copy; - duk_tval tv_val_copy; - duk_hobject *orig = NULL; /* NULL if tv_obj is primitive */ - duk_hobject *curr; - duk_hstring *key = NULL; - duk_propdesc desc; - duk_tval *tv; - duk_uint32_t arr_idx; - duk_bool_t rc; - duk_int_t e_idx; - duk_uint_t sanity; - duk_uint32_t new_array_length = 0; /* 0 = no update */ - - DUK_DDD(DUK_DDDPRINT("putprop: thr=%p, obj=%p, key=%p, val=%p, throw=%ld " - "(obj -> %!T, key -> %!T, val -> %!T)", - (void *) thr, (void *) tv_obj, (void *) tv_key, (void *) tv_val, - (long) throw_flag, (duk_tval *) tv_obj, (duk_tval *) tv_key, (duk_tval *) tv_val)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(tv_obj != NULL); - DUK_ASSERT(tv_key != NULL); - DUK_ASSERT(tv_val != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - DUK_STATS_INC(thr->heap, stats_putprop_all); - - /* - * Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of - * them being invalidated by a valstack resize. - * - * XXX: this is an overkill for some paths, so optimize this later - * (or maybe switch to a stack arguments model entirely). - */ - - DUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj); - DUK_TVAL_SET_TVAL(&tv_key_copy, tv_key); - DUK_TVAL_SET_TVAL(&tv_val_copy, tv_val); - tv_obj = &tv_obj_copy; - tv_key = &tv_key_copy; - tv_val = &tv_val_copy; - - /* - * Coercion and fast path processing. - */ - - switch (DUK_TVAL_GET_TAG(tv_obj)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: { - /* Note: unconditional throw */ - DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject (object=%!iT)", - (duk_tval *) tv_obj)); -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); -#else - DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s", - duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); -#endif - return 0; - } - - case DUK_TAG_BOOLEAN: { - DUK_DDD(DUK_DDDPRINT("base object is a boolean, start lookup from boolean prototype")); - curr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]; - break; - } - - case DUK_TAG_STRING: { - duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); - - /* - * Note: currently no fast path for array index writes. - * They won't be possible anyway as strings are immutable. - */ - - DUK_ASSERT(key == NULL); - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - /* Symbols (ES2015 or hidden) don't have virtual properties. */ - curr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE]; - goto lookup; - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - goto fail_not_writable; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { - goto fail_not_writable; - } - - DUK_DDD(DUK_DDDPRINT("base object is a string, start lookup from string prototype")); - curr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE]; - goto lookup; /* avoid double coercion */ - } - - case DUK_TAG_OBJECT: { - orig = DUK_TVAL_GET_OBJECT(tv_obj); - DUK_ASSERT(orig != NULL); - -#if defined(DUK_USE_ROM_OBJECTS) - /* With this check in place fast paths won't need read-only - * object checks. This is technically incorrect if there are - * setters that cause no writes to ROM objects, but current - * built-ins don't have such setters. - */ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { - DUK_DD(DUK_DDPRINT("attempt to putprop on read-only target object")); - goto fail_not_writable_no_pop; /* Must avoid duk_pop() in exit path */ - } -#endif - - /* The fast path for array property put is not fully compliant: - * If one places conflicting number-indexed properties into - * Array.prototype (for example, a non-writable Array.prototype[7]) - * the fast path will incorrectly ignore them. - * - * This fast path could be made compliant by falling through - * to the slow path if the previous value was UNUSED. This would - * also remove the need to check for extensibility. Right now a - * non-extensible array is slower than an extensible one as far - * as writes are concerned. - * - * The fast path behavior is documented in more detail here: - * tests/ecmascript/test-misc-array-fast-write.js - */ - - /* XXX: array .length? */ - -#if defined(DUK_USE_ARRAY_PROP_FASTPATH) - if (duk__putprop_shallow_fastpath_array_tval(thr, orig, tv_key, tv_val) != 0) { - DUK_DDD(DUK_DDDPRINT("array fast path success")); - DUK_STATS_INC(thr->heap, stats_putprop_arrayidx); - return 1; - } -#endif - -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - if (duk__putprop_fastpath_bufobj_tval(thr, orig, tv_key, tv_val) != 0) { - DUK_DDD(DUK_DDDPRINT("base is bufobj, key is a number, bufobj fast path")); - DUK_STATS_INC(thr->heap, stats_putprop_bufobjidx); - return 1; - } -#endif - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(orig))) { - duk_hobject *h_target; - duk_bool_t tmp_bool; - - if (duk__proxy_check_prop(thr, orig, DUK_STRIDX_SET, tv_key, &h_target)) { - /* -> [ ... trap handler ] */ - DUK_DDD(DUK_DDDPRINT("-> proxy object 'set' for key %!T", (duk_tval *) tv_key)); - DUK_STATS_INC(thr->heap, stats_putprop_proxy); - duk_push_hobject(thr, h_target); /* target */ - duk_push_tval(thr, tv_key); /* P */ - duk_push_tval(thr, tv_val); /* V */ - duk_push_tval(thr, tv_obj); /* Receiver: Proxy object */ - duk_call_method(thr, 4 /*nargs*/); - tmp_bool = duk_to_boolean(thr, -1); - duk_pop_nodecref_unsafe(thr); - if (!tmp_bool) { - goto fail_proxy_rejected; - } - - /* Target object must be checked for a conflicting - * non-configurable property. - */ - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) { - duk_tval *tv_targ = duk_require_tval(thr, -1); - duk_bool_t datadesc_reject; - duk_bool_t accdesc_reject; - - DUK_DDD(DUK_DDDPRINT("proxy 'set': target has matching property %!O, check for " - "conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, " - "desc.get=%p, desc.set=%p", - (duk_heaphdr *) key, (duk_tval *) tv_val, (duk_tval *) tv_targ, - (unsigned long) desc.flags, - (void *) desc.get, (void *) desc.set)); - - datadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && - !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && - !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) && - !duk_js_samevalue(tv_val, tv_targ); - accdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) && - !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && - (desc.set == NULL); - if (datadesc_reject || accdesc_reject) { - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - - duk_pop_2_unsafe(thr); - } else { - duk_pop_unsafe(thr); - } - return 1; /* success */ - } - - orig = h_target; /* resume write to target */ - DUK_TVAL_SET_OBJECT(tv_obj, orig); - } -#endif /* DUK_USE_ES6_PROXY */ - - curr = orig; - break; - } - - case DUK_TAG_BUFFER: { - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); - duk_int_t pop_count = 0; - - /* - * Because buffer values may be looped over and read/written - * from, an array index fast path is important. - */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_key)) { - arr_idx = duk__tval_fastint_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path fastint; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } else -#endif - if (DUK_TVAL_IS_NUMBER(tv_key)) { - arr_idx = duk__tval_number_to_arr_idx(tv_key); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a fast-path number; arr_idx %ld", (long) arr_idx)); - pop_count = 0; - } else { - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - pop_count = 1; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HBUFFER_GET_SIZE(h)) { - duk_uint8_t *data; - DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx)); - data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); - - /* XXX: duk_to_int() ensures we'll get 8 lowest bits as - * as input is within duk_int_t range (capped outside it). - */ -#if defined(DUK_USE_FASTINT) - /* Buffer writes are often integers. */ - if (DUK_TVAL_IS_FASTINT(tv_val)) { - data[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val); - } - else -#endif - { - duk_push_tval(thr, tv_val); - data[arr_idx] = (duk_uint8_t) duk_to_uint32(thr, -1); - pop_count++; - } - - duk_pop_n_unsafe(thr, pop_count); - DUK_DDD(DUK_DDDPRINT("result: success (buffer data write)")); - DUK_STATS_INC(thr->heap, stats_putprop_bufferidx); - return 1; - } - - if (pop_count == 0) { - /* This is a pretty awkward control flow, but we need to recheck the - * key coercion here. - */ - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - DUK_DDD(DUK_DDDPRINT("base object buffer, key is a non-fast-path number; after " - "coercion key is %!T, arr_idx %ld", - (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx)); - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - goto fail_not_writable; - } - - DUK_DDD(DUK_DDDPRINT("base object is a buffer, start lookup from Uint8Array prototype")); - curr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - goto lookup; /* avoid double coercion */ - } - - case DUK_TAG_POINTER: { - DUK_DDD(DUK_DDDPRINT("base object is a pointer, start lookup from pointer prototype")); - curr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; - break; - } - - case DUK_TAG_LIGHTFUNC: { - /* Lightfuncs have no own properties and are considered non-extensible. - * However, the write may be captured by an inherited setter which - * means we can't stop the lookup here. - */ - DUK_DDD(DUK_DDDPRINT("base object is a lightfunc, start lookup from function prototype")); - curr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE]; - break; - } - -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - /* number */ - DUK_DDD(DUK_DDDPRINT("base object is a number, start lookup from number prototype")); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj)); - curr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]; - break; - } - } - - DUK_ASSERT(key == NULL); - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - lookup: - - /* - * Check whether the property already exists in the prototype chain. - * Note that the actual write goes into the original base object - * (except if an accessor property captures the write). - */ - - /* [key] */ - - DUK_ASSERT(curr != NULL); - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ - goto next_in_chain; - } - - if (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - /* - * Found existing accessor property (own or inherited). - * Call setter with 'this' set to orig, and value as the only argument. - * Setter calls are OK even for ROM objects. - * - * Note: no exotic arguments object behavior, because [[Put]] never - * calls [[DefineOwnProperty]] (E5 Section 8.12.5, step 5.b). - */ - - duk_hobject *setter; - - DUK_DD(DUK_DDPRINT("put to an own or inherited accessor, calling setter")); - - setter = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, curr, desc.e_idx); - if (!setter) { - goto fail_no_setter; - } - duk_push_hobject(thr, setter); - duk_push_tval(thr, tv_obj); /* note: original, uncoerced base */ - duk_push_tval(thr, tv_val); /* [key setter this val] */ -#if defined(DUK_USE_NONSTD_SETTER_KEY_ARGUMENT) - duk_dup_m4(thr); - duk_call_method(thr, 2); /* [key setter this val key] -> [key retval] */ -#else - duk_call_method(thr, 1); /* [key setter this val] -> [key retval] */ -#endif - duk_pop_unsafe(thr); /* ignore retval -> [key] */ - goto success_no_arguments_exotic; - } - - if (orig == NULL) { - /* - * Found existing own or inherited plain property, but original - * base is a primitive value. - */ - DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object")); - goto fail_base_primitive; - } - - if (curr != orig) { - /* - * Found existing inherited plain property. - * Do an access control check, and if OK, write - * new property to 'orig'. - */ - if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) { - DUK_DD(DUK_DDPRINT("found existing inherited plain property, but original object is not extensible")); - goto fail_not_extensible; - } - if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) { - DUK_DD(DUK_DDPRINT("found existing inherited plain property, original object is extensible, but inherited property is not writable")); - goto fail_not_writable; - } - DUK_DD(DUK_DDPRINT("put to new property, object extensible, inherited property found and is writable")); - goto create_new; - } else { - /* - * Found existing own (non-inherited) plain property. - * Do an access control check and update in place. - */ - - if (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) { - DUK_DD(DUK_DDPRINT("found existing own (non-inherited) plain property, but property is not writable")); - goto fail_not_writable; - } - if (desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) { - DUK_DD(DUK_DDPRINT("found existing own (non-inherited) virtual property, property is writable")); - - if (DUK_HOBJECT_IS_ARRAY(curr)) { - /* - * Write to 'length' of an array is a very complex case - * handled in a helper which updates both the array elements - * and writes the new 'length'. The write may result in an - * unconditional RangeError or a partial write (indicated - * by a return code). - * - * Note: the helper has an unnecessary writability check - * for 'length', we already know it is writable. - */ - DUK_ASSERT(key == DUK_HTHREAD_STRING_LENGTH(thr)); /* only virtual array property */ - - DUK_DDD(DUK_DDDPRINT("writing existing 'length' property to array exotic, invoke complex helper")); - - /* XXX: the helper currently assumes stack top contains new - * 'length' value and the whole calling convention is not very - * compatible with what we need. - */ - - duk_push_tval(thr, tv_val); /* [key val] */ - rc = duk__handle_put_array_length(thr, orig); - duk_pop_unsafe(thr); /* [key val] -> [key] */ - if (!rc) { - goto fail_array_length_partial; - } - - /* key is 'length', cannot match argument exotic behavior */ - goto success_no_arguments_exotic; - } -#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) - else if (DUK_HOBJECT_IS_BUFOBJ(curr)) { - duk_hbufobj *h_bufobj; - duk_uint_t byte_off; - duk_small_uint_t elem_size; - - h_bufobj = (duk_hbufobj *) curr; - DUK_ASSERT_HBUFOBJ_VALID(h_bufobj); - - DUK_DD(DUK_DDPRINT("writable virtual property is in buffer object")); - - /* Careful with wrapping: arr_idx upshift may easily wrap, whereas - * length downshift won't. - */ - if (arr_idx < (h_bufobj->length >> h_bufobj->shift) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) { - duk_uint8_t *data; - DUK_DDD(DUK_DDDPRINT("writing to buffer data at index %ld", (long) arr_idx)); - - DUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX); /* index/length check guarantees */ - byte_off = arr_idx << h_bufobj->shift; /* no wrap assuming h_bufobj->length is valid */ - elem_size = (duk_small_uint_t) (1U << h_bufobj->shift); - - /* Coerce to number before validating pointers etc so that the - * number coercions in duk_hbufobj_validated_write() are - * guaranteed to be side effect free and not invalidate the - * pointer checks we do here. - */ - duk_push_tval(thr, tv_val); - (void) duk_to_number_m1(thr); - - if (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) { - data = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off; - duk_hbufobj_validated_write(thr, h_bufobj, data, elem_size); - } else { - DUK_D(DUK_DPRINT("bufobj access out of underlying buffer, ignoring (write skipped)")); - } - duk_pop_unsafe(thr); - goto success_no_arguments_exotic; - } - } -#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ - - DUK_D(DUK_DPRINT("should not happen, key %!O", key)); - goto fail_internal; /* should not happen */ - } - DUK_DD(DUK_DDPRINT("put to existing own plain property, property is writable")); - goto update_old; - } - DUK_UNREACHABLE(); - - next_in_chain: - /* XXX: option to pretend property doesn't exist if sanity limit is - * hit might be useful. - */ - if (DUK_UNLIKELY(sanity-- == 0)) { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr); - } while (curr != NULL); - - /* - * Property not found in prototype chain. - */ - - DUK_DDD(DUK_DDDPRINT("property not found in prototype chain")); - - if (orig == NULL) { - DUK_DD(DUK_DDPRINT("attempt to create a new property in a primitive base object")); - goto fail_base_primitive; - } - - if (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) { - DUK_DD(DUK_DDPRINT("put to a new property (not found in prototype chain), but original object not extensible")); - goto fail_not_extensible; - } - - goto create_new; - - update_old: - - /* - * Update an existing property of the base object. - */ - - /* [key] */ - - DUK_DDD(DUK_DDDPRINT("update an existing property of the original object")); - - DUK_ASSERT(orig != NULL); -#if defined(DUK_USE_ROM_OBJECTS) - /* This should not happen because DUK_TAG_OBJECT case checks - * for this already, but check just in case. - */ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { - goto fail_not_writable; - } -#endif - - /* Although there are writable virtual properties (e.g. plain buffer - * and buffer object number indices), they are handled before we come - * here. - */ - DUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) == 0); - DUK_ASSERT(desc.a_idx >= 0 || desc.e_idx >= 0); - - /* Array own property .length is handled above. */ - DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr))); - - if (desc.e_idx >= 0) { - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, desc.e_idx); - DUK_DDD(DUK_DDDPRINT("previous entry value: %!iT", (duk_tval *) tv)); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; e_idx may be invalidated */ - /* don't touch property attributes or hash part */ - DUK_DD(DUK_DDPRINT("put to an existing entry at index %ld -> new value %!iT", - (long) desc.e_idx, (duk_tval *) tv)); - } else { - /* Note: array entries are always writable, so the writability check - * above is pointless for them. The check could be avoided with some - * refactoring but is probably not worth it. - */ - - DUK_ASSERT(desc.a_idx >= 0); - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, desc.a_idx); - DUK_DDD(DUK_DDDPRINT("previous array value: %!iT", (duk_tval *) tv)); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val); /* side effects; a_idx may be invalidated */ - DUK_DD(DUK_DDPRINT("put to an existing array entry at index %ld -> new value %!iT", - (long) desc.a_idx, (duk_tval *) tv)); - } - - /* Regardless of whether property is found in entry or array part, - * it may have arguments exotic behavior (array indices may reside - * in entry part for abandoned / non-existent array parts). - */ - goto success_with_arguments_exotic; - - create_new: - - /* - * Create a new property in the original object. - * - * Exotic properties need to be reconsidered here from a write - * perspective (not just property attributes perspective). - * However, the property does not exist in the object already, - * so this limits the kind of exotic properties that apply. - */ - - /* [key] */ - - DUK_DDD(DUK_DDDPRINT("create new property to original object")); - - DUK_ASSERT(orig != NULL); - - /* Array own property .length is handled above. */ - DUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr))); - -#if defined(DUK_USE_ROM_OBJECTS) - /* This should not happen because DUK_TAG_OBJECT case checks - * for this already, but check just in case. - */ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) { - goto fail_not_writable; - } -#endif - - /* Not possible because array object 'length' is present - * from its creation and cannot be deleted, and is thus - * caught as an existing property above. - */ - DUK_ASSERT(!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) && - key == DUK_HTHREAD_STRING_LENGTH(thr))); - - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) && - arr_idx != DUK__NO_ARRAY_INDEX) { - /* automatic length update */ - duk_uint32_t old_len; - duk_harray *a; - - a = (duk_harray *) orig; - DUK_ASSERT_HARRAY_VALID(a); - - old_len = a->length; - - if (arr_idx >= old_len) { - DUK_DDD(DUK_DDDPRINT("write new array entry requires length update " - "(arr_idx=%ld, old_len=%ld)", - (long) arr_idx, (long) old_len)); - - if (DUK_HARRAY_LENGTH_NONWRITABLE(a)) { - DUK_DD(DUK_DDPRINT("attempt to extend array, but array 'length' is not writable")); - goto fail_not_writable; - } - - /* Note: actual update happens once write has been completed - * without error below. The write should always succeed - * from a specification viewpoint, but we may e.g. run out - * of memory. It's safer in this order. - */ - - DUK_ASSERT(arr_idx != 0xffffffffUL); - new_array_length = arr_idx + 1; /* flag for later write */ - } else { - DUK_DDD(DUK_DDDPRINT("write new array entry does not require length update " - "(arr_idx=%ld, old_len=%ld)", - (long) arr_idx, (long) old_len)); - } - } - - /* write_to_array_part: */ - - /* - * Write to array part? - * - * Note: array abandonding requires a property resize which uses - * 'rechecks' valstack for temporaries and may cause any existing - * valstack pointers to be invalidated. To protect against this, - * tv_obj, tv_key, and tv_val are copies of the original inputs. - */ - - if (arr_idx != DUK__NO_ARRAY_INDEX && - DUK_HOBJECT_HAS_ARRAY_PART(orig)) { - if (arr_idx < DUK_HOBJECT_GET_ASIZE(orig)) { - goto no_array_growth; - } - - /* - * Array needs to grow, but we don't want it becoming too sparse. - * If it were to become sparse, abandon array part, moving all - * array entries into the entries part (for good). - * - * Since we don't keep track of actual density (used vs. size) of - * the array part, we need to estimate somehow. The check is made - * in two parts: - * - * - Check whether the resize need is small compared to the - * current size (relatively); if so, resize without further - * checking (essentially we assume that the original part is - * "dense" so that the result would be dense enough). - * - * - Otherwise, compute the resize using an actual density - * measurement based on counting the used array entries. - */ - - DUK_DDD(DUK_DDDPRINT("write to new array requires array resize, decide whether to do a " - "fast resize without abandon check (arr_idx=%ld, old_size=%ld)", - (long) arr_idx, (long) DUK_HOBJECT_GET_ASIZE(orig))); - - if (duk__abandon_array_slow_check_required(arr_idx, DUK_HOBJECT_GET_ASIZE(orig))) { - duk_uint32_t old_used; - duk_uint32_t old_size; - - DUK_DDD(DUK_DDDPRINT("=> fast check is NOT OK, do slow check for array abandon")); - - duk__compute_a_stats(thr, orig, &old_used, &old_size); - - DUK_DDD(DUK_DDDPRINT("abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld", - (long) old_used, (long) old_size, (long) arr_idx)); - - /* Note: intentionally use approximations to shave a few instructions: - * a_used = old_used (accurate: old_used + 1) - * a_size = arr_idx (accurate: arr_idx + 1) - */ - if (duk__abandon_array_density_check(old_used, arr_idx)) { - DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, " - "decided to abandon array part (would become too sparse)")); - - /* abandoning requires a props allocation resize and - * 'rechecks' the valstack, invalidating any existing - * valstack value pointers! - */ - duk__abandon_array_checked(thr, orig); - DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(orig)); - - goto write_to_entry_part; - } - - DUK_DDD(DUK_DDDPRINT("=> decided to keep array part")); - } else { - DUK_DDD(DUK_DDDPRINT("=> fast resize is OK")); - } - - DUK_DD(DUK_DDPRINT("write to new array entry beyond current length, " - "decided to extend current allocation")); - - duk__grow_props_for_array_item(thr, orig, arr_idx); - - no_array_growth: - - /* Note: assume array part is comprehensive, so that either - * the write goes to the array part, or we've abandoned the - * array above (and will not come here). - */ - - DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(orig)); - DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(orig)); - - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, arr_idx); - /* prev value must be unused, no decref */ - DUK_ASSERT(DUK_TVAL_IS_UNUSED(tv)); - DUK_TVAL_SET_TVAL(tv, tv_val); - DUK_TVAL_INCREF(thr, tv); - DUK_DD(DUK_DDPRINT("put to new array entry: %ld -> %!T", - (long) arr_idx, (duk_tval *) tv)); - - /* Note: array part values are [[Writable]], [[Enumerable]], - * and [[Configurable]] which matches the required attributes - * here. - */ - goto entry_updated; - } - - write_to_entry_part: - - /* - * Write to entry part - */ - - /* entry allocation updates hash part and increases the key - * refcount; may need a props allocation resize but doesn't - * 'recheck' the valstack. - */ - e_idx = duk__hobject_alloc_entry_checked(thr, orig, key); - DUK_ASSERT(e_idx >= 0); - - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, e_idx); - /* prev value can be garbage, no decref */ - DUK_TVAL_SET_TVAL(tv, tv_val); - DUK_TVAL_INCREF(thr, tv); - DUK_HOBJECT_E_SET_FLAGS(thr->heap, orig, e_idx, DUK_PROPDESC_FLAGS_WEC); - goto entry_updated; - - entry_updated: - - /* - * Possible pending array length update, which must only be done - * if the actual entry write succeeded. - */ - - if (new_array_length > 0) { - /* Note: zero works as a "no update" marker because the new length - * can never be zero after a new property is written. - */ - - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig)); - - DUK_DDD(DUK_DDDPRINT("write successful, pending array length update to: %ld", - (long) new_array_length)); - - ((duk_harray *) orig)->length = new_array_length; - } - - /* - * Arguments exotic behavior not possible for new properties: all - * magically bound properties are initially present in the arguments - * object, and if they are deleted, the binding is also removed from - * parameter map. - */ - - goto success_no_arguments_exotic; - - success_with_arguments_exotic: - - /* - * Arguments objects have exotic [[DefineOwnProperty]] which updates - * the internal 'map' of arguments for writes to currently mapped - * arguments. More conretely, writes to mapped arguments generate - * a write to a bound variable. - * - * The [[Put]] algorithm invokes [[DefineOwnProperty]] for existing - * data properties and new properties, but not for existing accessors. - * Hence, in E5 Section 10.6 ([[DefinedOwnProperty]] algorithm), we - * have a Desc with 'Value' (and possibly other properties too), and - * we end up in step 5.b.i. - */ - - if (arr_idx != DUK__NO_ARRAY_INDEX && - DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) { - /* Note: only numbered indices are relevant, so arr_idx fast reject - * is good (this is valid unless there are more than 4**32-1 arguments). - */ - - DUK_DDD(DUK_DDDPRINT("putprop successful, arguments exotic behavior needed")); - - /* Note: we can reuse 'desc' here */ - - /* XXX: top of stack must contain value, which helper doesn't touch, - * rework to use tv_val directly? - */ - - duk_push_tval(thr, tv_val); - (void) duk__check_arguments_map_for_put(thr, orig, key, &desc, throw_flag); - duk_pop_unsafe(thr); - } - /* fall thru */ - - success_no_arguments_exotic: - /* shared exit path now */ - DUK_DDD(DUK_DDDPRINT("result: success")); - duk_pop_unsafe(thr); /* remove key */ - return 1; - -#if defined(DUK_USE_ES6_PROXY) - fail_proxy_rejected: - DUK_DDD(DUK_DDDPRINT("result: error, proxy rejects")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - /* Note: no key on stack */ - return 0; -#endif - - fail_base_primitive: - DUK_DDD(DUK_DDDPRINT("result: error, base primitive")); - if (throw_flag) { -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); -#else - DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot write property %s of %s", - duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); -#endif - } - duk_pop_unsafe(thr); /* remove key */ - return 0; - - fail_not_extensible: - DUK_DDD(DUK_DDDPRINT("result: error, not extensible")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE); - } - duk_pop_unsafe(thr); /* remove key */ - return 0; - - fail_not_writable: - DUK_DDD(DUK_DDDPRINT("result: error, not writable")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE); - } - duk_pop_unsafe(thr); /* remove key */ - return 0; - -#if defined(DUK_USE_ROM_OBJECTS) - fail_not_writable_no_pop: - DUK_DDD(DUK_DDDPRINT("result: error, not writable")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE); - } - return 0; -#endif - - fail_array_length_partial: - DUK_DD(DUK_DDPRINT("result: error, array length write only partially successful")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); - } - duk_pop_unsafe(thr); /* remove key */ - return 0; - - fail_no_setter: - DUK_DDD(DUK_DDDPRINT("result: error, accessor property without setter")); - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_SETTER_UNDEFINED); - } - duk_pop_unsafe(thr); /* remove key */ - return 0; - - fail_internal: - DUK_DDD(DUK_DDDPRINT("result: error, internal")); - if (throw_flag) { - DUK_ERROR_INTERNAL(thr); - } - duk_pop_unsafe(thr); /* remove key */ - return 0; -} - -/* - * Ecmascript compliant [[Delete]](P, Throw). - */ - -DUK_INTERNAL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) { - duk_propdesc desc; - duk_tval *tv; - duk_uint32_t arr_idx; - duk_bool_t throw_flag; - duk_bool_t force_flag; - - throw_flag = (flags & DUK_DELPROP_FLAG_THROW); - force_flag = (flags & DUK_DELPROP_FLAG_FORCE); - - DUK_DDD(DUK_DDDPRINT("delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)", - (void *) thr, (void *) obj, (void *) key, (long) throw_flag, (long) force_flag, - (duk_heaphdr *) obj, (duk_heaphdr *) key)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - arr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key); - - /* 0 = don't push current value */ - if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ - DUK_DDD(DUK_DDDPRINT("property not found, succeed always")); - goto success; - } - -#if defined(DUK_USE_ROM_OBJECTS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_DD(DUK_DDPRINT("attempt to delprop on read-only target object")); - goto fail_not_configurable; - } -#endif - - if ((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) == 0 && !force_flag) { - goto fail_not_configurable; - } - if (desc.a_idx < 0 && desc.e_idx < 0) { - /* Currently there are no deletable virtual properties, but - * with force_flag we might attempt to delete one. - */ - DUK_DD(DUK_DDPRINT("delete failed: property found, force flag, but virtual (and implicitly non-configurable)")); - goto fail_virtual; - } - - if (desc.a_idx >= 0) { - DUK_ASSERT(desc.e_idx < 0); - - tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx); - DUK_TVAL_SET_UNUSED_UPDREF(thr, tv); /* side effects */ - goto success; - } else { - DUK_ASSERT(desc.a_idx < 0); - - /* remove hash entry (no decref) */ -#if defined(DUK_USE_HOBJECT_HASH_PART) - if (desc.h_idx >= 0) { - duk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj); - - DUK_DDD(DUK_DDDPRINT("removing hash entry at h_idx %ld", (long) desc.h_idx)); - DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) > 0); - DUK_ASSERT((duk_uint32_t) desc.h_idx < DUK_HOBJECT_GET_HSIZE(obj)); - h_base[desc.h_idx] = DUK__HASH_DELETED; - } else { - DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0); - } -#else - DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0); -#endif - - /* Remove value. This requires multiple writes so avoid side - * effects via no-refzero macros so that e_idx is not - * invalidated. - */ - DUK_DDD(DUK_DDDPRINT("before removing value, e_idx %ld, key %p, key at slot %p", - (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx))); - DUK_DDD(DUK_DDDPRINT("removing value at e_idx %ld", (long) desc.e_idx)); - if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx)) { - duk_hobject *tmp; - - tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, desc.e_idx); - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, desc.e_idx, NULL); - DUK_UNREF(tmp); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); - - tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, desc.e_idx); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, desc.e_idx, NULL); - DUK_UNREF(tmp); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); - } else { - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv); - } -#if 0 - /* Not strictly necessary because if key == NULL, flag MUST be ignored. */ - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, 0); -#endif - - /* Remove key. */ - DUK_DDD(DUK_DDDPRINT("before removing key, e_idx %ld, key %p, key at slot %p", - (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx))); - DUK_DDD(DUK_DDDPRINT("removing key at e_idx %ld", (long) desc.e_idx)); - DUK_ASSERT(key == DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)); - DUK_HOBJECT_E_SET_KEY(thr->heap, obj, desc.e_idx, NULL); - DUK_HSTRING_DECREF_NORZ(thr, key); - - /* Trigger refzero side effects only when we're done as a - * finalizer might operate on the object and affect the - * e_idx we're supposed to use. - */ - DUK_REFZERO_CHECK_SLOW(thr); - goto success; - } - - DUK_UNREACHABLE(); - - success: - /* - * Argument exotic [[Delete]] behavior (E5 Section 10.6) is - * a post-check, keeping arguments internal 'map' in sync with - * any successful deletes (note that property does not need to - * exist for delete to 'succeed'). - * - * Delete key from 'map'. Since 'map' only contains array index - * keys, we can use arr_idx for a fast skip. - */ - - DUK_DDD(DUK_DDDPRINT("delete successful, check for arguments exotic behavior")); - - if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) { - /* Note: only numbered indices are relevant, so arr_idx fast reject - * is good (this is valid unless there are more than 4**32-1 arguments). - */ - - DUK_DDD(DUK_DDDPRINT("delete successful, arguments exotic behavior needed")); - - /* Note: we can reuse 'desc' here */ - (void) duk__check_arguments_map_for_delete(thr, obj, key, &desc); - } - - DUK_DDD(DUK_DDDPRINT("delete successful")); - return 1; - - fail_virtual: /* just use the same "not configurable" error message */ - fail_not_configurable: - DUK_DDD(DUK_DDDPRINT("delete failed: property found, not configurable")); - - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); - } - return 0; -} - -/* - * DELPROP: Ecmascript property deletion. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag) { - duk_hstring *key = NULL; -#if defined(DUK_USE_ES6_PROXY) - duk_propdesc desc; -#endif - duk_int_t entry_top; - duk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX; - duk_bool_t rc; - - DUK_DDD(DUK_DDDPRINT("delprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)", - (void *) thr, (void *) tv_obj, (void *) tv_key, - (duk_tval *) tv_obj, (duk_tval *) tv_key)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(tv_obj != NULL); - DUK_ASSERT(tv_key != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - /* Storing the entry top is cheaper here to ensure stack is correct at exit, - * as there are several paths out. - */ - entry_top = duk_get_top(thr); - - if (DUK_TVAL_IS_UNDEFINED(tv_obj) || - DUK_TVAL_IS_NULL(tv_obj)) { - DUK_DDD(DUK_DDDPRINT("base object is undefined or null -> reject")); - goto fail_invalid_base_uncond; - } - - duk_push_tval(thr, tv_obj); - duk_push_tval(thr, tv_key); - - tv_obj = DUK_GET_TVAL_NEGIDX(thr, -2); - if (DUK_TVAL_IS_OBJECT(tv_obj)) { - duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_obj); - DUK_ASSERT(obj != NULL); - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) { - duk_hobject *h_target; - duk_bool_t tmp_bool; - - /* Note: proxy handling must happen before key is string coerced. */ - - if (duk__proxy_check_prop(thr, obj, DUK_STRIDX_DELETE_PROPERTY, tv_key, &h_target)) { - /* -> [ ... obj key trap handler ] */ - DUK_DDD(DUK_DDDPRINT("-> proxy object 'deleteProperty' for key %!T", (duk_tval *) tv_key)); - duk_push_hobject(thr, h_target); /* target */ - duk_dup_m4(thr); /* P */ - duk_call_method(thr, 2 /*nargs*/); - tmp_bool = duk_to_boolean(thr, -1); - duk_pop_nodecref_unsafe(thr); - if (!tmp_bool) { - goto fail_proxy_rejected; /* retval indicates delete failed */ - } - - /* Target object must be checked for a conflicting - * non-configurable property. - */ - tv_key = DUK_GET_TVAL_NEGIDX(thr, -1); - arr_idx = duk__push_tval_to_property_key(thr, tv_key, &key); - DUK_ASSERT(key != NULL); - - if (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ - duk_small_int_t desc_reject; - - DUK_DDD(DUK_DDDPRINT("proxy 'deleteProperty': target has matching property %!O, check for " - "conflicting property; desc.flags=0x%08lx, " - "desc.get=%p, desc.set=%p", - (duk_heaphdr *) key, (unsigned long) desc.flags, - (void *) desc.get, (void *) desc.set)); - - desc_reject = !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE); - if (desc_reject) { - /* unconditional */ - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - } - rc = 1; /* success */ - goto done_rc; - } - - obj = h_target; /* resume delete to target */ - } -#endif /* DUK_USE_ES6_PROXY */ - - arr_idx = duk__to_property_key(thr, -1, &key); - DUK_ASSERT(key != NULL); - - rc = duk_hobject_delprop_raw(thr, obj, key, throw_flag ? DUK_DELPROP_FLAG_THROW : 0); - goto done_rc; - } else if (DUK_TVAL_IS_STRING(tv_obj)) { - /* String has .length and array index virtual properties - * which can't be deleted. No need for a symbol check; - * no offending virtual symbols exist. - */ - /* XXX: unnecessary string coercion for array indices, - * intentional to keep small. - */ - duk_hstring *h = DUK_TVAL_GET_STRING(tv_obj); - DUK_ASSERT(h != NULL); - - arr_idx = duk__to_property_key(thr, -1, &key); - DUK_ASSERT(key != NULL); - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - goto fail_not_configurable; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HSTRING_GET_CHARLEN(h)) { - goto fail_not_configurable; - } - } else if (DUK_TVAL_IS_BUFFER(tv_obj)) { - /* XXX: unnecessary string coercion for array indices, - * intentional to keep small; some overlap with string - * handling. - */ - duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj); - DUK_ASSERT(h != NULL); - - arr_idx = duk__to_property_key(thr, -1, &key); - DUK_ASSERT(key != NULL); - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - goto fail_not_configurable; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && - arr_idx < DUK_HBUFFER_GET_SIZE(h)) { - goto fail_not_configurable; - } - } else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) { - /* Lightfunc has no virtual properties since Duktape 2.2 - * so success. Still must coerce key for side effects. - */ - - arr_idx = duk__to_property_key(thr, -1, &key); - DUK_ASSERT(key != NULL); - DUK_UNREF(key); - } - - /* non-object base, no offending virtual property */ - rc = 1; - goto done_rc; - - done_rc: - duk_set_top_unsafe(thr, entry_top); - return rc; - - fail_invalid_base_uncond: - /* Note: unconditional throw */ - DUK_ASSERT(duk_get_top(thr) == entry_top); -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE); -#else - DUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, "cannot delete property %s of %s", - duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj)); -#endif - return 0; - -#if defined(DUK_USE_ES6_PROXY) - fail_proxy_rejected: - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED); - } - duk_set_top_unsafe(thr, entry_top); - return 0; -#endif - - fail_not_configurable: - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); - } - duk_set_top_unsafe(thr, entry_top); - return 0; -} - -/* - * Internal helper to define a property with specific flags, ignoring - * normal semantics such as extensibility, write protection etc. - * Overwrites any existing value and attributes unless caller requests - * that value only be updated if it doesn't already exists. - * - * Does not support: - * - virtual properties (error if write attempted) - * - getter/setter properties (error if write attempted) - * - non-default (!= WEC) attributes for array entries (error if attempted) - * - array abandoning: if array part exists, it is always extended - * - array 'length' updating - * - * Stack: [... in_val] -> [] - * - * Used for e.g. built-in initialization and environment record - * operations. - */ - -DUK_INTERNAL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) { - duk_propdesc desc; - duk_uint32_t arr_idx; - duk_int_t e_idx; - duk_tval *tv1 = NULL; - duk_tval *tv2 = NULL; - duk_small_uint_t propflags = flags & DUK_PROPDESC_FLAGS_MASK; /* mask out flags not actually stored */ - - DUK_DDD(DUK_DDDPRINT("define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T", - (void *) thr, (duk_heaphdr *) obj, (duk_heaphdr *) key, - (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1))); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - DUK_ASSERT(duk_is_valid_index(thr, -1)); /* contains value */ - - arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); - - if (duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) { /* don't push value */ - if (desc.e_idx >= 0) { - if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { - DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> skip as requested")); - goto pop_exit; - } - DUK_DDD(DUK_DDDPRINT("property already exists in the entry part -> update value and attributes")); - if (DUK_UNLIKELY(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx))) { - DUK_D(DUK_DPRINT("existing property is an accessor, not supported")); - goto error_internal; - } - - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, propflags); - tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx); - } else if (desc.a_idx >= 0) { - if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { - DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> skip as requested")); - goto pop_exit; - } - DUK_DDD(DUK_DDDPRINT("property already exists in the array part -> update value (assert attributes)")); - if (propflags != DUK_PROPDESC_FLAGS_WEC) { - DUK_D(DUK_DPRINT("existing property in array part, but propflags not WEC (0x%02lx)", - (unsigned long) propflags)); - goto error_internal; - } - - tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx); - } else { - if (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) { - DUK_DDD(DUK_DDDPRINT("property already exists but is virtual -> skip as requested")); - goto pop_exit; - } - if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - duk_uint32_t new_len; -#if defined(DUK_USE_DEBUG) - duk_uint32_t prev_len; - prev_len = ((duk_harray *) obj)->length; -#endif - new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1)); - ((duk_harray *) obj)->length = new_len; - DUK_D(DUK_DPRINT("internal define property for array .length: %ld -> %ld", - (long) prev_len, (long) ((duk_harray *) obj)->length)); - goto pop_exit; - } - DUK_DD(DUK_DDPRINT("property already exists but is virtual -> failure")); - goto error_virtual; - } - - goto write_value; - } - - if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - if (arr_idx != DUK__NO_ARRAY_INDEX) { - DUK_DDD(DUK_DDDPRINT("property does not exist, object has array part -> possibly extend array part and write value (assert attributes)")); - DUK_ASSERT(propflags == DUK_PROPDESC_FLAGS_WEC); - - /* always grow the array, no sparse / abandon support here */ - if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) { - duk__grow_props_for_array_item(thr, obj, arr_idx); - } - - DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj)); - tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); - goto write_value; - } - } - - DUK_DDD(DUK_DDDPRINT("property does not exist, object belongs in entry part -> allocate new entry and write value and attributes")); - e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); /* increases key refcount */ - DUK_ASSERT(e_idx >= 0); - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, propflags); - tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); - /* new entry: previous value is garbage; set to undefined to share write_value */ - DUK_TVAL_SET_UNDEFINED(tv1); - goto write_value; - - write_value: - /* tv1 points to value storage */ - - tv2 = duk_require_tval(thr, -1); /* late lookup, avoid side effects */ - DUK_DDD(DUK_DDDPRINT("writing/updating value: %!T -> %!T", - (duk_tval *) tv1, (duk_tval *) tv2)); - - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ - goto pop_exit; - - pop_exit: - duk_pop_unsafe(thr); /* remove in_val */ - return; - - error_virtual: /* share error message */ - error_internal: - DUK_ERROR_INTERNAL(thr); - return; -} - -/* - * Fast path for defining array indexed values without interning the key. - * This is used by e.g. code for Array prototype and traceback creation so - * must avoid interning. - */ - -DUK_INTERNAL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags) { - duk_hstring *key; - duk_tval *tv1, *tv2; - - DUK_DDD(DUK_DDDPRINT("define new property (internal) arr_idx fast path: thr=%p, obj=%!O, " - "arr_idx=%ld, flags=0x%02lx, val=%!T", - (void *) thr, obj, (long) arr_idx, (unsigned long) flags, - (duk_tval *) duk_get_tval(thr, -1))); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)); - - if (DUK_HOBJECT_HAS_ARRAY_PART(obj) && - arr_idx != DUK__NO_ARRAY_INDEX && - flags == DUK_PROPDESC_FLAGS_WEC) { - DUK_ASSERT((flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) == 0); /* covered by comparison */ - - DUK_DDD(DUK_DDDPRINT("define property to array part (property may or may not exist yet)")); - - /* always grow the array, no sparse / abandon support here */ - if (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) { - duk__grow_props_for_array_item(thr, obj, arr_idx); - } - - DUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj)); - tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx); - tv2 = duk_require_tval(thr, -1); - - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ - - duk_pop_unsafe(thr); /* [ ...val ] -> [ ... ] */ - return; - } - - DUK_DDD(DUK_DDDPRINT("define property fast path didn't work, use slow path")); - - key = duk_push_uint_to_hstring(thr, (duk_uint_t) arr_idx); - DUK_ASSERT(key != NULL); - duk_insert(thr, -2); /* [ ... val key ] -> [ ... key val ] */ - - duk_hobject_define_property_internal(thr, obj, key, flags); - - duk_pop_unsafe(thr); /* [ ... key ] -> [ ... ] */ -} - -/* - * Internal helpers for managing object 'length' - */ - -DUK_INTERNAL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj) { - duk_double_t val; - - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(obj != NULL); - - /* Fast path for Arrays. */ - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - return ((duk_harray *) obj)->length; - } - - /* Slow path, .length can be e.g. accessor, obj can be a Proxy, etc. */ - duk_push_hobject(thr, obj); - duk_push_hstring_stridx(thr, DUK_STRIDX_LENGTH); - (void) duk_hobject_getprop(thr, - DUK_GET_TVAL_NEGIDX(thr, -2), - DUK_GET_TVAL_NEGIDX(thr, -1)); - val = duk_to_number_m1(thr); - duk_pop_3_unsafe(thr); - - /* This isn't part of Ecmascript semantics; return a value within - * duk_size_t range, or 0 otherwise. - */ - if (val >= 0.0 && val <= (duk_double_t) DUK_SIZE_MAX) { - return (duk_size_t) val; - } - return 0; -} - -/* - * Fast finalizer check for an object. Walks the prototype chain, checking - * for finalizer presence using DUK_HOBJECT_FLAG_HAVE_FINALIZER which is kept - * in sync with the actual property when setting/removing the finalizer. - */ - -#if defined(DUK_USE_HEAPPTR16) -DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj) { -#else -DUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj) { -#endif - duk_uint_t sanity; - - DUK_ASSERT(obj != NULL); - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - if (DUK_UNLIKELY(DUK_HOBJECT_HAS_HAVE_FINALIZER(obj))) { - return 1; - } - if (DUK_UNLIKELY(sanity-- == 0)) { - DUK_D(DUK_DPRINT("prototype loop when checking for finalizer existence; returning false")); - return 0; - } -#if defined(DUK_USE_HEAPPTR16) - DUK_ASSERT(heap != NULL); - obj = DUK_HOBJECT_GET_PROTOTYPE(heap, obj); -#else - obj = DUK_HOBJECT_GET_PROTOTYPE(NULL, obj); /* 'heap' arg ignored */ -#endif - } while (obj != NULL); - - return 0; -} - -/* - * Object.getOwnPropertyDescriptor() (E5 Sections 15.2.3.3, 8.10.4) - * - * [ ... key ] -> [ ... desc/undefined ] - */ - -DUK_INTERNAL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx) { - duk_hobject *obj; - duk_hstring *key; - duk_propdesc pd; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - - obj = duk_require_hobject_promote_mask(thr, obj_idx, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - key = duk_to_property_key_hstring(thr, -1); - DUK_ASSERT(key != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - if (!duk_hobject_get_own_propdesc(thr, obj, key, &pd, DUK_GETDESC_FLAG_PUSH_VALUE)) { - duk_push_undefined(thr); - duk_remove_m2(thr); - return; - } - - duk_push_object(thr); - - /* [ ... key value desc ] */ - - if (DUK_PROPDESC_IS_ACCESSOR(&pd)) { - /* If a setter/getter is missing (undefined), the descriptor must - * still have the property present with the value 'undefined'. - */ - if (pd.get) { - duk_push_hobject(thr, pd.get); - } else { - duk_push_undefined(thr); - } - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_GET); - if (pd.set) { - duk_push_hobject(thr, pd.set); - } else { - duk_push_undefined(thr); - } - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_SET); - } else { - duk_dup_m2(thr); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_VALUE); - duk_push_boolean(thr, DUK_PROPDESC_IS_WRITABLE(&pd)); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_WRITABLE); - } - duk_push_boolean(thr, DUK_PROPDESC_IS_ENUMERABLE(&pd)); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_ENUMERABLE); - duk_push_boolean(thr, DUK_PROPDESC_IS_CONFIGURABLE(&pd)); - duk_put_prop_stridx_short(thr, -2, DUK_STRIDX_CONFIGURABLE); - - /* [ ... key value desc ] */ - - duk_replace(thr, -3); - duk_pop_unsafe(thr); /* -> [ ... desc ] */ -} - -/* - * NormalizePropertyDescriptor() related helper. - * - * Internal helper which validates and normalizes a property descriptor - * represented as an Ecmascript object (e.g. argument to defineProperty()). - * The output of this conversion is a set of defprop_flags and possibly - * some values pushed on the value stack to (1) ensure borrowed pointers - * remain valid, and (2) avoid unnecessary pops for footprint reasons. - * Caller must manage stack top carefully because the number of values - * pushed depends on the input property descriptor. - * - * The original descriptor object must not be altered in the process. - */ - -/* XXX: very basic optimization -> duk_get_prop_stridx_top */ - -DUK_INTERNAL -void duk_hobject_prepare_property_descriptor(duk_hthread *thr, - duk_idx_t idx_in, - duk_uint_t *out_defprop_flags, - duk_idx_t *out_idx_value, - duk_hobject **out_getter, - duk_hobject **out_setter) { - duk_idx_t idx_value = -1; - duk_hobject *getter = NULL; - duk_hobject *setter = NULL; - duk_bool_t is_data_desc = 0; - duk_bool_t is_acc_desc = 0; - duk_uint_t defprop_flags = 0; - - DUK_ASSERT(out_defprop_flags != NULL); - DUK_ASSERT(out_idx_value != NULL); - DUK_ASSERT(out_getter != NULL); - DUK_ASSERT(out_setter != NULL); - DUK_ASSERT(idx_in <= 0x7fffL); /* short variants would be OK, but not used to avoid shifts */ - - /* Must be an object, otherwise TypeError (E5.1 Section 8.10.5, step 1). */ - idx_in = duk_require_normalize_index(thr, idx_in); - (void) duk_require_hobject(thr, idx_in); - - /* The coercion order must match the ToPropertyDescriptor() algorithm - * so that side effects in coercion happen in the correct order. - * (This order also happens to be compatible with duk_def_prop(), - * although it doesn't matter in practice.) - */ - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_VALUE)) { - is_data_desc = 1; - defprop_flags |= DUK_DEFPROP_HAVE_VALUE; - idx_value = duk_get_top_index(thr); - } - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_WRITABLE)) { - is_data_desc = 1; - if (duk_to_boolean(thr, -1)) { - defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE; - } else { - defprop_flags |= DUK_DEFPROP_HAVE_WRITABLE; - } - } - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_GET)) { - duk_tval *tv = duk_require_tval(thr, -1); - duk_hobject *h_get; - - if (DUK_TVAL_IS_UNDEFINED(tv)) { - /* undefined is accepted */ - DUK_ASSERT(getter == NULL); - } else { - /* NOTE: lightfuncs are coerced to full functions because - * lightfuncs don't fit into a property value slot. This - * has some side effects, see test-dev-lightfunc-accessor.js. - */ - h_get = duk_get_hobject_promote_lfunc(thr, -1); - if (h_get == NULL || !DUK_HOBJECT_IS_CALLABLE(h_get)) { - goto type_error; - } - getter = h_get; - } - is_acc_desc = 1; - defprop_flags |= DUK_DEFPROP_HAVE_GETTER; - } - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_SET)) { - duk_tval *tv = duk_require_tval(thr, -1); - duk_hobject *h_set; - - if (DUK_TVAL_IS_UNDEFINED(tv)) { - /* undefined is accepted */ - DUK_ASSERT(setter == NULL); - } else { - /* NOTE: lightfuncs are coerced to full functions because - * lightfuncs don't fit into a property value slot. This - * has some side effects, see test-dev-lightfunc-accessor.js. - */ - h_set = duk_get_hobject_promote_lfunc(thr, -1); - if (h_set == NULL || !DUK_HOBJECT_IS_CALLABLE(h_set)) { - goto type_error; - } - setter = h_set; - } - is_acc_desc = 1; - defprop_flags |= DUK_DEFPROP_HAVE_SETTER; - } - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_ENUMERABLE)) { - if (duk_to_boolean(thr, -1)) { - defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE; - } else { - defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE; - } - } - - if (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_CONFIGURABLE)) { - if (duk_to_boolean(thr, -1)) { - defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE; - } else { - defprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE; - } - } - - if (is_data_desc && is_acc_desc) { - goto type_error; - } - - *out_defprop_flags = defprop_flags; - *out_idx_value = idx_value; - *out_getter = getter; - *out_setter = setter; - - /* [ ... [multiple values] ] */ - return; - - type_error: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR); -} - -/* - * Object.defineProperty() related helper (E5 Section 15.2.3.6). - * Also handles ES2015 Reflect.defineProperty(). - * - * Inlines all [[DefineOwnProperty]] exotic behaviors. - * - * Note: Ecmascript compliant [[DefineOwnProperty]](P, Desc, Throw) is not - * implemented directly, but Object.defineProperty() serves its purpose. - * We don't need the [[DefineOwnProperty]] internally and we don't have a - * property descriptor with 'missing values' so it's easier to avoid it - * entirely. - * - * Note: this is only called for actual objects, not primitive values. - * This must support virtual properties for full objects (e.g. Strings) - * but not for plain values (e.g. strings). Lightfuncs, even though - * primitive in a sense, are treated like objects and accepted as target - * values. - */ - -/* XXX: this is a major target for size optimization */ -DUK_INTERNAL -duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr, - duk_uint_t defprop_flags, - duk_hobject *obj, - duk_hstring *key, - duk_idx_t idx_value, - duk_hobject *get, - duk_hobject *set, - duk_bool_t throw_flag) { - duk_uint32_t arr_idx; - duk_tval tv; - duk_bool_t has_enumerable; - duk_bool_t has_configurable; - duk_bool_t has_writable; - duk_bool_t has_value; - duk_bool_t has_get; - duk_bool_t has_set; - duk_bool_t is_enumerable; - duk_bool_t is_configurable; - duk_bool_t is_writable; - duk_bool_t force_flag; - duk_small_uint_t new_flags; - duk_propdesc curr; - duk_uint32_t arridx_new_array_length; /* != 0 => post-update for array 'length' (used when key is an array index) */ - duk_uint32_t arrlen_old_len; - duk_uint32_t arrlen_new_len; - duk_bool_t pending_write_protect; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - DUK_ASSERT(key != NULL); - /* idx_value may be < 0 (no value), set and get may be NULL */ - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - - /* All the flags fit in 16 bits, so will fit into duk_bool_t. */ - - has_writable = (defprop_flags & DUK_DEFPROP_HAVE_WRITABLE); - has_enumerable = (defprop_flags & DUK_DEFPROP_HAVE_ENUMERABLE); - has_configurable = (defprop_flags & DUK_DEFPROP_HAVE_CONFIGURABLE); - has_value = (defprop_flags & DUK_DEFPROP_HAVE_VALUE); - has_get = (defprop_flags & DUK_DEFPROP_HAVE_GETTER); - has_set = (defprop_flags & DUK_DEFPROP_HAVE_SETTER); - is_writable = (defprop_flags & DUK_DEFPROP_WRITABLE); - is_enumerable = (defprop_flags & DUK_DEFPROP_ENUMERABLE); - is_configurable = (defprop_flags & DUK_DEFPROP_CONFIGURABLE); - force_flag = (defprop_flags & DUK_DEFPROP_FORCE); - - arr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key); - - arridx_new_array_length = 0; - pending_write_protect = 0; - arrlen_old_len = 0; - arrlen_new_len = 0; - - DUK_DDD(DUK_DDDPRINT("has_enumerable=%ld is_enumerable=%ld " - "has_configurable=%ld is_configurable=%ld " - "has_writable=%ld is_writable=%ld " - "has_value=%ld value=%!T " - "has_get=%ld get=%p=%!O " - "has_set=%ld set=%p=%!O " - "arr_idx=%ld throw_flag=!%ld", - (long) has_enumerable, (long) is_enumerable, - (long) has_configurable, (long) is_configurable, - (long) has_writable, (long) is_writable, - (long) has_value, (duk_tval *) (idx_value >= 0 ? duk_get_tval(thr, idx_value) : NULL), - (long) has_get, (void *) get, (duk_heaphdr *) get, - (long) has_set, (void *) set, (duk_heaphdr *) set, - (long) arr_idx, (long) throw_flag)); - - /* - * Array exotic behaviors can be implemented at this point. The local variables - * are essentially a 'value copy' of the input descriptor (Desc), which is modified - * by the Array [[DefineOwnProperty]] (E5 Section 15.4.5.1). - */ - - if (!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - goto skip_array_exotic; - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr)) { - duk_harray *a; - - /* E5 Section 15.4.5.1, step 3, steps a - i are implemented here, j - n at the end */ - if (!has_value) { - DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', but no value in descriptor -> normal behavior")); - goto skip_array_exotic; - } - - DUK_DDD(DUK_DDDPRINT("exotic array behavior for 'length', value present in descriptor -> exotic behavior")); - - /* - * Get old and new length - */ - - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - arrlen_old_len = a->length; - - DUK_ASSERT(idx_value >= 0); - arrlen_new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_POSIDX(thr, idx_value)); - duk_push_u32(thr, arrlen_new_len); - duk_replace(thr, idx_value); /* step 3.e: replace 'Desc.[[Value]]' */ - - DUK_DDD(DUK_DDDPRINT("old_len=%ld, new_len=%ld", (long) arrlen_old_len, (long) arrlen_new_len)); - - if (arrlen_new_len >= arrlen_old_len) { - /* standard behavior, step 3.f.i */ - DUK_DDD(DUK_DDDPRINT("new length is same or higher as previous => standard behavior")); - goto skip_array_exotic; - } - DUK_DDD(DUK_DDDPRINT("new length is smaller than previous => exotic post behavior")); - - /* XXX: consolidated algorithm step 15.f -> redundant? */ - if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) { - /* Array .length is always non-configurable; if it's also - * non-writable, don't allow it to be written. - */ - goto fail_not_configurable; - } - - /* steps 3.h and 3.i */ - if (has_writable && !is_writable) { - DUK_DDD(DUK_DDDPRINT("desc writable is false, force it back to true, and flag pending write protect")); - is_writable = 1; - pending_write_protect = 1; - } - - /* remaining actual steps are carried out if standard DefineOwnProperty succeeds */ - } else if (arr_idx != DUK__NO_ARRAY_INDEX) { - /* XXX: any chance of unifying this with the 'length' key handling? */ - - /* E5 Section 15.4.5.1, step 4 */ - duk_uint32_t old_len; - duk_harray *a; - - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - - old_len = a->length; - - if (arr_idx >= old_len) { - DUK_DDD(DUK_DDDPRINT("defineProperty requires array length update " - "(arr_idx=%ld, old_len=%ld)", - (long) arr_idx, (long) old_len)); - - if (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) { - /* Array .length is always non-configurable, so - * if it's also non-writable, don't allow a value - * write. With force flag allow writing. - */ - goto fail_not_configurable; - } - - /* actual update happens once write has been completed without - * error below. - */ - DUK_ASSERT(arr_idx != 0xffffffffUL); - arridx_new_array_length = arr_idx + 1; - } else { - DUK_DDD(DUK_DDDPRINT("defineProperty does not require length update " - "(arr_idx=%ld, old_len=%ld) -> standard behavior", - (long) arr_idx, (long) old_len)); - } - } - skip_array_exotic: - - /* XXX: There is currently no support for writing buffer object - * indexed elements here. Attempt to do so will succeed and - * write a concrete property into the buffer object. This should - * be fixed at some point but because buffers are a custom feature - * anyway, this is relatively unimportant. - */ - - /* - * Actual Object.defineProperty() default algorithm. - */ - - /* - * First check whether property exists; if not, simple case. This covers - * steps 1-4. - */ - - if (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE)) { - DUK_DDD(DUK_DDDPRINT("property does not exist")); - - if (!DUK_HOBJECT_HAS_EXTENSIBLE(obj) && !force_flag) { - goto fail_not_extensible; - } - -#if defined(DUK_USE_ROM_OBJECTS) - /* ROM objects are never extensible but force flag may - * allow us to come here anyway. - */ - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj) || !DUK_HOBJECT_HAS_EXTENSIBLE(obj)); - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_D(DUK_DPRINT("attempt to define property on a read-only target object")); - goto fail_not_configurable; - } -#endif - - /* XXX: share final setting code for value and flags? difficult because - * refcount code is different. Share entry allocation? But can't allocate - * until array index checked. - */ - - /* steps 4.a and 4.b are tricky */ - if (has_set || has_get) { - duk_int_t e_idx; - - DUK_DDD(DUK_DDDPRINT("create new accessor property")); - - DUK_ASSERT(has_set || set == NULL); - DUK_ASSERT(has_get || get == NULL); - DUK_ASSERT(!has_value); - DUK_ASSERT(!has_writable); - - new_flags = DUK_PROPDESC_FLAG_ACCESSOR; /* defaults, E5 Section 8.6.1, Table 7 */ - if (has_enumerable && is_enumerable) { - new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; - } - if (has_configurable && is_configurable) { - new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - DUK_DDD(DUK_DDDPRINT("accessor cannot go to array part, abandon array")); - duk__abandon_array_checked(thr, obj); - } - - /* write to entry part */ - e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); - DUK_ASSERT(e_idx >= 0); - - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, e_idx, get); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, e_idx, set); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, get); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, set); - - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags); - goto success_exotics; - } else { - duk_int_t e_idx; - duk_tval *tv2; - - DUK_DDD(DUK_DDDPRINT("create new data property")); - - DUK_ASSERT(!has_set); - DUK_ASSERT(!has_get); - - new_flags = 0; /* defaults, E5 Section 8.6.1, Table 7 */ - if (has_writable && is_writable) { - new_flags |= DUK_PROPDESC_FLAG_WRITABLE; - } - if (has_enumerable && is_enumerable) { - new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; - } - if (has_configurable && is_configurable) { - new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; - } - if (has_value) { - duk_tval *tv_tmp = duk_require_tval(thr, idx_value); - DUK_TVAL_SET_TVAL(&tv, tv_tmp); - } else { - DUK_TVAL_SET_UNDEFINED(&tv); /* default value */ - } - - if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) { - if (new_flags == DUK_PROPDESC_FLAGS_WEC) { -#if 0 - DUK_DDD(DUK_DDDPRINT("new data property attributes match array defaults, attempt to write to array part")); - /* may become sparse...*/ -#endif - /* XXX: handling for array part missing now; this doesn't affect - * compliance but causes array entry writes using defineProperty() - * to always abandon array part. - */ - } - DUK_DDD(DUK_DDDPRINT("new data property cannot go to array part, abandon array")); - duk__abandon_array_checked(thr, obj); - /* fall through */ - } - - /* write to entry part */ - e_idx = duk__hobject_alloc_entry_checked(thr, obj, key); - DUK_ASSERT(e_idx >= 0); - tv2 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx); - DUK_TVAL_SET_TVAL(tv2, &tv); - DUK_TVAL_INCREF(thr, tv2); - - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags); - goto success_exotics; - } - DUK_UNREACHABLE(); - } - - /* we currently assume virtual properties are not configurable (as none of them are) */ - DUK_ASSERT((curr.e_idx >= 0 || curr.a_idx >= 0) || !(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)); - - /* [obj key desc value get set curr_value] */ - - /* - * Property already exists. Steps 5-6 detect whether any changes need - * to be made. - */ - - if (has_enumerable) { - if (is_enumerable) { - if (!(curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE)) { - goto need_check; - } - } else { - if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) { - goto need_check; - } - } - } - if (has_configurable) { - if (is_configurable) { - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) { - goto need_check; - } - } else { - if (curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) { - goto need_check; - } - } - } - if (has_value) { - duk_tval *tmp1; - duk_tval *tmp2; - - /* attempt to change from accessor to data property */ - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - goto need_check; - } - - tmp1 = duk_require_tval(thr, -1); /* curr value */ - tmp2 = duk_require_tval(thr, idx_value); /* new value */ - if (!duk_js_samevalue(tmp1, tmp2)) { - goto need_check; - } - } - if (has_writable) { - /* attempt to change from accessor to data property */ - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - goto need_check; - } - - if (is_writable) { - if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE)) { - goto need_check; - } - } else { - if (curr.flags & DUK_PROPDESC_FLAG_WRITABLE) { - goto need_check; - } - } - } - if (has_set) { - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - if (set != curr.set) { - goto need_check; - } - } else { - goto need_check; - } - } - if (has_get) { - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - if (get != curr.get) { - goto need_check; - } - } else { - goto need_check; - } - } - - /* property exists, either 'desc' is empty, or all values - * match (SameValue) - */ - goto success_no_exotics; - - need_check: - - /* - * Some change(s) need to be made. Steps 7-11. - */ - - /* shared checks for all descriptor types */ - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { - if (has_configurable && is_configurable) { - goto fail_not_configurable; - } - if (has_enumerable) { - if (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) { - if (!is_enumerable) { - goto fail_not_configurable; - } - } else { - if (is_enumerable) { - goto fail_not_configurable; - } - } - } - } - - /* Virtual properties don't have backing so they can't mostly be - * edited. Some virtual properties are, however, writable: for - * example, virtual index properties of buffer objects and Array - * instance .length. These are not configurable so the checks - * above mostly cover attempts to change them, except when the - * duk_def_prop() call is used with DUK_DEFPROP_FORCE; even in - * that case we can't forcibly change the property attributes - * because they don't have concrete backing. - */ - - /* XXX: for ROM objects too it'd be best if value modify was - * allowed if the value matches SameValue. - */ - /* Reject attempt to change a read-only object. */ -#if defined(DUK_USE_ROM_OBJECTS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_DD(DUK_DDPRINT("attempt to define property on read-only target object")); - goto fail_not_configurable; - } -#endif - - /* descriptor type specific checks */ - if (has_set || has_get) { - /* IsAccessorDescriptor(desc) == true */ - DUK_ASSERT(!has_writable); - DUK_ASSERT(!has_value); - - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - /* curr and desc are accessors */ - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { - if (has_set && set != curr.set) { - goto fail_not_configurable; - } - if (has_get && get != curr.get) { - goto fail_not_configurable; - } - } - } else { - duk_bool_t rc; - duk_tval *tv1; - - /* curr is data, desc is accessor */ - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { - goto fail_not_configurable; - } - - DUK_DDD(DUK_DDDPRINT("convert property to accessor property")); - if (curr.a_idx >= 0) { - DUK_DDD(DUK_DDDPRINT("property to convert is stored in an array entry, abandon array and re-lookup")); - duk__abandon_array_checked(thr, obj); - duk_pop_unsafe(thr); /* remove old value */ - rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE); - DUK_UNREF(rc); - DUK_ASSERT(rc != 0); - DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0); - } - if (curr.e_idx < 0) { - DUK_ASSERT(curr.a_idx < 0 && curr.e_idx < 0); - goto fail_virtual; /* safeguard for virtual property */ - } - - DUK_ASSERT(curr.e_idx >= 0); - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); - - tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv1); /* XXX: just decref */ - - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL); - DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx); - DUK_HOBJECT_E_SLOT_SET_ACCESSOR(thr->heap, obj, curr.e_idx); - - DUK_DDD(DUK_DDDPRINT("flags after data->accessor conversion: 0x%02lx", - (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx))); - /* Update curr.flags; faster than a re-lookup. */ - curr.flags &= ~DUK_PROPDESC_FLAG_WRITABLE; - curr.flags |= DUK_PROPDESC_FLAG_ACCESSOR; - } - } else if (has_value || has_writable) { - /* IsDataDescriptor(desc) == true */ - DUK_ASSERT(!has_set); - DUK_ASSERT(!has_get); - - if (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) { - duk_hobject *tmp; - - /* curr is accessor, desc is data */ - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { - goto fail_not_configurable; - } - - /* curr is accessor -> cannot be in array part. */ - DUK_ASSERT(curr.a_idx < 0); - if (curr.e_idx < 0) { - goto fail_virtual; /* safeguard; no virtual accessors now */ - } - - DUK_DDD(DUK_DDDPRINT("convert property to data property")); - - DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); - tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx); - DUK_UNREF(tmp); - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); - tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx); - DUK_UNREF(tmp); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); - - DUK_TVAL_SET_UNDEFINED(DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx)); - DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx); - DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(thr->heap, obj, curr.e_idx); - - DUK_DDD(DUK_DDDPRINT("flags after accessor->data conversion: 0x%02lx", - (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx))); - - /* Update curr.flags; faster than a re-lookup. */ - curr.flags &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ACCESSOR); - } else { - /* curr and desc are data */ - if (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) { - if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_writable && is_writable) { - goto fail_not_configurable; - } - /* Note: changing from writable to non-writable is OK */ - if (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_value) { - duk_tval *tmp1 = duk_require_tval(thr, -1); /* curr value */ - duk_tval *tmp2 = duk_require_tval(thr, idx_value); /* new value */ - if (!duk_js_samevalue(tmp1, tmp2)) { - goto fail_not_configurable; - } - } - } - } - } else { - /* IsGenericDescriptor(desc) == true; this means in practice that 'desc' - * only has [[Enumerable]] or [[Configurable]] flag updates, which are - * allowed at this point. - */ - - DUK_ASSERT(!has_value && !has_writable && !has_get && !has_set); - } - - /* - * Start doing property attributes updates. Steps 12-13. - * - * Start by computing new attribute flags without writing yet. - * Property type conversion is done above if necessary. - */ - - new_flags = curr.flags; - - if (has_enumerable) { - if (is_enumerable) { - new_flags |= DUK_PROPDESC_FLAG_ENUMERABLE; - } else { - new_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE; - } - } - if (has_configurable) { - if (is_configurable) { - new_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; - } else { - new_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE; - } - } - if (has_writable) { - if (is_writable) { - new_flags |= DUK_PROPDESC_FLAG_WRITABLE; - } else { - new_flags &= ~DUK_PROPDESC_FLAG_WRITABLE; - } - } - - /* XXX: write protect after flag? -> any chance of handling it here? */ - - DUK_DDD(DUK_DDDPRINT("new flags that we want to write: 0x%02lx", - (unsigned long) new_flags)); - - /* - * Check whether we need to abandon an array part (if it exists) - */ - - if (curr.a_idx >= 0) { - duk_bool_t rc; - - DUK_ASSERT(curr.e_idx < 0); - - if (new_flags == DUK_PROPDESC_FLAGS_WEC) { - duk_tval *tv1, *tv2; - - DUK_DDD(DUK_DDDPRINT("array index, new property attributes match array defaults, update in-place")); - - DUK_ASSERT(curr.flags == DUK_PROPDESC_FLAGS_WEC); /* must have been, since in array part */ - DUK_ASSERT(!has_set); - DUK_ASSERT(!has_get); - DUK_ASSERT(idx_value >= 0); /* must be: if attributes match and we get here the value must differ (otherwise no change) */ - - tv2 = duk_require_tval(thr, idx_value); - tv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, curr.a_idx); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate a_idx */ - goto success_exotics; - } - - DUK_DDD(DUK_DDDPRINT("array index, new property attributes do not match array defaults, abandon array and re-lookup")); - duk__abandon_array_checked(thr, obj); - duk_pop_unsafe(thr); /* remove old value */ - rc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE); - DUK_UNREF(rc); - DUK_ASSERT(rc != 0); - DUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0); - } - - DUK_DDD(DUK_DDDPRINT("updating existing property in entry part")); - - /* Array case is handled comprehensively above: either in entry - * part or a virtual property. - */ - DUK_ASSERT(curr.a_idx < 0); - - DUK_DDD(DUK_DDDPRINT("update existing property attributes")); - if (curr.e_idx >= 0) { - DUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, curr.e_idx, new_flags); - } else { - /* For Array .length the only allowed transition is for .length - * to become non-writable. - */ - if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - duk_harray *a; - a = (duk_harray *) obj; - DUK_DD(DUK_DDPRINT("Object.defineProperty() attribute update for duk_harray .length -> %02lx", (unsigned long) new_flags)); - DUK_ASSERT_HARRAY_VALID(a); - if ((new_flags & DUK_PROPDESC_FLAGS_EC) != (curr.flags & DUK_PROPDESC_FLAGS_EC)) { - DUK_D(DUK_DPRINT("Object.defineProperty() attempt to change virtual array .length enumerable or configurable attribute, fail")); - goto fail_virtual; - } - if (new_flags & DUK_PROPDESC_FLAG_WRITABLE) { - DUK_HARRAY_SET_LENGTH_WRITABLE(a); - } else { - DUK_HARRAY_SET_LENGTH_NONWRITABLE(a); - } - } - } - - if (has_set) { - duk_hobject *tmp; - - /* Virtual properties are non-configurable but with a 'force' - * flag we might come here so check explicitly for virtual. - */ - if (curr.e_idx < 0) { - goto fail_virtual; - } - - DUK_DDD(DUK_DDDPRINT("update existing property setter")); - DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); - - tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx); - DUK_UNREF(tmp); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, set); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, set); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */ - } - if (has_get) { - duk_hobject *tmp; - - if (curr.e_idx < 0) { - goto fail_virtual; - } - - DUK_DDD(DUK_DDDPRINT("update existing property getter")); - DUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); - - tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx); - DUK_UNREF(tmp); - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, get); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, get); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); /* side effects; may invalidate e_idx */ - } - if (has_value) { - duk_tval *tv1, *tv2; - - DUK_DDD(DUK_DDDPRINT("update existing property value")); - - if (curr.e_idx >= 0) { - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx)); - tv2 = duk_require_tval(thr, idx_value); - tv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects; may invalidate e_idx */ - } else { - DUK_ASSERT(curr.a_idx < 0); /* array part case handled comprehensively previously */ - - DUK_DD(DUK_DDPRINT("Object.defineProperty(), value update for virtual property")); - /* XXX: Uint8Array and other typed array virtual writes not currently - * handled. - */ - if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - duk_harray *a; - a = (duk_harray *) obj; - DUK_DD(DUK_DDPRINT("Object.defineProperty() value update for duk_harray .length -> %ld", (long) arrlen_new_len)); - DUK_ASSERT_HARRAY_VALID(a); - a->length = arrlen_new_len; - } else { - goto fail_virtual; /* should not happen */ - } - } - } - - /* - * Standard algorithm succeeded without errors, check for exotic post-behaviors. - * - * Arguments exotic behavior in E5 Section 10.6 occurs after the standard - * [[DefineOwnProperty]] has completed successfully. - * - * Array exotic behavior in E5 Section 15.4.5.1 is implemented partly - * prior to the default [[DefineOwnProperty]], but: - * - for an array index key (e.g. "10") the final 'length' update occurs here - * - for 'length' key the element deletion and 'length' update occurs here - */ - - success_exotics: - - /* curr.a_idx or curr.e_idx may have been invalidated by side effects - * above. - */ - - /* [obj key desc value get set curr_value] */ - - if (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) { - duk_harray *a; - - a = (duk_harray *) obj; - DUK_ASSERT_HARRAY_VALID(a); - - if (arridx_new_array_length > 0) { - /* - * Note: zero works as a "no update" marker because the new length - * can never be zero after a new property is written. - */ - - /* E5 Section 15.4.5.1, steps 4.e.i - 4.e.ii */ - - DUK_DDD(DUK_DDDPRINT("defineProperty successful, pending array length update to: %ld", - (long) arridx_new_array_length)); - - a->length = arridx_new_array_length; - } - - if (key == DUK_HTHREAD_STRING_LENGTH(thr) && arrlen_new_len < arrlen_old_len) { - /* - * E5 Section 15.4.5.1, steps 3.k - 3.n. The order at the end combines - * the error case 3.l.iii and the success case 3.m-3.n. - */ - - /* XXX: investigate whether write protect can be handled above, if we - * just update length here while ignoring its protected status - */ - - duk_uint32_t result_len; - duk_bool_t rc; - - DUK_DDD(DUK_DDDPRINT("defineProperty successful, key is 'length', exotic array behavior, " - "doing array element deletion and length update")); - - rc = duk__handle_put_array_length_smaller(thr, obj, arrlen_old_len, arrlen_new_len, force_flag, &result_len); - - /* update length (curr points to length, and we assume it's still valid) */ - DUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len); - - a->length = result_len; - - if (pending_write_protect) { - DUK_DDD(DUK_DDDPRINT("setting array length non-writable (pending writability update)")); - DUK_HARRAY_SET_LENGTH_NONWRITABLE(a); - } - - /* XXX: shrink array allocation or entries compaction here? */ - if (!rc) { - DUK_DD(DUK_DDPRINT("array length write only partially successful")); - goto fail_not_configurable; - } - } - } else if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) { - duk_hobject *map; - duk_hobject *varenv; - - DUK_ASSERT(arridx_new_array_length == 0); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)); /* traits are separate; in particular, arguments not an array */ - - map = NULL; - varenv = NULL; - if (!duk__lookup_arguments_map(thr, obj, key, &curr, &map, &varenv)) { - goto success_no_exotics; - } - DUK_ASSERT(map != NULL); - DUK_ASSERT(varenv != NULL); - - /* [obj key desc value get set curr_value varname] */ - - if (has_set || has_get) { - /* = IsAccessorDescriptor(Desc) */ - DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map' " - "changed to an accessor, delete arguments binding")); - - (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ - } else { - /* Note: this order matters (final value before deleting map entry must be done) */ - DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " - "check for value update / binding deletion")); - - if (has_value) { - duk_hstring *varname; - - DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " - "update bound value (variable/argument)")); - - varname = duk_require_hstring(thr, -1); - DUK_ASSERT(varname != NULL); - - DUK_DDD(DUK_DDDPRINT("arguments object automatic putvar for a bound variable; " - "key=%!O, varname=%!O, value=%!T", - (duk_heaphdr *) key, - (duk_heaphdr *) varname, - (duk_tval *) duk_require_tval(thr, idx_value))); - - /* strict flag for putvar comes from our caller (currently: fixed) */ - duk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, idx_value), 1 /*throw_flag*/); - } - if (has_writable && !is_writable) { - DUK_DDD(DUK_DDDPRINT("defineProperty successful, key mapped to arguments 'map', " - "changed to non-writable, delete arguments binding")); - - (void) duk_hobject_delprop_raw(thr, map, key, 0); /* ignore result */ - } - } - - /* 'varname' is in stack in this else branch, leaving an unbalanced stack below, - * but this doesn't matter now. - */ - } - - success_no_exotics: - /* Some code paths use NORZ macros for simplicity, ensure refzero - * handling is completed. - */ - DUK_REFZERO_CHECK_SLOW(thr); - return 1; - - fail_not_extensible: - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE); - } - return 0; - - fail_virtual: /* just use the same "not configurable" error message" */ - fail_not_configurable: - if (throw_flag) { - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); - } - return 0; -} - -/* - * Object.prototype.hasOwnProperty() and Object.prototype.propertyIsEnumerable(). - */ - -DUK_INTERNAL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags) { - duk_hstring *h_v; - duk_hobject *h_obj; - duk_propdesc desc; - duk_bool_t ret; - - /* coercion order matters */ - h_v = duk_to_hstring_acceptsymbol(thr, 0); - DUK_ASSERT(h_v != NULL); - - h_obj = duk_push_this_coercible_to_object(thr); - DUK_ASSERT(h_obj != NULL); - - ret = duk_hobject_get_own_propdesc(thr, h_obj, h_v, &desc, 0 /*flags*/); /* don't push value */ - - duk_push_boolean(thr, ret && ((desc.flags & required_desc_flags) == required_desc_flags)); - return 1; -} - -/* - * Object.seal() and Object.freeze() (E5 Sections 15.2.3.8 and 15.2.3.9) - * - * Since the algorithms are similar, a helper provides both functions. - * Freezing is essentially sealing + making plain properties non-writable. - * - * Note: virtual (non-concrete) properties which are non-configurable but - * writable would pose some problems, but such properties do not currently - * exist (all virtual properties are non-configurable and non-writable). - * If they did exist, the non-configurability does NOT prevent them from - * becoming non-writable. However, this change should be recorded somehow - * so that it would turn up (e.g. when getting the property descriptor), - * requiring some additional flags in the object. - */ - -DUK_INTERNAL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze) { - duk_uint_fast32_t i; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(obj != NULL); - - DUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE); - -#if defined(DUK_USE_ROM_OBJECTS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) { - DUK_DD(DUK_DDPRINT("attempt to seal/freeze a readonly object, reject")); - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE); - } -#endif - - /* - * Abandon array part because all properties must become non-configurable. - * Note that this is now done regardless of whether this is always the case - * (skips check, but performance problem if caller would do this many times - * for the same object; not likely). - */ - - duk__abandon_array_checked(thr, obj); - DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) == 0); - - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - duk_uint8_t *fp; - - /* since duk__abandon_array_checked() causes a resize, there should be no gaps in keys */ - DUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != NULL); - - /* avoid multiple computations of flags address; bypasses macros */ - fp = DUK_HOBJECT_E_GET_FLAGS_PTR(thr->heap, obj, i); - if (is_freeze && !((*fp) & DUK_PROPDESC_FLAG_ACCESSOR)) { - *fp &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE); - } else { - *fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE; - } - } - - DUK_HOBJECT_CLEAR_EXTENSIBLE(obj); - - /* no need to compact since we already did that in duk__abandon_array_checked() - * (regardless of whether an array part existed or not. - */ - - return; -} - -/* - * Object.isSealed() and Object.isFrozen() (E5 Sections 15.2.3.11, 15.2.3.13) - * - * Since the algorithms are similar, a helper provides both functions. - * Freezing is essentially sealing + making plain properties non-writable. - * - * Note: all virtual (non-concrete) properties are currently non-configurable - * and non-writable (and there are no accessor virtual properties), so they don't - * need to be considered here now. - */ - -DUK_INTERNAL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen) { - duk_uint_fast32_t i; - - DUK_ASSERT(obj != NULL); - DUK_UNREF(thr); - - /* Note: no allocation pressure, no need to check refcounts etc */ - - /* must not be extensible */ - if (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) { - return 0; - } - - /* all virtual properties are non-configurable and non-writable */ - - /* entry part must not contain any configurable properties, or - * writable properties (if is_frozen). - */ - for (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) { - duk_small_uint_t flags; - - if (!DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i)) { - continue; - } - - /* avoid multiple computations of flags address; bypasses macros */ - flags = (duk_small_uint_t) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i); - - if (flags & DUK_PROPDESC_FLAG_CONFIGURABLE) { - return 0; - } - if (is_frozen && - !(flags & DUK_PROPDESC_FLAG_ACCESSOR) && - (flags & DUK_PROPDESC_FLAG_WRITABLE)) { - return 0; - } - } - - /* array part must not contain any non-unused properties, as they would - * be configurable and writable. - */ - for (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) { - duk_tval *tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i); - if (!DUK_TVAL_IS_UNUSED(tv)) { - return 0; - } - } - - return 1; -} - -/* - * Object.preventExtensions() and Object.isExtensible() (E5 Sections 15.2.3.10, 15.2.3.13) - * - * Not needed, implemented by macros DUK_HOBJECT_{HAS,CLEAR,SET}_EXTENSIBLE - * and the Object built-in bindings. - */ - -/* automatic undefs */ -#undef DUK__HASH_DELETED -#undef DUK__HASH_UNUSED -#undef DUK__NO_ARRAY_INDEX -#undef DUK__VALSTACK_PROXY_LOOKUP -#undef DUK__VALSTACK_SPACE -#line 1 "duk_hstring_misc.c" -/* - * Misc support functions - */ - -/* #include duk_internal.h -> already included */ - -/* - * duk_hstring charCodeAt, with and without surrogate awareness - */ - -DUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware) { - duk_uint32_t boff; - const duk_uint8_t *p, *p_start, *p_end; - duk_ucodepoint_t cp1; - duk_ucodepoint_t cp2; - - /* Caller must check character offset to be inside the string. */ - DUK_ASSERT(thr != NULL); - DUK_ASSERT(h != NULL); - DUK_ASSERT_DISABLE(pos >= 0); /* unsigned */ - DUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h)); - - boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos); - DUK_DDD(DUK_DDDPRINT("charCodeAt: pos=%ld -> boff=%ld, str=%!O", - (long) pos, (long) boff, (duk_heaphdr *) h)); - DUK_ASSERT_DISABLE(boff >= 0); - DUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h)); - - p_start = DUK_HSTRING_GET_DATA(h); - p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); - p = p_start + boff; - DUK_DDD(DUK_DDDPRINT("p_start=%p, p_end=%p, p=%p", - (const void *) p_start, (const void *) p_end, - (const void *) p)); - - /* For invalid UTF-8 (never happens for standard Ecmascript strings) - * return U+FFFD replacement character. - */ - if (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp1)) { - if (surrogate_aware && cp1 >= 0xd800UL && cp1 <= 0xdbffUL) { - /* The decode helper is memory safe even if 'cp1' was - * decoded at the end of the string and 'p' is no longer - * within string memory range. - */ - cp2 = 0; /* If call fails, this is left untouched and won't match cp2 check. */ - (void) duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp2); - if (cp2 >= 0xdc00UL && cp2 <= 0xdfffUL) { - cp1 = (duk_ucodepoint_t) (((cp1 - 0xd800UL) << 10) + (cp2 - 0xdc00UL) + 0x10000UL); - } - } - } else { - cp1 = DUK_UNICODE_CP_REPLACEMENT_CHARACTER; - } - - return cp1; -} - -/* - * duk_hstring charlen, when lazy charlen disabled - */ - -#if !defined(DUK_USE_HSTRING_LAZY_CLEN) -#if !defined(DUK_USE_HSTRING_CLEN) -#error non-lazy duk_hstring charlen but DUK_USE_HSTRING_CLEN not set -#endif -DUK_INTERNAL void duk_hstring_init_charlen(duk_hstring *h) { - duk_uint32_t clen; - - DUK_ASSERT(h != NULL); - DUK_ASSERT(!DUK_HSTRING_HAS_ASCII(h)); - DUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)); - - clen = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); -#if defined(DUK_USE_STRLEN16) - DUK_ASSERT(clen <= 0xffffUL); /* Bytelength checked during interning. */ - h->clen16 = (duk_uint16_t) clen; -#else - h->clen = (duk_uint32_t) clen; -#endif - if (DUK_LIKELY(clen == DUK_HSTRING_GET_BYTELEN(h))) { - DUK_HSTRING_SET_ASCII(h); - } -} - -DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { -#if defined(DUK_USE_STRLEN16) - return h->clen16; -#else - return h->clen; -#endif -} -#endif /* !DUK_USE_HSTRING_LAZY_CLEN */ - -/* - * duk_hstring charlen, when lazy charlen enabled - */ - -#if defined(DUK_USE_HSTRING_LAZY_CLEN) -#if defined(DUK_USE_HSTRING_CLEN) -DUK_LOCAL DUK_COLD duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) { - duk_size_t res; - - DUK_ASSERT(h->clen == 0); /* Checked by caller. */ - -#if defined(DUK_USE_ROM_STRINGS) - /* ROM strings have precomputed clen, but if the computed clen is zero - * we can still come here and can't write anything. - */ - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { - return 0; - } -#endif - - res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); -#if defined(DUK_USE_STRLEN16) - DUK_ASSERT(res <= 0xffffUL); /* Bytelength checked during interning. */ - h->clen16 = (duk_uint16_t) res; -#else - h->clen = (duk_uint32_t) res; -#endif - if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) { - DUK_HSTRING_SET_ASCII(h); - } - return res; -} -#else /* DUK_USE_HSTRING_CLEN */ -DUK_LOCAL duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) { - if (DUK_LIKELY(DUK_HSTRING_HAS_ASCII(h))) { - /* Most practical strings will go here. */ - return DUK_HSTRING_GET_BYTELEN(h); - } else { - /* ASCII flag is lazy, so set it here. */ - duk_size_t res; - - /* XXX: here we could use the strcache to speed up the - * computation (matters for 'i < str.length' loops). - */ - - res = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); - -#if defined(DUK_USE_ROM_STRINGS) - if (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { - /* For ROM strings, can't write anything; ASCII flag - * is preset so we don't need to update it. - */ - return res; - } -#endif - if (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) { - DUK_HSTRING_SET_ASCII(h); - } - return res; - } -} -#endif /* DUK_USE_HSTRING_CLEN */ - -#if defined(DUK_USE_HSTRING_CLEN) -DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { -#if defined(DUK_USE_STRLEN16) - if (DUK_LIKELY(h->clen16 != 0)) { - return h->clen16; - } -#else - if (DUK_LIKELY(h->clen != 0)) { - return h->clen; - } -#endif - return duk__hstring_get_charlen_slowpath(h); -} -#else /* DUK_USE_HSTRING_CLEN */ -DUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) { - /* Always use slow path. */ - return duk__hstring_get_charlen_slowpath(h); -} -#endif /* DUK_USE_HSTRING_CLEN */ -#endif /* DUK_USE_HSTRING_LAZY_CLEN */ - -/* - * Compare duk_hstring to an ASCII cstring. - */ - -DUK_INTERNAL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr) { - duk_size_t len; - - DUK_ASSERT(h != NULL); - DUK_ASSERT(cstr != NULL); - - len = DUK_STRLEN(cstr); - if (len != DUK_HSTRING_GET_BYTELEN(h)) { - return 0; - } - if (DUK_MEMCMP((const void *) cstr, (const void *) DUK_HSTRING_GET_DATA(h), len) == 0) { - return 1; - } - return 0; -} -#line 1 "duk_hthread_alloc.c" -/* - * duk_hthread allocation and freeing. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Allocate initial stacks for a thread. Note that 'thr' must be reachable - * as a garbage collection may be triggered by the allocation attempts. - * Returns zero (without leaking memory) if init fails. - */ - -DUK_INTERNAL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr) { - duk_size_t alloc_size; - duk_size_t i; - - DUK_ASSERT(heap != NULL); - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->valstack == NULL); - DUK_ASSERT(thr->valstack_end == NULL); - DUK_ASSERT(thr->valstack_alloc_end == NULL); - DUK_ASSERT(thr->valstack_bottom == NULL); - DUK_ASSERT(thr->valstack_top == NULL); - DUK_ASSERT(thr->callstack_curr == NULL); - - /* valstack */ - DUK_ASSERT(DUK_VALSTACK_API_ENTRY_MINIMUM <= DUK_VALSTACK_INITIAL_SIZE); - alloc_size = sizeof(duk_tval) * DUK_VALSTACK_INITIAL_SIZE; - thr->valstack = (duk_tval *) DUK_ALLOC(heap, alloc_size); - if (!thr->valstack) { - goto fail; - } - DUK_MEMZERO(thr->valstack, alloc_size); - thr->valstack_end = thr->valstack + DUK_VALSTACK_API_ENTRY_MINIMUM; - thr->valstack_alloc_end = thr->valstack + DUK_VALSTACK_INITIAL_SIZE; - thr->valstack_bottom = thr->valstack; - thr->valstack_top = thr->valstack; - - for (i = 0; i < DUK_VALSTACK_INITIAL_SIZE; i++) { - DUK_TVAL_SET_UNDEFINED(&thr->valstack[i]); - } - - return 1; - - fail: - DUK_FREE(heap, thr->valstack); - DUK_ASSERT(thr->callstack_curr == NULL); - - thr->valstack = NULL; - return 0; -} - -/* For indirect allocs. */ - -DUK_INTERNAL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud) { - duk_hthread *thr = (duk_hthread *) ud; - DUK_UNREF(heap); - return (void *) thr->valstack; -} -#line 1 "duk_hthread_builtins.c" -/* - * Initialize built-in objects. Current thread must have a valstack - * and initialization errors may longjmp, so a setjmp() catch point - * must exist. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Encoding constants, must match genbuiltins.py - */ - -#define DUK__PROP_FLAGS_BITS 3 -#define DUK__LENGTH_PROP_BITS 3 -#define DUK__NARGS_BITS 3 -#define DUK__PROP_TYPE_BITS 3 - -#define DUK__NARGS_VARARGS_MARKER 0x07 - -#define DUK__PROP_TYPE_DOUBLE 0 -#define DUK__PROP_TYPE_STRING 1 -#define DUK__PROP_TYPE_STRIDX 2 -#define DUK__PROP_TYPE_BUILTIN 3 -#define DUK__PROP_TYPE_UNDEFINED 4 -#define DUK__PROP_TYPE_BOOLEAN_TRUE 5 -#define DUK__PROP_TYPE_BOOLEAN_FALSE 6 -#define DUK__PROP_TYPE_ACCESSOR 7 - -/* - * Create built-in objects by parsing an init bitstream generated - * by genbuiltins.py. - */ - -#if defined(DUK_USE_ROM_OBJECTS) -#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT) -DUK_LOCAL void duk__duplicate_ram_global_object(duk_hthread *thr) { - duk_hobject *h_global; -#if defined(DUK_USE_ROM_GLOBAL_CLONE) - duk_hobject *h_oldglobal; - duk_uint8_t *props; - duk_size_t alloc_size; -#endif - duk_hobject *h_objenv; - - /* XXX: refactor into internal helper, duk_clone_hobject() */ - -#if defined(DUK_USE_ROM_GLOBAL_INHERIT) - /* Inherit from ROM-based global object: less RAM usage, less transparent. */ - h_global = duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL), - DUK_BIDX_GLOBAL); - DUK_ASSERT(h_global != NULL); -#elif defined(DUK_USE_ROM_GLOBAL_CLONE) - /* Clone the properties of the ROM-based global object to create a - * fully RAM-based global object. Uses more memory than the inherit - * model but more compliant. - */ - h_global = duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL), - DUK_BIDX_OBJECT_PROTOTYPE); - DUK_ASSERT(h_global != NULL); - h_oldglobal = thr->builtins[DUK_BIDX_GLOBAL]; - DUK_ASSERT(h_oldglobal != NULL); - - /* Copy the property table verbatim; this handles attributes etc. - * For ROM objects it's not necessary (or possible) to update - * refcounts so leave them as is. - */ - alloc_size = DUK_HOBJECT_P_ALLOC_SIZE(h_oldglobal); - DUK_ASSERT(alloc_size > 0); - props = DUK_ALLOC_CHECKED(thr, alloc_size); - DUK_ASSERT(props != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal) != NULL); - DUK_MEMCPY((void *) props, (const void *) DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal), alloc_size); - - /* XXX: keep property attributes or tweak them here? - * Properties will now be non-configurable even when they're - * normally configurable for the global object. - */ - - DUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_global) == NULL); - DUK_HOBJECT_SET_PROPS(thr->heap, h_global, props); - DUK_HOBJECT_SET_ESIZE(h_global, DUK_HOBJECT_GET_ESIZE(h_oldglobal)); - DUK_HOBJECT_SET_ENEXT(h_global, DUK_HOBJECT_GET_ENEXT(h_oldglobal)); - DUK_HOBJECT_SET_ASIZE(h_global, DUK_HOBJECT_GET_ASIZE(h_oldglobal)); - DUK_HOBJECT_SET_HSIZE(h_global, DUK_HOBJECT_GET_HSIZE(h_oldglobal)); -#else -#error internal error in config defines -#endif - - duk_hobject_compact_props(thr, h_global); - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); - DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL])); /* no need to decref: ROM object */ - thr->builtins[DUK_BIDX_GLOBAL] = h_global; - DUK_HOBJECT_INCREF(thr, h_global); - DUK_D(DUK_DPRINT("duplicated global object: %!O", h_global)); - - /* Create a fresh object environment for the global scope. This is - * needed so that the global scope points to the newly created RAM-based - * global object. - */ - h_objenv = (duk_hobject *) duk_hobjenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); - DUK_ASSERT(h_objenv != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_objenv) == NULL); - duk_push_hobject(thr, h_objenv); - - DUK_ASSERT(h_global != NULL); - ((duk_hobjenv *) h_objenv)->target = h_global; - DUK_HOBJECT_INCREF(thr, h_global); - DUK_ASSERT(((duk_hobjenv *) h_objenv)->has_this == 0); - - DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL); - DUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL_ENV])); /* no need to decref: ROM object */ - thr->builtins[DUK_BIDX_GLOBAL_ENV] = h_objenv; - DUK_HOBJECT_INCREF(thr, h_objenv); - DUK_D(DUK_DPRINT("duplicated global env: %!O", h_objenv)); - - DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) h_objenv); - - duk_pop_2(thr); /* Pop global object and global env. */ -} -#endif /* DUK_USE_ROM_GLOBAL_CLONE || DUK_USE_ROM_GLOBAL_INHERIT */ - -DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) { - /* Setup builtins from ROM objects. All heaps/threads will share - * the same readonly objects. - */ - duk_small_uint_t i; - - for (i = 0; i < DUK_NUM_BUILTINS; i++) { - duk_hobject *h; - h = (duk_hobject *) DUK_LOSE_CONST(duk_rom_builtins_bidx[i]); - DUK_ASSERT(h != NULL); - thr->builtins[i] = h; - } - -#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT) - /* By default the global object is read-only which is often much - * more of an issue than having read-only built-in objects (like - * RegExp, Date, etc). Use a RAM-based copy of the global object - * and the global environment object for convenience. - */ - duk__duplicate_ram_global_object(thr); -#endif -} -#else /* DUK_USE_ROM_OBJECTS */ -DUK_LOCAL void duk__push_stridx(duk_hthread *thr, duk_bitdecoder_ctx *bd) { - duk_small_uint_t n; - - n = (duk_small_uint_t) duk_bd_decode_varuint(bd); - DUK_ASSERT_DISABLE(n >= 0); /* unsigned */ - DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS); - duk_push_hstring_stridx(thr, n); -} -DUK_LOCAL void duk__push_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) { - /* XXX: built-ins data could provide a maximum length that is - * actually needed; bitpacked max length is now 256 bytes. - */ - duk_uint8_t tmp[DUK_BD_BITPACKED_STRING_MAXLEN]; - duk_small_uint_t len; - - len = duk_bd_decode_bitpacked_string(bd, tmp); - duk_push_lstring(thr, (const char *) tmp, (duk_size_t) len); -} -DUK_LOCAL void duk__push_stridx_or_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) { - duk_small_uint_t n; - - n = (duk_small_uint_t) duk_bd_decode_varuint(bd); - if (n == 0) { - duk__push_string(thr, bd); - } else { - n--; - DUK_ASSERT(n < DUK_HEAP_NUM_STRINGS); - duk_push_hstring_stridx(thr, n); - } -} -DUK_LOCAL void duk__push_double(duk_hthread *thr, duk_bitdecoder_ctx *bd) { - duk_double_union du; - duk_small_uint_t i; - - for (i = 0; i < 8; i++) { - /* Encoding endianness must match target memory layout, - * build scripts and genbuiltins.py must ensure this. - */ - du.uc[i] = (duk_uint8_t) duk_bd_decode(bd, 8); - } - - duk_push_number(thr, du.d); /* push operation normalizes NaNs */ -} - -DUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) { - duk_bitdecoder_ctx bd_ctx; - duk_bitdecoder_ctx *bd = &bd_ctx; /* convenience */ - duk_hobject *h; - duk_small_uint_t i, j; - - DUK_D(DUK_DPRINT("INITBUILTINS BEGIN: DUK_NUM_BUILTINS=%d, DUK_NUM_BUILTINS_ALL=%d", (int) DUK_NUM_BUILTINS, (int) DUK_NUM_ALL_BUILTINS)); - - DUK_MEMZERO(&bd_ctx, sizeof(bd_ctx)); - bd->data = (const duk_uint8_t *) duk_builtins_data; - bd->length = (duk_size_t) DUK_BUILTINS_DATA_LENGTH; - - /* - * First create all built-in bare objects on the empty valstack. - * - * Built-ins in the index range [0,DUK_NUM_BUILTINS-1] have value - * stack indices matching their eventual thr->builtins[] index. - * - * Built-ins in the index range [DUK_NUM_BUILTINS,DUK_NUM_ALL_BUILTINS] - * will exist on the value stack during init but won't be placed - * into thr->builtins[]. These are objects referenced in some way - * from thr->builtins[] roots but which don't need to be indexed by - * Duktape through thr->builtins[] (e.g. user custom objects). - * - * Internal prototypes will be incorrect (NULL) at this stage. - */ - - duk_require_stack(thr, DUK_NUM_ALL_BUILTINS); - - DUK_DD(DUK_DDPRINT("create empty built-ins")); - DUK_ASSERT_TOP(thr, 0); - for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { - duk_small_uint_t class_num; - duk_small_int_t len = -1; /* must be signed */ - - class_num = (duk_small_uint_t) duk_bd_decode_varuint(bd); - len = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__LENGTH_PROP_BITS, (duk_int32_t) -1 /*def_value*/); - - if (class_num == DUK_HOBJECT_CLASS_FUNCTION) { - duk_small_uint_t natidx; - duk_small_int_t c_nargs; /* must hold DUK_VARARGS */ - duk_c_function c_func; - duk_int16_t magic; - - DUK_DDD(DUK_DDDPRINT("len=%ld", (long) len)); - DUK_ASSERT(len >= 0); - - natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); - DUK_ASSERT(natidx != 0); - c_func = duk_bi_native_functions[natidx]; - DUK_ASSERT(c_func != NULL); - - c_nargs = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__NARGS_BITS, len /*def_value*/); - if (c_nargs == DUK__NARGS_VARARGS_MARKER) { - c_nargs = DUK_VARARGS; - } - - /* XXX: set magic directly here? (it could share the c_nargs arg) */ - (void) duk_push_c_function_builtin(thr, c_func, c_nargs); - h = duk_known_hobject(thr, -1); - - /* Currently all built-in native functions are strict. - * duk_push_c_function() now sets strict flag, so - * assert for it. - */ - DUK_ASSERT(DUK_HOBJECT_HAS_STRICT(h)); - - /* XXX: function properties */ - - duk__push_stridx_or_string(thr, bd); -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - duk_xdef_prop_stridx_short(thr, - -2, - DUK_STRIDX_NAME, - DUK_PROPDESC_FLAGS_C); -#else - duk_pop(thr); /* Not very ideal but good enough for now. */ -#endif - - /* Almost all global level Function objects are constructable - * but not all: Function.prototype is a non-constructable, - * callable Function. - */ - if (duk_bd_decode_flag(bd)) { - DUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE(h)); - } else { - DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h); - } - - /* Cast converts magic to 16-bit signed value */ - magic = (duk_int16_t) duk_bd_decode_varuint(bd); - ((duk_hnatfunc *) h)->magic = magic; - } else if (class_num == DUK_HOBJECT_CLASS_ARRAY) { - duk_push_array(thr); - } else if (class_num == DUK_HOBJECT_CLASS_OBJENV) { - duk_hobjenv *env; - duk_hobject *global; - - DUK_ASSERT(i == DUK_BIDX_GLOBAL_ENV); - DUK_ASSERT(DUK_BIDX_GLOBAL_ENV > DUK_BIDX_GLOBAL); - - env = duk_hobjenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); - DUK_ASSERT(env->target == NULL); - duk_push_hobject(thr, (duk_hobject *) env); - - global = duk_known_hobject(thr, DUK_BIDX_GLOBAL); - DUK_ASSERT(global != NULL); - env->target = global; - DUK_HOBJECT_INCREF(thr, global); - DUK_ASSERT(env->has_this == 0); - - DUK_ASSERT_HOBJENV_VALID(env); - } else { - DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_DECENV); - - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_EXTENSIBLE, - -1); /* no prototype or class yet */ - - } - - h = duk_known_hobject(thr, -1); - DUK_HOBJECT_SET_CLASS_NUMBER(h, class_num); - - if (i < DUK_NUM_BUILTINS) { - thr->builtins[i] = h; - DUK_HOBJECT_INCREF(thr, &h->hdr); - } - - if (len >= 0) { - /* In ES2015+ built-in function object .length property - * has property attributes C (configurable only): - * http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-standard-built-in-objects - * - * Array.prototype remains an Array instance in ES2015+ - * and its length has attributes W (writable only). - * Because .length is now virtual for duk_harray, it is - * not encoded explicitly in init data. - */ - - DUK_ASSERT(class_num != DUK_HOBJECT_CLASS_ARRAY); /* .length is virtual */ - duk_push_int(thr, len); - duk_xdef_prop_stridx_short(thr, - -2, - DUK_STRIDX_LENGTH, - DUK_PROPDESC_FLAGS_C); - } - - /* enable exotic behaviors last */ - - if (class_num == DUK_HOBJECT_CLASS_ARRAY) { - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)); /* set by duk_push_array() */ - } - if (class_num == DUK_HOBJECT_CLASS_STRING) { - DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h); - } - - /* some assertions */ - - DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h)); - /* DUK_HOBJECT_FLAG_CONSTRUCTABLE varies */ - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(h)); - DUK_ASSERT(!DUK_HOBJECT_HAS_COMPFUNC(h)); - /* DUK_HOBJECT_FLAG_NATFUNC varies */ - DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(h)); - DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(h) || class_num == DUK_HOBJECT_CLASS_ARRAY); - /* DUK_HOBJECT_FLAG_STRICT varies */ - DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(h) || /* all native functions have NEWENV */ - DUK_HOBJECT_HAS_NEWENV(h)); - DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(h)); - DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(h)); - /* DUK_HOBJECT_FLAG_EXOTIC_ARRAY varies */ - /* DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ varies */ - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)); - - DUK_DDD(DUK_DDDPRINT("created built-in %ld, class=%ld, length=%ld", (long) i, (long) class_num, (long) len)); - } - - /* - * Then decode the builtins init data (see genbuiltins.py) to - * init objects. Internal prototypes are set at this stage, - * with thr->builtins[] populated. - */ - - DUK_DD(DUK_DDPRINT("initialize built-in object properties")); - for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { - duk_small_uint_t t; - duk_small_uint_t num; - - DUK_DDD(DUK_DDDPRINT("initializing built-in object at index %ld", (long) i)); - h = duk_known_hobject(thr, (duk_idx_t) i); - - t = (duk_small_uint_t) duk_bd_decode_varuint(bd); - if (t > 0) { - t--; - DUK_DDD(DUK_DDDPRINT("set internal prototype: built-in %ld", (long) t)); - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, duk_known_hobject(thr, (duk_idx_t) t)); - } else if (DUK_HOBJECT_IS_NATFUNC(h)) { - /* Standard native built-ins cannot inherit from - * %NativeFunctionPrototype%, they are required to - * inherit from Function.prototype directly. - */ - DUK_ASSERT(thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE] != NULL); - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - } - - t = (duk_small_uint_t) duk_bd_decode_varuint(bd); - if (t > 0) { - /* 'prototype' property for all built-in objects (which have it) has attributes: - * [[Writable]] = false, - * [[Enumerable]] = false, - * [[Configurable]] = false - */ - t--; - DUK_DDD(DUK_DDDPRINT("set external prototype: built-in %ld", (long) t)); - duk_dup(thr, (duk_idx_t) t); - duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_NONE); - } - - t = (duk_small_uint_t) duk_bd_decode_varuint(bd); - if (t > 0) { - /* 'constructor' property for all built-in objects (which have it) has attributes: - * [[Writable]] = true, - * [[Enumerable]] = false, - * [[Configurable]] = true - */ - t--; - DUK_DDD(DUK_DDDPRINT("set external constructor: built-in %ld", (long) t)); - duk_dup(thr, (duk_idx_t) t); - duk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); - } - - /* normal valued properties */ - num = (duk_small_uint_t) duk_bd_decode_varuint(bd); - DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld normal valued properties", (long) i, (long) num)); - for (j = 0; j < num; j++) { - duk_small_uint_t defprop_flags; - - duk__push_stridx_or_string(thr, bd); - - /* - * Property attribute defaults are defined in E5 Section 15 (first - * few pages); there is a default for all properties and a special - * default for 'length' properties. Variation from the defaults is - * signaled using a single flag bit in the bitstream. - */ - - if (duk_bd_decode_flag(bd)) { - defprop_flags = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_FLAGS_BITS); - } else { - defprop_flags = DUK_PROPDESC_FLAGS_WC; - } - defprop_flags |= DUK_DEFPROP_FORCE | - DUK_DEFPROP_HAVE_VALUE | - DUK_DEFPROP_HAVE_WRITABLE | - DUK_DEFPROP_HAVE_ENUMERABLE | - DUK_DEFPROP_HAVE_CONFIGURABLE; /* Defaults for data properties. */ - - /* The writable, enumerable, configurable flags in prop_flags - * match both duk_def_prop() and internal property flags. - */ - DUK_ASSERT(DUK_PROPDESC_FLAG_WRITABLE == DUK_DEFPROP_WRITABLE); - DUK_ASSERT(DUK_PROPDESC_FLAG_ENUMERABLE == DUK_DEFPROP_ENUMERABLE); - DUK_ASSERT(DUK_PROPDESC_FLAG_CONFIGURABLE == DUK_DEFPROP_CONFIGURABLE); - - t = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_TYPE_BITS); - - DUK_DDD(DUK_DDDPRINT("built-in %ld, normal-valued property %ld, key %!T, flags 0x%02lx, type %ld", - (long) i, (long) j, duk_get_tval(thr, -1), (unsigned long) defprop_flags, (long) t)); - - switch (t) { - case DUK__PROP_TYPE_DOUBLE: { - duk__push_double(thr, bd); - break; - } - case DUK__PROP_TYPE_STRING: { - duk__push_string(thr, bd); - break; - } - case DUK__PROP_TYPE_STRIDX: { - duk__push_stridx(thr, bd); - break; - } - case DUK__PROP_TYPE_BUILTIN: { - duk_small_uint_t bidx; - - bidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); - duk_dup(thr, (duk_idx_t) bidx); - break; - } - case DUK__PROP_TYPE_UNDEFINED: { - duk_push_undefined(thr); - break; - } - case DUK__PROP_TYPE_BOOLEAN_TRUE: { - duk_push_true(thr); - break; - } - case DUK__PROP_TYPE_BOOLEAN_FALSE: { - duk_push_false(thr); - break; - } - case DUK__PROP_TYPE_ACCESSOR: { - duk_small_uint_t natidx_getter = (duk_small_uint_t) duk_bd_decode_varuint(bd); - duk_small_uint_t natidx_setter = (duk_small_uint_t) duk_bd_decode_varuint(bd); - duk_small_uint_t accessor_magic = (duk_small_uint_t) duk_bd_decode_varuint(bd); - duk_c_function c_func_getter; - duk_c_function c_func_setter; - - DUK_DDD(DUK_DDDPRINT("built-in accessor property: objidx=%ld, key=%!T, getteridx=%ld, setteridx=%ld, flags=0x%04lx", - (long) i, duk_get_tval(thr, -1), (long) natidx_getter, (long) natidx_setter, (unsigned long) defprop_flags)); - - c_func_getter = duk_bi_native_functions[natidx_getter]; - if (c_func_getter != NULL) { - duk_push_c_function_builtin_noconstruct(thr, c_func_getter, 0); /* always 0 args */ - duk_set_magic(thr, -1, (duk_int_t) accessor_magic); - defprop_flags |= DUK_DEFPROP_HAVE_GETTER; - } - c_func_setter = duk_bi_native_functions[natidx_setter]; - if (c_func_setter != NULL) { - duk_push_c_function_builtin_noconstruct(thr, c_func_setter, 1); /* always 1 arg */ - duk_set_magic(thr, -1, (duk_int_t) accessor_magic); - defprop_flags |= DUK_DEFPROP_HAVE_SETTER; - } - - /* Writable flag doesn't make sense for an accessor. */ - DUK_ASSERT((defprop_flags & DUK_PROPDESC_FLAG_WRITABLE) == 0); /* genbuiltins.py ensures */ - - defprop_flags &= ~(DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE); - defprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE; - break; - } - default: { - /* exhaustive */ - DUK_UNREACHABLE(); - } - } - - duk_def_prop(thr, (duk_idx_t) i, defprop_flags); - DUK_ASSERT_TOP(thr, DUK_NUM_ALL_BUILTINS); - } - - /* native function properties */ - num = (duk_small_uint_t) duk_bd_decode_varuint(bd); - DUK_DDD(DUK_DDDPRINT("built-in object %ld, %ld function valued properties", (long) i, (long) num)); - for (j = 0; j < num; j++) { - duk_hstring *h_key; - duk_small_uint_t natidx; - duk_int_t c_nargs; /* must hold DUK_VARARGS */ - duk_small_uint_t c_length; - duk_int16_t magic; - duk_c_function c_func; - duk_hnatfunc *h_func; -#if defined(DUK_USE_LIGHTFUNC_BUILTINS) - duk_small_int_t lightfunc_eligible; -#endif - - duk__push_stridx_or_string(thr, bd); - h_key = duk_known_hstring(thr, -1); - DUK_UNREF(h_key); - natidx = (duk_small_uint_t) duk_bd_decode_varuint(bd); - - c_length = (duk_small_uint_t) duk_bd_decode(bd, DUK__LENGTH_PROP_BITS); - c_nargs = (duk_int_t) duk_bd_decode_flagged(bd, DUK__NARGS_BITS, (duk_uint32_t) c_length /*def_value*/); - if (c_nargs == DUK__NARGS_VARARGS_MARKER) { - c_nargs = DUK_VARARGS; - } - - c_func = duk_bi_native_functions[natidx]; - - DUK_DDD(DUK_DDDPRINT("built-in %ld, function-valued property %ld, key %!O, natidx %ld, length %ld, nargs %ld", - (long) i, (long) j, (duk_heaphdr *) h_key, (long) natidx, (long) c_length, - (c_nargs == DUK_VARARGS ? (long) -1 : (long) c_nargs))); - - /* Cast converts magic to 16-bit signed value */ - magic = (duk_int16_t) duk_bd_decode_varuint(bd); - -#if defined(DUK_USE_LIGHTFUNC_BUILTINS) - lightfunc_eligible = - ((c_nargs >= DUK_LFUNC_NARGS_MIN && c_nargs <= DUK_LFUNC_NARGS_MAX) || (c_nargs == DUK_VARARGS)) && - (c_length <= DUK_LFUNC_LENGTH_MAX) && - (magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX); - - /* These functions have trouble working as lightfuncs. - * Some of them have specific asserts and some may have - * additional properties (e.g. 'require.id' may be written). - */ - if (c_func == duk_bi_global_object_eval) { - lightfunc_eligible = 0; - } -#if defined(DUK_USE_COROUTINE_SUPPORT) - if (c_func == duk_bi_thread_yield || - c_func == duk_bi_thread_resume) { - lightfunc_eligible = 0; - } -#endif - if (c_func == duk_bi_function_prototype_call || - c_func == duk_bi_function_prototype_apply || - c_func == duk_bi_reflect_apply || - c_func == duk_bi_reflect_construct) { - lightfunc_eligible = 0; - } - - if (lightfunc_eligible) { - duk_tval tv_lfunc; - duk_small_uint_t lf_nargs = (duk_small_uint_t) (c_nargs == DUK_VARARGS ? DUK_LFUNC_NARGS_VARARGS : c_nargs); - duk_small_uint_t lf_flags = DUK_LFUNC_FLAGS_PACK(magic, c_length, lf_nargs); - DUK_TVAL_SET_LIGHTFUNC(&tv_lfunc, c_func, lf_flags); - duk_push_tval(thr, &tv_lfunc); - DUK_D(DUK_DPRINT("built-in function eligible as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld -> %!iT", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic, duk_get_tval(thr, -1))); - goto lightfunc_skip; - } - - DUK_D(DUK_DPRINT("built-in function NOT ELIGIBLE as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic)); -#endif /* DUK_USE_LIGHTFUNC_BUILTINS */ - - /* [ (builtin objects) name ] */ - - duk_push_c_function_builtin_noconstruct(thr, c_func, c_nargs); - h_func = duk_known_hnatfunc(thr, -1); - DUK_UNREF(h_func); - - /* XXX: add into init data? */ - - /* Special call handling, not described in init data. */ - if (c_func == duk_bi_global_object_eval || - c_func == duk_bi_function_prototype_call || - c_func == duk_bi_function_prototype_apply || - c_func == duk_bi_reflect_apply || - c_func == duk_bi_reflect_construct) { - DUK_HOBJECT_SET_SPECIAL_CALL((duk_hobject *) h_func); - } - - /* Currently all built-in native functions are strict. - * This doesn't matter for many functions, but e.g. - * String.prototype.charAt (and other string functions) - * rely on being strict so that their 'this' binding is - * not automatically coerced. - */ - DUK_HOBJECT_SET_STRICT((duk_hobject *) h_func); - - /* No built-in functions are constructable except the top - * level ones (Number, etc). - */ - DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_func)); - - /* XXX: any way to avoid decoding magic bit; there are quite - * many function properties and relatively few with magic values. - */ - h_func->magic = magic; - - /* [ (builtin objects) name func ] */ - - duk_push_uint(thr, c_length); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); - - duk_dup_m2(thr); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); - - /* XXX: other properties of function instances; 'arguments', 'caller'. */ - - DUK_DD(DUK_DDPRINT("built-in object %ld, function property %ld -> %!T", - (long) i, (long) j, (duk_tval *) duk_get_tval(thr, -1))); - - /* [ (builtin objects) name func ] */ - - /* - * The default property attributes are correct for all - * function valued properties of built-in objects now. - */ - -#if defined(DUK_USE_LIGHTFUNC_BUILTINS) - lightfunc_skip: -#endif - - /* XXX: So far all ES builtins are 'wc' but e.g. - * performance.now() should be 'wec'. - */ - duk_xdef_prop(thr, (duk_idx_t) i, DUK_PROPDESC_FLAGS_WC); - - /* [ (builtin objects) ] */ - } - } - - /* - * Special post-tweaks, for cases not covered by the init data format. - * - * - Set Date.prototype.toGMTString to Date.prototype.toUTCString. - * toGMTString is required to have the same Function object as - * toUTCString in E5 Section B.2.6. Note that while Smjs respects - * this, V8 does not (the Function objects are distinct). - * - * - Make DoubleError non-extensible. - * - * - Add info about most important effective compile options to Duktape. - * - * - Possibly remove some properties (values or methods) which are not - * desirable with current feature options but are not currently - * conditional in init data. - */ - -#if defined(DUK_USE_DATE_BUILTIN) - duk_get_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_UTC_STRING); - duk_xdef_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_GMT_STRING, DUK_PROPDESC_FLAGS_WC); -#endif - - h = duk_known_hobject(thr, DUK_BIDX_DOUBLE_ERROR); - DUK_HOBJECT_CLEAR_EXTENSIBLE(h); - -#if !defined(DUK_USE_ES6_OBJECT_PROTO_PROPERTY) - DUK_DD(DUK_DDPRINT("delete Object.prototype.__proto__ built-in which is not enabled in features")); - (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_PROTOTYPE], DUK_HTHREAD_STRING___PROTO__(thr), DUK_DELPROP_FLAG_THROW); -#endif - -#if !defined(DUK_USE_ES6_OBJECT_SETPROTOTYPEOF) - DUK_DD(DUK_DDPRINT("delete Object.setPrototypeOf built-in which is not enabled in features")); - (void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_CONSTRUCTOR], DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr), DUK_DELPROP_FLAG_THROW); -#endif - - /* XXX: relocate */ - duk_push_string(thr, - /* Endianness indicator */ -#if defined(DUK_USE_INTEGER_LE) - "l" -#elif defined(DUK_USE_INTEGER_BE) - "b" -#elif defined(DUK_USE_INTEGER_ME) /* integer mixed endian not really used now */ - "m" -#else - "?" -#endif -#if defined(DUK_USE_DOUBLE_LE) - "l" -#elif defined(DUK_USE_DOUBLE_BE) - "b" -#elif defined(DUK_USE_DOUBLE_ME) - "m" -#else - "?" -#endif - " " - /* Packed or unpacked tval */ -#if defined(DUK_USE_PACKED_TVAL) - "p" -#else - "u" -#endif -#if defined(DUK_USE_FASTINT) - "f" -#endif - " " - /* Low memory options */ -#if defined(DUK_USE_STRTAB_PTRCOMP) - "s" -#endif -#if !defined(DUK_USE_HEAPPTR16) && !defined(DUK_DATAPTR16) && !defined(DUK_FUNCPTR16) - "n" -#endif -#if defined(DUK_USE_HEAPPTR16) - "h" -#endif -#if defined(DUK_USE_DATAPTR16) - "d" -#endif -#if defined(DUK_USE_FUNCPTR16) - "f" -#endif -#if defined(DUK_USE_REFCOUNT16) - "R" -#endif -#if defined(DUK_USE_STRHASH16) - "H" -#endif -#if defined(DUK_USE_STRLEN16) - "S" -#endif -#if defined(DUK_USE_BUFLEN16) - "B" -#endif -#if defined(DUK_USE_OBJSIZES16) - "O" -#endif -#if defined(DUK_USE_LIGHTFUNC_BUILTINS) - "L" -#endif -#if defined(DUK_USE_ROM_STRINGS) || defined(DUK_USE_ROM_OBJECTS) - /* XXX: This won't be shown in practice now - * because this code is not run when builtins - * are in ROM. - */ - "Z" -#endif - " " - /* Object property allocation layout */ -#if defined(DUK_USE_HOBJECT_LAYOUT_1) - "p1" -#elif defined(DUK_USE_HOBJECT_LAYOUT_2) - "p2" -#elif defined(DUK_USE_HOBJECT_LAYOUT_3) - "p3" -#else - "p?" -#endif - " " - /* Alignment guarantee */ -#if (DUK_USE_ALIGN_BY == 4) - "a4" -#elif (DUK_USE_ALIGN_BY == 8) - "a8" -#elif (DUK_USE_ALIGN_BY == 1) - "a1" -#else -#error invalid DUK_USE_ALIGN_BY -#endif - " " - /* Architecture, OS, and compiler strings */ - DUK_USE_ARCH_STRING - " " - DUK_USE_OS_STRING - " " - DUK_USE_COMPILER_STRING); - duk_xdef_prop_stridx_short(thr, DUK_BIDX_DUKTAPE, DUK_STRIDX_ENV, DUK_PROPDESC_FLAGS_WC); - - /* - * Since built-ins are not often extended, compact them. - */ - - DUK_DD(DUK_DDPRINT("compact built-ins")); - for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { - duk_hobject_compact_props(thr, duk_known_hobject(thr, (duk_idx_t) i)); - } - - DUK_D(DUK_DPRINT("INITBUILTINS END")); - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1) - for (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) { - DUK_DD(DUK_DDPRINT("built-in object %ld after initialization and compacting: %!@iO", - (long) i, (duk_heaphdr *) duk_require_hobject(thr, i))); - } -#endif - - /* - * Pop built-ins from stack: they are now INCREF'd and - * reachable from the builtins[] array or indirectly - * through builtins[]. - */ - - duk_set_top(thr, 0); - DUK_ASSERT_TOP(thr, 0); -} -#endif /* DUK_USE_ROM_OBJECTS */ - -DUK_INTERNAL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to) { - duk_small_uint_t i; - - for (i = 0; i < DUK_NUM_BUILTINS; i++) { - thr_to->builtins[i] = thr_from->builtins[i]; - DUK_HOBJECT_INCREF_ALLOWNULL(thr_to, thr_to->builtins[i]); /* side effect free */ - } -} - -/* automatic undefs */ -#undef DUK__LENGTH_PROP_BITS -#undef DUK__NARGS_BITS -#undef DUK__NARGS_VARARGS_MARKER -#undef DUK__PROP_FLAGS_BITS -#undef DUK__PROP_TYPE_ACCESSOR -#undef DUK__PROP_TYPE_BITS -#undef DUK__PROP_TYPE_BOOLEAN_FALSE -#undef DUK__PROP_TYPE_BOOLEAN_TRUE -#undef DUK__PROP_TYPE_BUILTIN -#undef DUK__PROP_TYPE_DOUBLE -#undef DUK__PROP_TYPE_STRIDX -#undef DUK__PROP_TYPE_STRING -#undef DUK__PROP_TYPE_UNDEFINED -#line 1 "duk_hthread_misc.c" -/* - * Thread support. - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL void duk_hthread_terminate(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - - while (thr->callstack_curr != NULL) { - duk_hthread_activation_unwind_norz(thr); - } - - thr->valstack_bottom = thr->valstack; - duk_set_top(thr, 0); /* unwinds valstack, updating refcounts */ - - thr->state = DUK_HTHREAD_STATE_TERMINATED; - - /* Here we could remove references to built-ins, but it may not be - * worth the effort because built-ins are quite likely to be shared - * with another (unterminated) thread, and terminated threads are also - * usually garbage collected quite quickly. - * - * We could also shrink the value stack here, but that also may not - * be worth the effort for the same reason. - */ - - DUK_REFZERO_CHECK_SLOW(thr); -} - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act) { - duk_instr_t *bcode; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_UNREF(thr); - - /* XXX: store 'bcode' pointer to activation for faster lookup? */ - if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) { - bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func)); - return (duk_uint_fast32_t) (act->curr_pc - bcode); - } - return 0; -} -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -DUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act) { - duk_instr_t *bcode; - duk_uint_fast32_t ret; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_UNREF(thr); - - if (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) { - bcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func)); - ret = (duk_uint_fast32_t) (act->curr_pc - bcode); - if (ret > 0) { - ret--; - } - return ret; - } - return 0; -} - -/* Write bytecode executor's curr_pc back to topmost activation (if any). */ -DUK_INTERNAL void duk_hthread_sync_currpc(duk_hthread *thr) { - duk_activation *act; - - DUK_ASSERT(thr != NULL); - - if (thr->ptr_curr_pc != NULL) { - /* ptr_curr_pc != NULL only when bytecode executor is active. */ - DUK_ASSERT(thr->callstack_top > 0); - DUK_ASSERT(thr->callstack_curr != NULL); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - act->curr_pc = *thr->ptr_curr_pc; - } -} - -DUK_INTERNAL void duk_hthread_sync_and_null_currpc(duk_hthread *thr) { - duk_activation *act; - - DUK_ASSERT(thr != NULL); - - if (thr->ptr_curr_pc != NULL) { - /* ptr_curr_pc != NULL only when bytecode executor is active. */ - DUK_ASSERT(thr->callstack_top > 0); - DUK_ASSERT(thr->callstack_curr != NULL); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - act->curr_pc = *thr->ptr_curr_pc; - thr->ptr_curr_pc = NULL; - } -} -#line 1 "duk_hthread_stacks.c" -/* - * Thread stack (mainly call stack) primitives: allocation of activations, - * unwinding catchers and activations, etc. - * - * Value stack handling is a part of the API implementation. - */ - -/* #include duk_internal.h -> already included */ - -/* Unwind the topmost catcher of the current activation (caller must check that - * both exist) without side effects. - */ -DUK_INTERNAL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act) { - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(act->cat != NULL); /* caller must check */ - cat = act->cat; - DUK_ASSERT(cat != NULL); - - DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is done)", (void *) cat)); - - if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { - duk_hobject *env; - - env = act->lex_env; /* current lex_env of the activation (created for catcher) */ - DUK_ASSERT(env != NULL); /* must be, since env was created when catcher was created */ - act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env); /* prototype is lex_env before catcher created */ - DUK_HOBJECT_INCREF(thr, act->lex_env); - DUK_HOBJECT_DECREF_NORZ(thr, env); - - /* There is no need to decref anything else than 'env': if 'env' - * becomes unreachable, refzero will handle decref'ing its prototype. - */ - } - - act->cat = cat->parent; - duk_hthread_catcher_free(thr, cat); -} - -/* Same as above, but caller is certain no catcher-related lexenv may exist. */ -DUK_INTERNAL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act) { - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(act->cat != NULL); /* caller must check */ - cat = act->cat; - DUK_ASSERT(cat != NULL); - - DUK_DDD(DUK_DDDPRINT("unwinding catch stack entry %p (lexenv check is not done)", (void *) cat)); - - DUK_ASSERT(!DUK_CAT_HAS_LEXENV_ACTIVE(cat)); - - act->cat = cat->parent; - duk_hthread_catcher_free(thr, cat); -} - -DUK_LOCAL -#if defined(DUK_USE_CACHE_CATCHER) -DUK_NOINLINE -#endif -duk_catcher *duk__hthread_catcher_alloc_slow(duk_hthread *thr) { - duk_catcher *cat; - - cat = (duk_catcher *) DUK_ALLOC_CHECKED(thr, sizeof(duk_catcher)); - DUK_ASSERT(cat != NULL); - return cat; -} - -#if defined(DUK_USE_CACHE_CATCHER) -DUK_INTERNAL DUK_INLINE duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) { - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - - cat = thr->heap->catcher_free; - if (DUK_LIKELY(cat != NULL)) { - thr->heap->catcher_free = cat->parent; - return cat; - } - - return duk__hthread_catcher_alloc_slow(thr); -} -#else /* DUK_USE_CACHE_CATCHER */ -DUK_INTERNAL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) { - return duk__hthread_catcher_alloc_slow(thr); -} -#endif /* DUK_USE_CACHE_CATCHER */ - -DUK_INTERNAL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(cat != NULL); - -#if defined(DUK_USE_CACHE_CATCHER) - /* Unconditional caching for now; freed in mark-and-sweep. */ - cat->parent = thr->heap->catcher_free; - thr->heap->catcher_free = cat; -#else - DUK_FREE_CHECKED(thr, (void *) cat); -#endif -} - -DUK_LOCAL -#if defined(DUK_USE_CACHE_ACTIVATION) -DUK_NOINLINE -#endif -duk_activation *duk__hthread_activation_alloc_slow(duk_hthread *thr) { - duk_activation *act; - - act = (duk_activation *) DUK_ALLOC_CHECKED(thr, sizeof(duk_activation)); - DUK_ASSERT(act != NULL); - return act; -} - -#if defined(DUK_USE_CACHE_ACTIVATION) -DUK_INTERNAL DUK_INLINE duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) { - duk_activation *act; - - DUK_ASSERT(thr != NULL); - - act = thr->heap->activation_free; - if (DUK_LIKELY(act != NULL)) { - thr->heap->activation_free = act->parent; - return act; - } - - return duk__hthread_activation_alloc_slow(thr); -} -#else /* DUK_USE_CACHE_ACTIVATION */ -DUK_INTERNAL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) { - return duk__hthread_activation_alloc_slow(thr); -} -#endif /* DUK_USE_CACHE_ACTIVATION */ - - -DUK_INTERNAL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - -#if defined(DUK_USE_CACHE_ACTIVATION) - /* Unconditional caching for now; freed in mark-and-sweep. */ - act->parent = thr->heap->activation_free; - thr->heap->activation_free = act; -#else - DUK_FREE_CHECKED(thr, (void *) act); -#endif -} - -/* Internal helper: process the unwind for the topmost activation of a thread, - * but leave the duk_activation in place for possible tailcall reuse. - */ -DUK_LOCAL void duk__activation_unwind_nofree_norz(duk_hthread *thr) { -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_heap *heap; -#endif - duk_activation *act; - duk_hobject *func; - duk_hobject *tmp; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->callstack_curr != NULL); /* caller must check */ - DUK_ASSERT(thr->callstack_top > 0); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - /* With lightfuncs, act 'func' may be NULL. */ - - /* With duk_activation records allocated separately, 'act' is a stable - * pointer and not affected by side effects. - */ - -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - /* - * Restore 'caller' property for non-strict callee functions. - */ - - func = DUK_ACT_GET_FUNC(act); - if (func != NULL && !DUK_HOBJECT_HAS_STRICT(func)) { - duk_tval *tv_caller; - duk_tval tv_tmp; - duk_hobject *h_tmp; - - tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr)); - - /* The act->prev_caller should only be set if the entry for 'caller' - * exists (as it is only set in that case, and the property is not - * configurable), but handle all the cases anyway. - */ - - if (tv_caller) { - DUK_TVAL_SET_TVAL(&tv_tmp, tv_caller); - if (act->prev_caller) { - /* Just transfer the refcount from act->prev_caller to tv_caller, - * so no need for a refcount update. This is the expected case. - */ - DUK_TVAL_SET_OBJECT(tv_caller, act->prev_caller); - act->prev_caller = NULL; - } else { - DUK_TVAL_SET_NULL(tv_caller); /* no incref needed */ - DUK_ASSERT(act->prev_caller == NULL); - } - DUK_TVAL_DECREF_NORZ(thr, &tv_tmp); - } else { - h_tmp = act->prev_caller; - if (h_tmp) { - act->prev_caller = NULL; - DUK_HOBJECT_DECREF_NORZ(thr, h_tmp); - } - } - DUK_ASSERT(act->prev_caller == NULL); - } -#endif - - /* - * Unwind debugger state. If we unwind while stepping - * (for any step type), pause execution. This is the - * only place explicitly handling a step out. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - heap = thr->heap; - if (heap->dbg_pause_act == thr->callstack_curr) { - if (heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_EXIT) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function exit")); - duk_debug_set_paused(heap); - } else { - DUK_D(DUK_DPRINT("unwound past dbg_pause_act, set to NULL")); - heap->dbg_pause_act = NULL; /* avoid stale pointers */ - } - DUK_ASSERT(heap->dbg_pause_act == NULL); - } -#endif - - /* - * Unwind catchers. - * - * Since there are no references in the catcher structure, - * unwinding is quite simple. The only thing we need to - * look out for is popping a possible lexical environment - * established for an active catch clause. - */ - - while (act->cat != NULL) { - duk_hthread_catcher_unwind_norz(thr, act); - } - - /* - * Close environment record(s) if they exist. - * - * Only variable environments are closed. If lex_env != var_env, it - * cannot currently contain any register bound declarations. - * - * Only environments created for a NEWENV function are closed. If an - * environment is created for e.g. an eval call, it must not be closed. - */ - - func = DUK_ACT_GET_FUNC(act); - if (func != NULL && !DUK_HOBJECT_HAS_NEWENV(func)) { - DUK_DDD(DUK_DDDPRINT("skip closing environments, envs not owned by this activation")); - goto skip_env_close; - } - /* func is NULL for lightfunc */ - - /* Catch sites are required to clean up their environments - * in FINALLY part before propagating, so this should - * always hold here. - */ - DUK_ASSERT(act->lex_env == act->var_env); - - /* XXX: Closing the environment record copies values from registers - * into the scope object. It's side effect free as such, but may - * currently run out of memory which causes an error throw. This is - * an actual sandboxing problem for error unwinds, and needs to be - * fixed e.g. by preallocating the scope property slots. - */ - if (act->var_env != NULL) { - DUK_DDD(DUK_DDDPRINT("closing var_env record %p -> %!O", - (void *) act->var_env, (duk_heaphdr *) act->var_env)); - duk_js_close_environment_record(thr, act->var_env); - } - - skip_env_close: - - /* - * Update preventcount - */ - - if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) { - DUK_ASSERT(thr->callstack_preventcount >= 1); - thr->callstack_preventcount--; - } - - /* - * Reference count updates, using NORZ macros so we don't - * need to handle side effects. - * - * duk_activation pointers like act->var_env are intentionally - * left as garbage and not NULLed. Without side effects they - * can't be used when the values are dangling/garbage. - */ - - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->var_env); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->lex_env); - tmp = DUK_ACT_GET_FUNC(act); - DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp); - DUK_UNREF(tmp); -} - -/* Unwind topmost duk_activation of a thread, caller must ensure that an - * activation exists. The call is side effect free, except that scope - * closure may currently throw an out-of-memory error. - */ -DUK_INTERNAL void duk_hthread_activation_unwind_norz(duk_hthread *thr) { - duk_activation *act; - - duk__activation_unwind_nofree_norz(thr); - - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_top > 0); - act = thr->callstack_curr; - thr->callstack_curr = act->parent; - thr->callstack_top--; - - /* Ideally we'd restore value stack reserve here to caller's value. - * This doesn't work for current unwind call sites however, because - * the current (unwound) value stack top may be above the reserve. - * Thus value stack reserve is restored by the call sites. - */ - - /* XXX: inline for performance builds? */ - duk_hthread_activation_free(thr, act); - - /* We could clear the book-keeping variables like retval_byteoff for - * the topmost activation, but don't do so now as it's not necessary. - */ -} - -DUK_INTERNAL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr) { - duk__activation_unwind_nofree_norz(thr); -} - -/* Get duk_activation for given callstack level or NULL if level is invalid - * or deeper than the call stack. Level -1 refers to current activation, -2 - * to its caller, etc. Starting from Duktape 2.2 finding the activation is - * a linked list scan which gets more expensive the deeper the lookup is. - */ -DUK_INTERNAL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level) { - duk_activation *act; - - if (level >= 0) { - return NULL; - } - act = thr->callstack_curr; - for (;;) { - if (act == NULL) { - return act; - } - if (level == -1) { - return act; - } - level++; - act = act->parent; - } - /* never here */ -} - -#if defined(DUK_USE_FINALIZER_TORTURE) -DUK_INTERNAL void duk_hthread_valstack_torture_realloc(duk_hthread *thr) { - duk_size_t alloc_size; - duk_tval *new_ptr; - duk_ptrdiff_t alloc_end_off; - duk_ptrdiff_t end_off; - duk_ptrdiff_t bottom_off; - duk_ptrdiff_t top_off; - - if (thr->valstack == NULL) { - DUK_D(DUK_DPRINT("skip valstack torture realloc, valstack is NULL")); - return; - } - - alloc_end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack); - end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); - bottom_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); - top_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack); - alloc_size = (duk_size_t) alloc_end_off; - if (alloc_size == 0) { - DUK_D(DUK_DPRINT("skip valstack torture realloc, alloc_size is zero")); - return; - } - - /* Use DUK_ALLOC_RAW() to avoid side effects. */ - new_ptr = (duk_tval *) DUK_ALLOC_RAW(thr->heap, alloc_size); - if (new_ptr != NULL) { - DUK_MEMCPY((void *) new_ptr, (const void *) thr->valstack, alloc_size); - DUK_MEMSET((void *) thr->valstack, 0x55, alloc_size); - DUK_FREE_CHECKED(thr, (void *) thr->valstack); - thr->valstack = new_ptr; - thr->valstack_alloc_end = (duk_tval *) ((duk_uint8_t *) new_ptr + alloc_end_off); - thr->valstack_end = (duk_tval *) ((duk_uint8_t *) new_ptr + end_off); - thr->valstack_bottom = (duk_tval *) ((duk_uint8_t *) new_ptr + bottom_off); - thr->valstack_top = (duk_tval *) ((duk_uint8_t *) new_ptr + top_off); - } else { - DUK_D(DUK_DPRINT("failed to realloc valstack for torture, ignore")); - } -} -#endif /* DUK_USE_FINALIZER_TORTURE */ -#line 1 "duk_js_arith.c" -/* - * Shared helpers for arithmetic operations - */ - -/* #include duk_internal.h -> already included */ - -/* Ecmascript modulus ('%') does not match IEEE 754 "remainder" operation - * (implemented by remainder() in C99) but does seem to match ANSI C fmod(). - * Compare E5 Section 11.5.3 and "man fmod". - */ -DUK_INTERNAL double duk_js_arith_mod(double d1, double d2) { -#if defined(DUK_USE_POW_WORKAROUNDS) - /* Specific fixes to common fmod() implementation issues: - * - test-bug-mingw-math-issues.js - */ - if (DUK_ISINF(d2)) { - if (DUK_ISINF(d1)) { - return DUK_DOUBLE_NAN; - } else { - return d1; - } - } else if (d1 == 0.0) { - /* d1 +/-0 is returned as is (preserving sign) except when - * d2 is zero or NaN. - */ - if (d2 == 0.0 || DUK_ISNAN(d2)) { - return DUK_DOUBLE_NAN; - } else { - return d1; - } - } -#else - /* Some ISO C assumptions. */ - DUK_ASSERT(DUK_FMOD(1.0, DUK_DOUBLE_INFINITY) == 1.0); - DUK_ASSERT(DUK_FMOD(-1.0, DUK_DOUBLE_INFINITY) == -1.0); - DUK_ASSERT(DUK_FMOD(1.0, -DUK_DOUBLE_INFINITY) == 1.0); - DUK_ASSERT(DUK_FMOD(-1.0, -DUK_DOUBLE_INFINITY) == -1.0); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY))); - DUK_ASSERT(DUK_FMOD(0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, 1.0)) == 0); - DUK_ASSERT(DUK_FMOD(-0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, 1.0)) != 0); - DUK_ASSERT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0); - DUK_ASSERT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY)) != 0); - DUK_ASSERT(DUK_FMOD(0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0); - DUK_ASSERT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY)) != 0); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, 0.0))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, 0.0))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, -0.0))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, -0.0))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, DUK_DOUBLE_NAN))); - DUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, DUK_DOUBLE_NAN))); -#endif - - return (duk_double_t) DUK_FMOD((double) d1, (double) d2); -} - -/* Shared helper for Math.pow() and exponentiation operator. */ -DUK_INTERNAL double duk_js_arith_pow(double x, double y) { - /* The ANSI C pow() semantics differ from Ecmascript. - * - * E.g. when x==1 and y is +/- infinite, the Ecmascript required - * result is NaN, while at least Linux pow() returns 1. - */ - - duk_small_int_t cx, cy, sx; - - DUK_UNREF(cx); - DUK_UNREF(sx); - cy = (duk_small_int_t) DUK_FPCLASSIFY(y); - - if (cy == DUK_FP_NAN) { - goto ret_nan; - } - if (DUK_FABS(x) == 1.0 && cy == DUK_FP_INFINITE) { - goto ret_nan; - } - -#if defined(DUK_USE_POW_WORKAROUNDS) - /* Specific fixes to common pow() implementation issues: - * - test-bug-netbsd-math-pow.js: NetBSD 6.0 on x86 (at least) - * - test-bug-mingw-math-issues.js - */ - cx = (duk_small_int_t) DUK_FPCLASSIFY(x); - if (cx == DUK_FP_ZERO && y < 0.0) { - sx = (duk_small_int_t) DUK_SIGNBIT(x); - if (sx == 0) { - /* Math.pow(+0,y) should be Infinity when y<0. NetBSD pow() - * returns -Infinity instead when y is <0 and finite. The - * if-clause also catches y == -Infinity (which works even - * without the fix). - */ - return DUK_DOUBLE_INFINITY; - } else { - /* Math.pow(-0,y) where y<0 should be: - * - -Infinity if y<0 and an odd integer - * - Infinity if y<0 but not an odd integer - * NetBSD pow() returns -Infinity for all finite y<0. The - * if-clause also catches y == -Infinity (which works even - * without the fix). - */ - - /* fmod() return value has same sign as input (negative) so - * the result here will be in the range ]-2,0], -1 indicates - * odd. If x is -Infinity, NaN is returned and the odd check - * always concludes "not odd" which results in desired outcome. - */ - double tmp = DUK_FMOD(y, 2); - if (tmp == -1.0) { - return -DUK_DOUBLE_INFINITY; - } else { - /* Not odd, or y == -Infinity */ - return DUK_DOUBLE_INFINITY; - } - } - } else if (cx == DUK_FP_NAN) { - if (y == 0.0) { - /* NaN ** +/- 0 should always be 1, but is NaN on - * at least some Cygwin/MinGW versions. - */ - return 1.0; - } - } -#else - /* Some ISO C assumptions. */ - DUK_ASSERT(DUK_POW(DUK_DOUBLE_NAN, 0.0) == 1.0); - DUK_ASSERT(DUK_ISINF(DUK_POW(0.0, -1.0)) && DUK_SIGNBIT(DUK_POW(0.0, -1.0)) == 0); - DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -2.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -2.0)) == 0); - DUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -3.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -3.0)) != 0); -#endif - - return DUK_POW(x, y); - - ret_nan: - return DUK_DOUBLE_NAN; -} -#line 1 "duk_js_call.c" -/* - * Call handling. - * - * duk_handle_call_unprotected(): - * - * - Unprotected call to Ecmascript or Duktape/C function, from native - * code or bytecode executor. - * - * - Also handles Ecma-to-Ecma calls which reuses a currently running - * executor instance to avoid native recursion. Call setup is done - * normally, but just before calling the bytecode executor a special - * return code is used to indicate that a calling executor is reused. - * - * - Also handles tailcalls, i.e. reuse of current duk_activation. - * - * - Also handles setup for initial Duktape.Thread.resume(). - * - * duk_handle_safe_call(): - * - * - Protected C call within current activation. - * - * setjmp() and local variables have a nasty interaction, see execution.rst; - * non-volatile locals modified after setjmp() call are not guaranteed to - * keep their value and can cause compiler or compiler version specific - * difficult to replicate issues. - * - * See 'execution.rst'. - */ - -/* #include duk_internal.h -> already included */ - -/* XXX: heap->error_not_allowed for success path too? */ - -/* - * Limit check helpers. - */ - -/* Allow headroom for calls during error augmentation (see GH-191). - * We allow space for 10 additional recursions, with one extra - * for, e.g. a print() call at the deepest level, and an extra - * +1 for protected call wrapping. - */ -#define DUK__AUGMENT_CALL_RELAX_COUNT (10 + 2) - -DUK_LOCAL DUK_NOINLINE void duk__call_c_recursion_limit_check_slowpath(duk_hthread *thr) { - /* When augmenting an error, the effective limit is a bit higher. - * Check for it only if the fast path check fails. - */ -#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) - if (thr->heap->augmenting_error) { - if (thr->heap->call_recursion_depth < thr->heap->call_recursion_limit + DUK__AUGMENT_CALL_RELAX_COUNT) { - DUK_D(DUK_DPRINT("C recursion limit reached but augmenting error and within relaxed limit")); - return; - } - } -#endif - - DUK_D(DUK_DPRINT("call prevented because C recursion limit reached")); - DUK_ERROR_RANGE(thr, DUK_STR_C_CALLSTACK_LIMIT); -} - -DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_c_recursion_limit_check(duk_hthread *thr) { - DUK_ASSERT(thr->heap->call_recursion_depth >= 0); - DUK_ASSERT(thr->heap->call_recursion_depth <= thr->heap->call_recursion_limit); - - /* This check is forcibly inlined because it's very cheap and almost - * always passes. The slow path is forcibly noinline. - */ - if (DUK_LIKELY(thr->heap->call_recursion_depth < thr->heap->call_recursion_limit)) { - return; - } - - duk__call_c_recursion_limit_check_slowpath(thr); -} - -DUK_LOCAL DUK_NOINLINE void duk__call_callstack_limit_check_slowpath(duk_hthread *thr) { - /* When augmenting an error, the effective limit is a bit higher. - * Check for it only if the fast path check fails. - */ -#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE) - if (thr->heap->augmenting_error) { - if (thr->callstack_top < DUK_USE_CALLSTACK_LIMIT + DUK__AUGMENT_CALL_RELAX_COUNT) { - DUK_D(DUK_DPRINT("call stack limit reached but augmenting error and within relaxed limit")); - return; - } - } -#endif - - /* XXX: error message is a bit misleading: we reached a recursion - * limit which is also essentially the same as a C callstack limit - * (except perhaps with some relaxed threading assumptions). - */ - DUK_D(DUK_DPRINT("call prevented because call stack limit reached")); - DUK_ERROR_RANGE(thr, DUK_STR_CALLSTACK_LIMIT); -} - -DUK_LOCAL DUK_ALWAYS_INLINE void duk__call_callstack_limit_check(duk_hthread *thr) { - /* This check is forcibly inlined because it's very cheap and almost - * always passes. The slow path is forcibly noinline. - */ - if (DUK_LIKELY(thr->callstack_top < DUK_USE_CALLSTACK_LIMIT)) { - return; - } - - duk__call_callstack_limit_check_slowpath(thr); -} - -/* - * Interrupt counter fixup (for development only). - */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) -DUK_LOCAL void duk__interrupt_fixup(duk_hthread *thr, duk_hthread *entry_curr_thread) { - /* Currently the bytecode executor and executor interrupt - * instruction counts are off because we don't execute the - * interrupt handler when we're about to exit from the initial - * user call into Duktape. - * - * If we were to execute the interrupt handler here, the counts - * would match. You can enable this block manually to check - * that this is the case. - */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - -#if defined(DUK_USE_INTERRUPT_DEBUG_FIXUP) - if (entry_curr_thread == NULL) { - thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter; - thr->heap->inst_count_interrupt += thr->interrupt_init; - DUK_DD(DUK_DDPRINT("debug test: updated interrupt count on exit to " - "user code, instruction counts: executor=%ld, interrupt=%ld", - (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt)); - DUK_ASSERT(thr->heap->inst_count_exec == thr->heap->inst_count_interrupt); - } -#else - DUK_UNREF(thr); - DUK_UNREF(entry_curr_thread); -#endif -} -#endif - -/* - * Arguments object creation. - * - * Creating arguments objects involves many small details, see E5 Section - * 10.6 for the specific requirements. Much of the arguments object exotic - * behavior is implemented in duk_hobject_props.c, and is enabled by the - * object flag DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS. - */ - -DUK_LOCAL void duk__create_arguments_object(duk_hthread *thr, - duk_hobject *func, - duk_hobject *varenv, - duk_idx_t idx_args) { - duk_hobject *arg; /* 'arguments' */ - duk_hobject *formals; /* formals for 'func' (may be NULL if func is a C function) */ - duk_idx_t i_arg; - duk_idx_t i_map; - duk_idx_t i_mappednames; - duk_idx_t i_formals; - duk_idx_t i_argbase; - duk_idx_t n_formals; - duk_idx_t idx; - duk_idx_t num_stack_args; - duk_bool_t need_map; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_NONBOUND_FUNCTION(func)); - DUK_ASSERT(varenv != NULL); - - /* [ ... func this arg1(@idx_args) ... argN envobj ] - * [ arg1(@idx_args) ... argN envobj ] (for tailcalls) - */ - - need_map = 0; - - i_argbase = idx_args; - num_stack_args = duk_get_top(thr) - i_argbase - 1; - DUK_ASSERT(i_argbase >= 0); - DUK_ASSERT(num_stack_args >= 0); - - duk_push_hobject(thr, func); - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS); - formals = duk_get_hobject(thr, -1); - if (formals) { - n_formals = (duk_idx_t) duk_get_length(thr, -1); - } else { - /* This shouldn't happen without tampering of internal - * properties: if a function accesses 'arguments', _Formals - * is kept. Check for the case anyway in case internal - * properties have been modified manually. - */ - DUK_D(DUK_DPRINT("_Formals is undefined when creating arguments, use n_formals == 0")); - n_formals = 0; - } - duk_remove_m2(thr); /* leave formals on stack for later use */ - i_formals = duk_require_top_index(thr); - - DUK_ASSERT(n_formals >= 0); - DUK_ASSERT(formals != NULL || n_formals == 0); - - DUK_DDD(DUK_DDDPRINT("func=%!O, formals=%!O, n_formals=%ld", - (duk_heaphdr *) func, (duk_heaphdr *) formals, - (long) n_formals)); - - /* [ ... formals ] */ - - /* - * Create required objects: - * - 'arguments' object: array-like, but not an array - * - 'map' object: internal object, tied to 'arguments' - * - 'mappedNames' object: temporary value used during construction - */ - - arg = duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_FLAG_ARRAY_PART | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARGUMENTS), - DUK_BIDX_OBJECT_PROTOTYPE); - DUK_ASSERT(arg != NULL); - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - -1); /* no prototype */ - (void) duk_push_object_helper(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_FLAG_FASTREFS | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), - -1); /* no prototype */ - i_arg = duk_get_top(thr) - 3; - i_map = i_arg + 1; - i_mappednames = i_arg + 2; - - /* [ ... formals arguments map mappedNames ] */ - - DUK_DDD(DUK_DDDPRINT("created arguments related objects: " - "arguments at index %ld -> %!O " - "map at index %ld -> %!O " - "mappednames at index %ld -> %!O", - (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg), - (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map), - (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames))); - - /* - * Init arguments properties, map, etc. - */ - - duk_push_int(thr, num_stack_args); - duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_WC); - - /* - * Init argument related properties. - */ - - /* step 11 */ - idx = num_stack_args - 1; - while (idx >= 0) { - DUK_DDD(DUK_DDDPRINT("arg idx %ld, argbase=%ld, argidx=%ld", - (long) idx, (long) i_argbase, (long) (i_argbase + idx))); - - DUK_DDD(DUK_DDDPRINT("define arguments[%ld]=arg", (long) idx)); - duk_dup(thr, i_argbase + idx); - duk_xdef_prop_index_wec(thr, i_arg, (duk_uarridx_t) idx); - DUK_DDD(DUK_DDDPRINT("defined arguments[%ld]=arg", (long) idx)); - - /* step 11.c is relevant only if non-strict (checked in 11.c.ii) */ - if (!DUK_HOBJECT_HAS_STRICT(func) && idx < n_formals) { - DUK_ASSERT(formals != NULL); - - DUK_DDD(DUK_DDDPRINT("strict function, index within formals (%ld < %ld)", - (long) idx, (long) n_formals)); - - duk_get_prop_index(thr, i_formals, (duk_uarridx_t) idx); - DUK_ASSERT(duk_is_string(thr, -1)); - - duk_dup_top(thr); /* [ ... name name ] */ - - if (!duk_has_prop(thr, i_mappednames)) { - /* steps 11.c.ii.1 - 11.c.ii.4, but our internal book-keeping - * differs from the reference model - */ - - /* [ ... name ] */ - - need_map = 1; - - DUK_DDD(DUK_DDDPRINT("set mappednames[%s]=%ld", - (const char *) duk_get_string(thr, -1), - (long) idx)); - duk_dup_top(thr); /* name */ - (void) duk_push_uint_to_hstring(thr, (duk_uint_t) idx); /* index */ - duk_xdef_prop_wec(thr, i_mappednames); /* out of spec, must be configurable */ - - DUK_DDD(DUK_DDDPRINT("set map[%ld]=%s", - (long) idx, - duk_get_string(thr, -1))); - duk_dup_top(thr); /* name */ - duk_xdef_prop_index_wec(thr, i_map, (duk_uarridx_t) idx); /* out of spec, must be configurable */ - } else { - /* duk_has_prop() popped the second 'name' */ - } - - /* [ ... name ] */ - duk_pop(thr); /* pop 'name' */ - } - - idx--; - } - - DUK_DDD(DUK_DDDPRINT("actual arguments processed")); - - /* step 12 */ - if (need_map) { - DUK_DDD(DUK_DDDPRINT("adding 'map' and 'varenv' to arguments object")); - - /* should never happen for a strict callee */ - DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func)); - - duk_dup(thr, i_map); - duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_MAP, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */ - - /* The variable environment for magic variable bindings needs to be - * given by the caller and recorded in the arguments object. - * - * See E5 Section 10.6, the creation of setters/getters. - * - * The variable environment also provides access to the callee, so - * an explicit (internal) callee property is not needed. - */ - - duk_push_hobject(thr, varenv); - duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_VARENV, DUK_PROPDESC_FLAGS_NONE); /* out of spec, don't care */ - } - - /* steps 13-14 */ - if (DUK_HOBJECT_HAS_STRICT(func)) { - /* Callee/caller are throwers and are not deletable etc. They - * could be implemented as virtual properties, but currently - * there is no support for virtual properties which are accessors - * (only plain virtual properties). This would not be difficult - * to change in duk_hobject_props, but we can make the throwers - * normal, concrete properties just as easily. - * - * Note that the specification requires that the *same* thrower - * built-in object is used here! See E5 Section 10.6 main - * algoritm, step 14, and Section 13.2.3 which describes the - * thrower. See test case test-arguments-throwers.js. - */ - - DUK_DDD(DUK_DDDPRINT("strict function, setting caller/callee to throwers")); - - duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLER); - duk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLEE); - } else { - DUK_DDD(DUK_DDDPRINT("non-strict function, setting callee to actual value")); - duk_push_hobject(thr, func); - duk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_CALLEE, DUK_PROPDESC_FLAGS_WC); - } - - /* set exotic behavior only after we're done */ - if (need_map) { - /* Exotic behaviors are only enabled for arguments objects - * which have a parameter map (see E5 Section 10.6 main - * algorithm, step 12). - * - * In particular, a non-strict arguments object with no - * mapped formals does *NOT* get exotic behavior, even - * for e.g. "caller" property. This seems counterintuitive - * but seems to be the case. - */ - - /* cannot be strict (never mapped variables) */ - DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func)); - - DUK_DDD(DUK_DDDPRINT("enabling exotic behavior for arguments object")); - DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(arg); - } else { - DUK_DDD(DUK_DDDPRINT("not enabling exotic behavior for arguments object")); - } - - DUK_DDD(DUK_DDDPRINT("final arguments related objects: " - "arguments at index %ld -> %!O " - "map at index %ld -> %!O " - "mappednames at index %ld -> %!O", - (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg), - (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map), - (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames))); - - /* [ args(n) envobj formals arguments map mappednames ] */ - - duk_pop_2(thr); - duk_remove_m2(thr); - - /* [ args(n) envobj arguments ] */ -} - -/* Helper for creating the arguments object and adding it to the env record - * on top of the value stack. - */ -DUK_LOCAL void duk__handle_createargs_for_call(duk_hthread *thr, - duk_hobject *func, - duk_hobject *env, - duk_idx_t idx_args) { - DUK_DDD(DUK_DDDPRINT("creating arguments object for function call")); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(func != NULL); - DUK_ASSERT(env != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func)); - - /* [ ... arg1 ... argN envobj ] */ - - duk__create_arguments_object(thr, - func, - env, - idx_args); - - /* [ ... arg1 ... argN envobj argobj ] */ - - duk_xdef_prop_stridx_short(thr, - -2, - DUK_STRIDX_LC_ARGUMENTS, - DUK_HOBJECT_HAS_STRICT(func) ? DUK_PROPDESC_FLAGS_E : /* strict: non-deletable, non-writable */ - DUK_PROPDESC_FLAGS_WE); /* non-strict: non-deletable, writable */ - /* [ ... arg1 ... argN envobj ] */ -} - -/* - * Helpers for constructor call handling. - * - * There are two [[Construct]] operations in the specification: - * - * - E5 Section 13.2.2: for Function objects - * - E5 Section 15.3.4.5.2: for "bound" Function objects - * - * The chain of bound functions is resolved in Section 15.3.4.5.2, - * with arguments "piling up" until the [[Construct]] internal - * method is called on the final, actual Function object. Note - * that the "prototype" property is looked up *only* from the - * final object, *before* calling the constructor. - * - * Since Duktape 2.2 bound functions are represented with the - * duk_hboundfunc internal type, and bound function chains are - * collapsed when a bound function is created. As a result, the - * direct target of a duk_hboundfunc is always non-bound and the - * this/argument lists have been resolved. - * - * When constructing new Array instances, an unnecessary object is - * created and discarded now: the standard [[Construct]] creates an - * object, and calls the Array constructor. The Array constructor - * returns an Array instance, which is used as the result value for - * the "new" operation; the object created before the Array constructor - * call is discarded. - * - * This would be easy to fix, e.g. by knowing that the Array constructor - * will always create a replacement object and skip creating the fallback - * object in that case. - */ - -/* Update default instance prototype for constructor call. */ -DUK_LOCAL void duk__update_default_instance_proto(duk_hthread *thr, duk_idx_t idx_func) { - duk_hobject *proto; - duk_hobject *fallback; - - DUK_ASSERT(duk_is_constructable(thr, idx_func)); - - duk_get_prop_stridx_short(thr, idx_func, DUK_STRIDX_PROTOTYPE); - proto = duk_get_hobject(thr, -1); - if (proto == NULL) { - DUK_DDD(DUK_DDDPRINT("constructor has no 'prototype' property, or value not an object " - "-> leave standard Object prototype as fallback prototype")); - } else { - DUK_DDD(DUK_DDDPRINT("constructor has 'prototype' property with object value " - "-> set fallback prototype to that value: %!iO", (duk_heaphdr *) proto)); - /* Original fallback (default instance) is untouched when - * resolving bound functions etc. - */ - fallback = duk_known_hobject(thr, idx_func + 1); - DUK_ASSERT(fallback != NULL); - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, fallback, proto); - } - duk_pop(thr); -} - -/* Postprocess: return value special handling, error augmentation. */ -DUK_INTERNAL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant) { - /* Use either fallback (default instance) or retval depending - * on retval type. Needs to be called before unwind because - * the default instance is read from the current (immutable) - * 'this' binding. - * - * For Proxy 'construct' calls the return value must be an - * Object (we accept object-like values like buffers and - * lightfuncs too). If not, TypeError. - */ - if (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | - DUK_TYPE_MASK_BUFFER | - DUK_TYPE_MASK_LIGHTFUNC)) { - DUK_DDD(DUK_DDDPRINT("replacement value")); - } else { - if (DUK_UNLIKELY(proxy_invariant != 0U)) { - /* Proxy 'construct' return value invariant violated. */ - DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr); - } - /* XXX: direct value stack access */ - duk_pop(thr); - duk_push_this(thr); - } - -#if defined(DUK_USE_AUGMENT_ERROR_CREATE) - /* Augment created errors upon creation, not when they are thrown or - * rethrown. __FILE__ and __LINE__ are not desirable here; the call - * stack reflects the caller which is correct. Skip topmost, unwound - * activation when creating a traceback. If thr->ptr_curr_pc was != - * NULL we'd need to sync the current PC so that the traceback comes - * out right; however it is always synced here so just assert for it. - */ - DUK_ASSERT(thr->ptr_curr_pc == NULL); - duk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE | - DUK_AUGMENT_FLAG_SKIP_ONE); -#endif -} - -/* - * Helper for handling a bound function when a call is being made. - * - * Assumes that bound function chains have been "collapsed" so that either - * the target is non-bound or there is one bound function that points to a - * nonbound target. - * - * Prepends the bound arguments to the value stack (at idx_func + 2). - * The 'this' binding is also updated if necessary (at idx_func + 1). - * Note that for constructor calls the 'this' binding is never updated by - * [[BoundThis]]. - */ - -DUK_LOCAL void duk__handle_bound_chain_for_call(duk_hthread *thr, - duk_idx_t idx_func, - duk_bool_t is_constructor_call) { - duk_tval *tv_func; - duk_hobject *func; - duk_idx_t len; - - DUK_ASSERT(thr != NULL); - - /* On entry, item at idx_func is a bound, non-lightweight function, - * but we don't rely on that below. - */ - - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - - tv_func = duk_require_tval(thr, idx_func); - DUK_ASSERT(tv_func != NULL); - - if (DUK_TVAL_IS_OBJECT(tv_func)) { - func = DUK_TVAL_GET_OBJECT(tv_func); - - /* XXX: separate helper function, out of fast path? */ - if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { - duk_hboundfunc *h_bound; - duk_tval *tv_args; - duk_tval *tv_gap; - - h_bound = (duk_hboundfunc *) func; - tv_args = h_bound->args; - len = h_bound->nargs; - DUK_ASSERT(len == 0 || tv_args != NULL); - - DUK_DDD(DUK_DDDPRINT("bound function encountered, ptr=%p: %!T", - (void *) DUK_TVAL_GET_OBJECT(tv_func), tv_func)); - - /* [ ... func this arg1 ... argN ] */ - - if (is_constructor_call) { - /* See: tests/ecmascript/test-spec-bound-constructor.js */ - DUK_DDD(DUK_DDDPRINT("constructor call: don't update this binding")); - } else { - /* XXX: duk_replace_tval */ - duk_push_tval(thr, &h_bound->this_binding); - duk_replace(thr, idx_func + 1); /* idx_this = idx_func + 1 */ - } - - /* [ ... func this arg1 ... argN ] */ - - duk_require_stack(thr, len); - - tv_gap = duk_reserve_gap(thr, idx_func + 2, len); - duk_copy_tvals_incref(thr, tv_gap, tv_args, (duk_size_t) len); - - /* [ ... func this arg1 ... argN ] */ - - duk_push_tval(thr, &h_bound->target); - duk_replace(thr, idx_func); /* replace in stack */ - - DUK_DDD(DUK_DDDPRINT("bound function handled, idx_func=%ld, curr func=%!T", - (long) idx_func, duk_get_tval(thr, idx_func))); - } - } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { - /* Lightweight function: never bound, so terminate. */ - ; - } else { - /* Shouldn't happen, so ugly error is enough. */ - DUK_ERROR_INTERNAL(thr); - } - - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - - DUK_DDD(DUK_DDDPRINT("final non-bound function is: %!T", duk_get_tval(thr, idx_func))); - -#if defined(DUK_USE_ASSERTIONS) - tv_func = duk_require_tval(thr, idx_func); - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func) || DUK_TVAL_IS_OBJECT(tv_func)); - if (DUK_TVAL_IS_OBJECT(tv_func)) { - func = DUK_TVAL_GET_OBJECT(tv_func); - DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func) || - DUK_HOBJECT_HAS_NATFUNC(func)); - } -#endif -} - -/* - * Helper for inline handling of .call(), .apply(), and .construct(). - */ - -DUK_LOCAL duk_bool_t duk__handle_specialfuncs_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hobject *func, duk_small_uint_t *call_flags, duk_bool_t first) { -#if defined(DUK_USE_ASSERTIONS) - duk_c_function natfunc; -#endif - duk_tval *tv_args; - - DUK_ASSERT(func != NULL); - DUK_ASSERT((*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0); /* Caller. */ - -#if defined(DUK_USE_ASSERTIONS) - natfunc = ((duk_hnatfunc *) func)->func; - DUK_ASSERT(natfunc != NULL); -#endif - - /* On every round of function resolution at least target function and - * 'this' binding are set. We can assume that here, and must guarantee - * it on exit. Value stack reserve is extended for bound function and - * .apply() unpacking so we don't need to extend it here when we need a - * few slots. - */ - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - - /* Handle native 'eval' specially. A direct eval check is only made - * for the first resolution attempt; e.g. a bound eval call is -not- - * a direct eval call. - */ - if (DUK_UNLIKELY(((duk_hnatfunc *) func)->magic == 15)) { - /* For now no special handling except for direct eval - * detection. - */ - DUK_ASSERT(((duk_hnatfunc *) func)->func == duk_bi_global_object_eval); - if (first && (*call_flags & DUK_CALL_FLAG_CALLED_AS_EVAL)) { - *call_flags = (*call_flags & ~DUK_CALL_FLAG_CALLED_AS_EVAL) | DUK_CALL_FLAG_DIRECT_EVAL; - } - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - return 1; /* stop resolving */ - } - - /* Handle special functions based on the DUK_HOBJECT_FLAG_SPECIAL_CALL - * flag; their magic value is used for switch-case. - * - * NOTE: duk_unpack_array_like() reserves value stack space - * for the result values (unlike most other value stack calls). - */ - switch (((duk_hnatfunc *) func)->magic) { - case 0: { /* 0=Function.prototype.call() */ - /* Value stack: - * idx_func + 0: Function.prototype.call() [removed] - * idx_func + 1: this binding for .call (target function) - * idx_func + 2: 1st argument to .call, desired 'this' binding - * idx_func + 3: 2nd argument to .call, desired 1st argument for ultimate target - * ... - * - * Remove idx_func + 0 to get: - * idx_func + 0: target function - * idx_func + 1: this binding - * idx_func + 2: call arguments - * ... - */ - DUK_ASSERT(natfunc == duk_bi_function_prototype_call); - duk_remove_unsafe(thr, idx_func); - tv_args = thr->valstack_bottom + idx_func + 2; - if (thr->valstack_top < tv_args) { - DUK_ASSERT(tv_args <= thr->valstack_end); - thr->valstack_top = tv_args; /* at least target function and 'this' binding present */ - } - break; - } - case 1: { /* 1=Function.prototype.apply() */ - /* Value stack: - * idx_func + 0: Function.prototype.apply() [removed] - * idx_func + 1: this binding for .apply (target function) - * idx_func + 2: 1st argument to .apply, desired 'this' binding - * idx_func + 3: 2nd argument to .apply, argArray - * [anything after this MUST be ignored] - * - * Remove idx_func + 0 and unpack the argArray to get: - * idx_func + 0: target function - * idx_func + 1: this binding - * idx_func + 2: call arguments - * ... - */ - DUK_ASSERT(natfunc == duk_bi_function_prototype_apply); - duk_remove_unsafe(thr, idx_func); - goto apply_shared; - } -#if defined(DUK_USE_REFLECT_BUILTIN) - case 2: { /* 2=Reflect.apply() */ - /* Value stack: - * idx_func + 0: Reflect.apply() [removed] - * idx_func + 1: this binding for .apply (ignored, usually Reflect) [removed] - * idx_func + 2: 1st argument to .apply, target function - * idx_func + 3: 2nd argument to .apply, desired 'this' binding - * idx_func + 4: 3rd argument to .apply, argArray - * [anything after this MUST be ignored] - * - * Remove idx_func + 0 and idx_func + 1, and unpack the argArray to get: - * idx_func + 0: target function - * idx_func + 1: this binding - * idx_func + 2: call arguments - * ... - */ - DUK_ASSERT(natfunc == duk_bi_reflect_apply); - duk_remove_n_unsafe(thr, idx_func, 2); - goto apply_shared; - } - case 3: { /* 3=Reflect.construct() */ - /* Value stack: - * idx_func + 0: Reflect.construct() [removed] - * idx_func + 1: this binding for .construct (ignored, usually Reflect) [removed] - * idx_func + 2: 1st argument to .construct, target function - * idx_func + 3: 2nd argument to .construct, argArray - * idx_func + 4: 3rd argument to .construct, newTarget - * [anything after this MUST be ignored] - * - * Remove idx_func + 0 and idx_func + 1, unpack the argArray, - * and insert default instance (prototype not yet updated), to get: - * idx_func + 0: target function - * idx_func + 1: this binding (default instance) - * idx_func + 2: constructor call arguments - * ... - * - * Call flags must be updated to reflect the fact that we're - * now dealing with a constructor call, and e.g. the 'this' - * binding cannot be overwritten if the target is bound. - * - * newTarget is checked but not yet passed onwards. - */ - - duk_idx_t top; - - DUK_ASSERT(natfunc == duk_bi_reflect_construct); - *call_flags |= DUK_CALL_FLAG_CONSTRUCT; - duk_remove_n_unsafe(thr, idx_func, 2); - top = duk_get_top(thr); - if (!duk_is_constructable(thr, idx_func)) { - /* Target constructability must be checked before - * unpacking argArray (which may cause side effects). - * Just return; caller will throw the error. - */ - duk_set_top_unsafe(thr, idx_func + 2); /* satisfy asserts */ - break; - } - duk_push_object(thr); - duk_insert(thr, idx_func + 1); /* default instance */ - - /* [ ... func default_instance argArray newTarget? ] */ - - top = duk_get_top(thr); - if (top < idx_func + 3) { - /* argArray is a mandatory argument for Reflect.construct(). */ - DUK_ERROR_TYPE_INVALID_ARGS(thr); - } - if (top > idx_func + 3) { - if (!duk_strict_equals(thr, idx_func, idx_func + 3)) { - /* XXX: [[Construct]] newTarget currently unsupported */ - DUK_ERROR_UNSUPPORTED(thr); - } - duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */ - } - DUK_ASSERT(duk_get_top(thr) == idx_func + 3); - DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2)); - (void) duk_unpack_array_like(thr, idx_func + 2); /* XXX: should also remove target to be symmetric with duk_pack()? */ - duk_remove(thr, idx_func + 2); - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - break; - } -#endif /* DUK_USE_REFLECT_BUILTIN */ - default: { - DUK_ASSERT(0); - DUK_UNREACHABLE(); - } - } - - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - return 0; /* keep resolving */ - - apply_shared: - tv_args = thr->valstack_bottom + idx_func + 2; - if (thr->valstack_top <= tv_args) { - DUK_ASSERT(tv_args <= thr->valstack_end); - thr->valstack_top = tv_args; /* at least target func and 'this' binding present */ - /* No need to check for argArray. */ - } else { - DUK_ASSERT(duk_get_top(thr) >= idx_func + 3); /* idx_func + 2 covered above */ - if (thr->valstack_top > tv_args + 1) { - duk_set_top_unsafe(thr, idx_func + 3); /* remove any args beyond argArray */ - } - DUK_ASSERT(duk_is_valid_index(thr, idx_func + 2)); - if (!duk_is_callable(thr, idx_func)) { - /* Avoid unpack side effects if the target isn't callable. - * Calling code will throw the actual error. - */ - } else { - (void) duk_unpack_array_like(thr, idx_func + 2); - duk_remove(thr, idx_func + 2); - } - } - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - return 0; /* keep resolving */ -} - -/* - * Helper for Proxy handling. - */ - -#if defined(DUK_USE_ES6_PROXY) -DUK_LOCAL void duk__handle_proxy_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hproxy *h_proxy, duk_small_uint_t *call_flags) { - duk_bool_t rc; - - /* Value stack: - * idx_func + 0: Proxy object - * idx_func + 1: this binding for call - * idx_func + 2: 1st argument for call - * idx_func + 3: 2nd argument for call - * ... - * - * If Proxy doesn't have a trap for the call ('apply' or 'construct'), - * replace Proxy object with target object. - * - * If we're dealing with a normal call and the Proxy has an 'apply' - * trap, manipulate value stack to: - * - * idx_func + 0: trap - * idx_func + 1: Proxy's handler - * idx_func + 2: Proxy's target - * idx_func + 3: this binding for call (from idx_func + 1) - * idx_func + 4: call arguments packed to an array - * - * If we're dealing with a constructor call and the Proxy has a - * 'construct' trap, manipulate value stack to: - * - * idx_func + 0: trap - * idx_func + 1: Proxy's handler - * idx_func + 2: Proxy's target - * idx_func + 3: call arguments packed to an array - * idx_func + 4: newTarget == Proxy object here - * - * As we don't yet have proper newTarget support, the newTarget at - * idx_func + 3 is just the original constructor being called, i.e. - * the Proxy object (not the target). Note that the default instance - * (original 'this' binding) is dropped and ignored. - */ - - duk_push_hobject(thr, h_proxy->handler); - rc = duk_get_prop_stridx_short(thr, -1, (*call_flags & DUK_CALL_FLAG_CONSTRUCT) ? DUK_STRIDX_CONSTRUCT : DUK_STRIDX_APPLY); - if (rc == 0) { - /* Not found, continue to target. If this is a construct - * call, update default instance prototype using the Proxy, - * not the target. - */ - if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { - if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) { - *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED; - duk__update_default_instance_proto(thr, idx_func); - } - } - duk_pop_2(thr); - duk_push_hobject(thr, h_proxy->target); - duk_replace(thr, idx_func); - return; - } - - /* Here we must be careful not to replace idx_func while - * h_proxy is still needed, otherwise h_proxy may become - * dangling. This could be improved e.g. using a - * duk_pack_slice() with a freeform slice. - */ - - /* Here: - * idx_func + 0: Proxy object - * idx_func + 1: this binding for call - * idx_func + 2: 1st argument for call - * idx_func + 3: 2nd argument for call - * ... - * idx_func + N: handler - * idx_func + N + 1: trap - */ - - duk_insert(thr, idx_func + 1); - duk_insert(thr, idx_func + 2); - duk_push_hobject(thr, h_proxy->target); - duk_insert(thr, idx_func + 3); - duk_pack(thr, duk_get_top(thr) - (idx_func + 5)); - - /* Here: - * idx_func + 0: Proxy object - * idx_func + 1: trap - * idx_func + 2: Proxy's handler - * idx_func + 3: Proxy's target - * idx_func + 4: this binding for call - * idx_func + 5: arguments array - */ - DUK_ASSERT(duk_get_top(thr) == idx_func + 6); - - if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { - *call_flags |= DUK_CALL_FLAG_CONSTRUCT_PROXY; /* Enable 'construct' trap return invariant check. */ - *call_flags &= ~(DUK_CALL_FLAG_CONSTRUCT); /* Resume as non-constructor call to the trap. */ - - /* 'apply' args: target, thisArg, argArray - * 'construct' args: target, argArray, newTarget - */ - duk_remove(thr, idx_func + 4); - duk_push_hobject(thr, (duk_hobject *) h_proxy); - } - - /* Finalize value stack layout by removing Proxy reference. */ - duk_remove(thr, idx_func); - h_proxy = NULL; /* invalidated */ - DUK_ASSERT(duk_get_top(thr) == idx_func + 5); -} -#endif /* DUK_USE_ES6_PROXY */ - -/* - * Helper for setting up var_env and lex_env of an activation, - * assuming it does NOT have the DUK_HOBJECT_FLAG_NEWENV flag. - */ - -DUK_LOCAL void duk__handle_oldenv_for_call(duk_hthread *thr, - duk_hobject *func, - duk_activation *act) { - duk_hcompfunc *f; - duk_hobject *h_lex; - duk_hobject *h_var; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(func != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV(func)); - DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func)); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(func)); - DUK_UNREF(thr); - - f = (duk_hcompfunc *) func; - h_lex = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); - h_var = DUK_HCOMPFUNC_GET_VARENV(thr->heap, f); - DUK_ASSERT(h_lex != NULL); /* Always true for closures (not for templates) */ - DUK_ASSERT(h_var != NULL); - act->lex_env = h_lex; - act->var_env = h_var; - DUK_HOBJECT_INCREF(thr, h_lex); - DUK_HOBJECT_INCREF(thr, h_var); -} - -/* - * Helper for updating callee 'caller' property. - */ - -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) -DUK_LOCAL void duk__update_func_caller_prop(duk_hthread *thr, duk_hobject *func) { - duk_tval *tv_caller; - duk_hobject *h_tmp; - duk_activation *act_callee; - duk_activation *act_caller; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound chain resolved */ - DUK_ASSERT(thr->callstack_top >= 1); - - if (DUK_HOBJECT_HAS_STRICT(func)) { - /* Strict functions don't get their 'caller' updated. */ - return; - } - - DUK_ASSERT(thr->callstack_top > 0); - act_callee = thr->callstack_curr; - DUK_ASSERT(act_callee != NULL); - act_caller = (thr->callstack_top >= 2 ? act_callee->parent : NULL); - - /* XXX: check .caller writability? */ - - /* Backup 'caller' property and update its value. */ - tv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr)); - if (tv_caller) { - /* If caller is global/eval code, 'caller' should be set to - * 'null'. - * - * XXX: there is no exotic flag to infer this correctly now. - * The NEWENV flag is used now which works as intended for - * everything (global code, non-strict eval code, and functions) - * except strict eval code. Bound functions are never an issue - * because 'func' has been resolved to a non-bound function. - */ - - if (act_caller != NULL) { - /* act_caller->func may be NULL in some finalization cases, - * just treat like we don't know the caller. - */ - if (act_caller->func && !DUK_HOBJECT_HAS_NEWENV(act_caller->func)) { - /* Setting to NULL causes 'caller' to be set to - * 'null' as desired. - */ - act_caller = NULL; - } - } - - if (DUK_TVAL_IS_OBJECT(tv_caller)) { - h_tmp = DUK_TVAL_GET_OBJECT(tv_caller); - DUK_ASSERT(h_tmp != NULL); - act_callee->prev_caller = h_tmp; - - /* Previous value doesn't need refcount changes because its ownership - * is transferred to prev_caller. - */ - - if (act_caller != NULL) { - DUK_ASSERT(act_caller->func != NULL); - DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func); - DUK_TVAL_INCREF(thr, tv_caller); - } else { - DUK_TVAL_SET_NULL(tv_caller); /* no incref */ - } - } else { - /* 'caller' must only take on 'null' or function value */ - DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_caller)); - DUK_ASSERT(act_callee->prev_caller == NULL); - if (act_caller != NULL && act_caller->func) { - /* Tolerate act_caller->func == NULL which happens in - * some finalization cases; treat like unknown caller. - */ - DUK_TVAL_SET_OBJECT(tv_caller, act_caller->func); - DUK_TVAL_INCREF(thr, tv_caller); - } else { - DUK_TVAL_SET_NULL(tv_caller); /* no incref */ - } - } - } -} -#endif /* DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */ - -/* - * Shared helpers for resolving the final, non-bound target function of the - * call and the effective 'this' binding. Resolves bound functions and - * applies .call(), .apply(), and .construct() inline. - * - * Proxy traps are also handled inline so that if the target is a Proxy with - * a 'call' or 'construct' trap, the trap handler is called with a modified - * argument list. - * - * Once the bound function / .call() / .apply() / .construct() sequence has - * been resolved, the value at idx_func + 1 may need coercion described in - * E5 Section 10.4.3. - * - * A call that begins as a non-constructor call may be converted into a - * constructor call during the resolution process if Reflect.construct() - * is invoked. This is handled by updating the caller's call_flags. - * - * For global and eval code (E5 Sections 10.4.1 and 10.4.2), we assume - * that the caller has provided the correct 'this' binding explicitly - * when calling, i.e.: - * - * - global code: this=global object - * - direct eval: this=copy from eval() caller's this binding - * - other eval: this=global object - * - * The 'this' coercion may cause a recursive function call with arbitrary - * side effects, because ToObject() may be called. - */ - -DUK_LOCAL DUK_INLINE void duk__coerce_nonstrict_this_binding(duk_hthread *thr, duk_idx_t idx_this) { - duk_tval *tv_this; - duk_hobject *obj_global; - - tv_this = thr->valstack_bottom + idx_this; - switch (DUK_TVAL_GET_TAG(tv_this)) { - case DUK_TAG_OBJECT: - DUK_DDD(DUK_DDDPRINT("this binding: non-strict, object -> use directly")); - break; - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: - DUK_DDD(DUK_DDDPRINT("this binding: non-strict, undefined/null -> use global object")); - obj_global = thr->builtins[DUK_BIDX_GLOBAL]; - /* XXX: avoid this check somehow */ - if (DUK_LIKELY(obj_global != NULL)) { - DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */ - DUK_TVAL_SET_OBJECT(tv_this, obj_global); - DUK_HOBJECT_INCREF(thr, obj_global); - } else { - /* This may only happen if built-ins are being "torn down". - * This behavior is out of specification scope. - */ - DUK_D(DUK_DPRINT("this binding: wanted to use global object, but it is NULL -> using undefined instead")); - DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this)); /* no need to decref previous value */ - DUK_TVAL_SET_UNDEFINED(tv_this); /* nothing to incref */ - } - break; - default: - /* Plain buffers and lightfuncs are object coerced. Lightfuncs - * very rarely come here however, because the call target would - * need to be a non-strict non-lightfunc (lightfuncs are considered - * strict) with an explicit lightfunc 'this' binding. - */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_this)); - DUK_DDD(DUK_DDDPRINT("this binding: non-strict, not object/undefined/null -> use ToObject(value)")); - duk_to_object(thr, idx_this); /* may have side effects */ - break; - } -} - -DUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__resolve_target_fastpath_check(duk_hthread *thr, duk_idx_t idx_func, duk_hobject **out_func, duk_small_uint_t call_flags) { -#if defined(DUK_USE_PREFER_SIZE) - DUK_UNREF(thr); - DUK_UNREF(idx_func); - DUK_UNREF(out_func); - DUK_UNREF(call_flags); -#else /* DUK_USE_PREFER_SIZE */ - duk_tval *tv_func; - duk_hobject *func; - - if (DUK_UNLIKELY(call_flags & DUK_CALL_FLAG_CONSTRUCT)) { - return 0; - } - - tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); - DUK_ASSERT(tv_func != NULL); - - if (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv_func))) { - func = DUK_TVAL_GET_OBJECT(tv_func); - if (DUK_HOBJECT_IS_CALLABLE(func) && - !DUK_HOBJECT_HAS_BOUNDFUNC(func) && - !DUK_HOBJECT_HAS_SPECIAL_CALL(func)) { - *out_func = func; - - if (DUK_HOBJECT_HAS_STRICT(func)) { - /* Strict function: no 'this' coercion. */ - return 1; - } - - duk__coerce_nonstrict_this_binding(thr, idx_func + 1); - return 1; - } - } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { - *out_func = NULL; - - /* Lightfuncs are considered strict, so 'this' binding is - * used as is. They're never bound, always constructable, - * and never special functions. - */ - return 1; - } -#endif /* DUK_USE_PREFER_SIZE */ - return 0; /* let slow path deal with it */ -} - -DUK_LOCAL duk_hobject *duk__resolve_target_func_and_this_binding(duk_hthread *thr, - duk_idx_t idx_func, - duk_small_uint_t *call_flags) { - duk_tval *tv_func; - duk_hobject *func; - duk_bool_t first; - - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - - for (first = 1;; first = 0) { - DUK_ASSERT(duk_get_top(thr) >= idx_func + 2); - - tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); - DUK_ASSERT(tv_func != NULL); - - if (DUK_TVAL_IS_OBJECT(tv_func)) { - func = DUK_TVAL_GET_OBJECT(tv_func); - - if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { - if (DUK_UNLIKELY(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func))) { - goto not_constructable; - } - } else { - if (DUK_UNLIKELY(!DUK_HOBJECT_IS_CALLABLE(func))) { - goto not_callable; - } - } - - if (DUK_LIKELY(!DUK_HOBJECT_HAS_BOUNDFUNC(func) && - !DUK_HOBJECT_HAS_SPECIAL_CALL(func) && - !DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func))) { - /* Common case, so test for using a single bitfield test. - * Break out to handle this coercion etc. - */ - break; - } - - /* XXX: could set specialcall for boundfuncs too, simplify check above */ - - if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { - DUK_ASSERT(!DUK_HOBJECT_HAS_SPECIAL_CALL(func)); - DUK_ASSERT(!DUK_HOBJECT_IS_NATFUNC(func)); - - /* Callable/constructable flags are the same - * for the bound function and its target, so - * we don't need to check them here, we can - * check them from the target only. - */ - duk__handle_bound_chain_for_call(thr, idx_func, *call_flags & DUK_CALL_FLAG_CONSTRUCT); - - DUK_ASSERT(DUK_TVAL_IS_OBJECT(duk_require_tval(thr, idx_func)) || - DUK_TVAL_IS_LIGHTFUNC(duk_require_tval(thr, idx_func))); - } else { - DUK_ASSERT(DUK_HOBJECT_HAS_SPECIAL_CALL(func)); - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func)) { - /* If no trap, resume processing from Proxy trap. - * If trap exists, helper converts call into a trap - * call; this may change a constructor call into a - * normal (non-constructor) trap call. We must - * continue processing even when a trap is found as - * the trap may be bound. - */ - duk__handle_proxy_for_call(thr, idx_func, (duk_hproxy *) func, call_flags); - } - else -#endif - { - DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func)); - DUK_ASSERT(DUK_HOBJECT_HAS_CALLABLE(func)); - DUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func)); - /* Constructable check already done above. */ - - if (duk__handle_specialfuncs_for_call(thr, idx_func, func, call_flags, first) != 0) { - /* Encountered native eval call, normal call - * context. Break out, handle this coercion etc. - */ - break; - } - } - } - /* Retry loop. */ - } else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) { - /* Lightfuncs are: - * - Always strict, so no 'this' coercion. - * - Always callable. - * - Always constructable. - * - Never specialfuncs. - */ - func = NULL; - goto finished; - } else { - goto not_callable; - } - } - - DUK_ASSERT(func != NULL); - - if (!DUK_HOBJECT_HAS_STRICT(func)) { - /* Non-strict target needs 'this' coercion. - * This has potential side effects invalidating - * 'tv_func'. - */ - duk__coerce_nonstrict_this_binding(thr, idx_func + 1); - } - if (*call_flags & DUK_CALL_FLAG_CONSTRUCT) { - if (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) { - *call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED; - duk__update_default_instance_proto(thr, idx_func); - } - } - - finished: - -#if defined(DUK_USE_ASSERTIONS) - { - duk_tval *tv_tmp; - - tv_tmp = duk_get_tval(thr, idx_func); - DUK_ASSERT(tv_tmp != NULL); - - DUK_ASSERT((DUK_TVAL_IS_OBJECT(tv_tmp) && DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(tv_tmp))) || - DUK_TVAL_IS_LIGHTFUNC(tv_tmp)); - DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); - DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) || - DUK_HOBJECT_IS_NATFUNC(func))); - DUK_ASSERT(func == NULL || (DUK_HOBJECT_HAS_CONSTRUCTABLE(func) || - (*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0)); - } -#endif - - return func; - - not_callable: - DUK_ASSERT(tv_func != NULL); - -#if defined(DUK_USE_VERBOSE_ERRORS) - /* GETPROPC delayed error handling: when target is not callable, - * GETPROPC replaces idx_func+0 with an Error (non-callable) with - * a hidden Symbol to signify it's to be thrown as is here. The - * hidden Symbol is only checked as an own property, not inherited - * (which would be dangerous). - */ - if (DUK_TVAL_IS_OBJECT(tv_func)) { - if (duk_hobject_find_existing_entry_tval_ptr(thr->heap, DUK_TVAL_GET_OBJECT(tv_func), DUK_HTHREAD_STRING_INT_TARGET(thr)) != NULL) { - duk_push_tval(thr, tv_func); - (void) duk_throw(thr); - } - } -#endif - -#if defined(DUK_USE_VERBOSE_ERRORS) -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_get_type_name(thr, idx_func)); -#else - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not callable", duk_push_string_tval_readable(thr, tv_func)); -#endif -#else - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE); -#endif - DUK_UNREACHABLE(); - return NULL; /* never executed */ - - not_constructable: - /* For now GETPROPC delayed error not needed for constructor calls. */ -#if defined(DUK_USE_VERBOSE_ERRORS) -#if defined(DUK_USE_PARANOID_ERRORS) - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_get_type_name(thr, idx_func)); -#else - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "%s not constructable", duk_push_string_tval_readable(thr, tv_func)); -#endif -#else - DUK_ERROR_TYPE(thr, DUK_STR_NOT_CONSTRUCTABLE); -#endif - DUK_UNREACHABLE(); - return NULL; /* never executed */ -} - -/* - * Manipulate value stack so that exactly 'num_stack_rets' return - * values are at 'idx_retbase' in every case, assuming there are - * 'rc' return values on top of stack. - * - * This is a bit tricky, because the called C function operates in - * the same activation record and may have e.g. popped the stack - * empty (below idx_retbase). - */ - -DUK_LOCAL void duk__safe_call_adjust_valstack(duk_hthread *thr, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, duk_idx_t num_actual_rets) { - duk_idx_t idx_rcbase; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(idx_retbase >= 0); - DUK_ASSERT(num_stack_rets >= 0); - DUK_ASSERT(num_actual_rets >= 0); - - idx_rcbase = duk_get_top(thr) - num_actual_rets; /* base of known return values */ - if (DUK_UNLIKELY(idx_rcbase < 0)) { - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC); - } - - DUK_DDD(DUK_DDDPRINT("adjust valstack after func call: " - "num_stack_rets=%ld, num_actual_rets=%ld, stack_top=%ld, idx_retbase=%ld, idx_rcbase=%ld", - (long) num_stack_rets, (long) num_actual_rets, (long) duk_get_top(thr), - (long) idx_retbase, (long) idx_rcbase)); - - DUK_ASSERT(idx_rcbase >= 0); /* caller must check */ - - /* Space for num_stack_rets was reserved before the safe call. - * Because value stack reserve cannot shrink except in call returns, - * the reserve is still in place. Adjust valstack, carefully - * ensuring we don't overstep the reserve. - */ - - /* Match idx_rcbase with idx_retbase so that the return values - * start at the correct index. - */ - if (idx_rcbase > idx_retbase) { - duk_idx_t count = idx_rcbase - idx_retbase; - - DUK_DDD(DUK_DDDPRINT("elements at/after idx_retbase have enough to cover func retvals " - "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase)); - - /* Remove values between irc_rcbase (start of intended return - * values) and idx_retbase to lower return values to idx_retbase. - */ - DUK_ASSERT(count > 0); - duk_remove_n(thr, idx_retbase, count); /* may be NORZ */ - } else { - duk_idx_t count = idx_retbase - idx_rcbase; - - DUK_DDD(DUK_DDDPRINT("not enough elements at/after idx_retbase to cover func retvals " - "(idx_retbase=%ld, idx_rcbase=%ld)", (long) idx_retbase, (long) idx_rcbase)); - - /* Insert 'undefined' at idx_rcbase (start of intended return - * values) to lift return values to idx_retbase. - */ - DUK_ASSERT(count >= 0); - DUK_ASSERT(thr->valstack_end - thr->valstack_top >= count); /* reserve cannot shrink */ - duk_insert_undefined_n(thr, idx_rcbase, count); - } - - /* Chop extra retvals away / extend with undefined. */ - duk_set_top_unsafe(thr, idx_retbase + num_stack_rets); -} - -/* - * Activation setup for tailcalls and non-tailcalls. - */ - -#if defined(DUK_USE_TAILCALL) -DUK_LOCAL duk_small_uint_t duk__call_setup_act_attempt_tailcall(duk_hthread *thr, - duk_small_uint_t call_flags, - duk_idx_t idx_func, - duk_hobject *func, - duk_size_t entry_valstack_bottom_byteoff, - duk_size_t entry_valstack_end_byteoff, - duk_idx_t *out_nargs, - duk_idx_t *out_nregs, - duk_size_t *out_vs_min_bytes, - duk_activation **out_act) { - duk_activation *act; - duk_tval *tv1, *tv2; - duk_idx_t idx_args; - duk_small_uint_t flags1, flags2; -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_activation *prev_pause_act; -#endif - - DUK_UNREF(entry_valstack_end_byteoff); - - /* Tailcall cannot be flagged to resume calls, and a - * previous frame must exist. - */ - DUK_ASSERT(thr->callstack_top >= 1); - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - *out_act = act; - - if (func == NULL || !DUK_HOBJECT_IS_COMPFUNC(func)) { - DUK_DDD(DUK_DDDPRINT("tail call prevented by target not being ecma function")); - return 0; - } - if (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) { - DUK_DDD(DUK_DDDPRINT("tail call prevented by current activation having DUK_ACT_FLAG_PREVENT_YIELD")); - return 0; - } - /* Tailcall is only allowed if current and candidate - * function have identical return value handling. There - * are three possible return value handling cases: - * 1. Normal function call, no special return value handling. - * 2. Constructor call, return value replacement object check. - * 3. Proxy 'construct' trap call, return value invariant check. - */ - flags1 = (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT) ? 1 : 0) -#if defined(DUK_USE_ES6_PROXY) - | (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) ? 2 : 0) -#endif - ; - flags2 = (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) ? 1 : 0) -#if defined(DUK_USE_ES6_PROXY) - | (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) ? 2 : 0); -#endif - ; - if (flags1 != flags2) { - DUK_DDD(DUK_DDDPRINT("tail call prevented by incompatible return value handling")); - return 0; - } - DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT) && (call_flags & DUK_CALL_FLAG_CONSTRUCT)) || - (!(act->flags & DUK_ACT_FLAG_CONSTRUCT) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT))); - DUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)) || - (!(act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY))); - if (DUK_HOBJECT_HAS_NOTAIL(func)) { - /* See: test-bug-tailcall-preventyield-assert.c. */ - DUK_DDD(DUK_DDDPRINT("tail call prevented by function having a notail flag")); - return 0; - } - - /* - * Tailcall handling - * - * Although the callstack entry is reused, we need to explicitly unwind - * the current activation (or simulate an unwind). In particular, the - * current activation must be closed, otherwise something like - * test-bug-reduce-judofyr.js results. Also catchers need to be unwound - * because there may be non-error-catching label entries in valid tail calls. - * - * Special attention is needed for debugger and pause behavior when - * reusing an activation. - * - Disable StepOut processing for the activation unwind because - * we reuse the activation, see: - * https://github.com/svaarala/duktape/issues/1684. - * - Disable line change pause flag permanently if act == dbg_pause_act - * (if set) because it would no longer be relevant, see: - * https://github.com/svaarala/duktape/issues/1726, - * https://github.com/svaarala/duktape/issues/1786. - * - Check for function entry (e.g. StepInto) pause flag here, because - * the executor pause check won't trigger due to shared activation, see: - * https://github.com/svaarala/duktape/issues/1726. - */ - - DUK_DDD(DUK_DDDPRINT("is tail call, reusing activation at callstack top, at index %ld", - (long) (thr->callstack_top - 1))); - - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); - DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(func)); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); - DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); - DUK_ASSERT(call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA); - - /* Unwind the topmost callstack entry before reusing it. This - * also unwinds the catchers related to the topmost entry. - */ - DUK_ASSERT(thr->callstack_top > 0); - DUK_ASSERT(thr->callstack_curr != NULL); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (act == thr->heap->dbg_pause_act) { - thr->heap->dbg_pause_flags &= ~DUK_PAUSE_FLAG_LINE_CHANGE; - } - - prev_pause_act = thr->heap->dbg_pause_act; - thr->heap->dbg_pause_act = NULL; - if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry (tailcall)")); - duk_debug_set_paused(thr->heap); - } -#endif - duk_hthread_activation_unwind_reuse_norz(thr); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - thr->heap->dbg_pause_act = prev_pause_act; -#endif - DUK_ASSERT(act == thr->callstack_curr); - - /* XXX: We could restore the caller's value stack reserve - * here, as if we did an actual unwind-and-call. Without - * the restoration, value stack reserve may remain higher - * than would otherwise be possible until we return to a - * non-tailcall. - */ - - /* Then reuse the unwound activation. */ - act->cat = NULL; - act->var_env = NULL; - act->lex_env = NULL; - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); - act->func = func; /* don't want an intermediate exposed state with func == NULL */ -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - act->prev_caller = NULL; -#endif - /* don't want an intermediate exposed state with invalid pc */ - act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - act->prev_line = 0; -#endif - DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */ - DUK_HOBJECT_INCREF(thr, func); - - act->flags = DUK_ACT_FLAG_TAILCALLED; - if (DUK_HOBJECT_HAS_STRICT(func)) { - act->flags |= DUK_ACT_FLAG_STRICT; - } - if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { - act->flags |= DUK_ACT_FLAG_CONSTRUCT; - } -#if defined(DUK_USE_ES6_PROXY) - if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) { - act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY; - } -#endif - - DUK_ASSERT(DUK_ACT_GET_FUNC(act) == func); /* already updated */ - DUK_ASSERT(act->var_env == NULL); - DUK_ASSERT(act->lex_env == NULL); - act->bottom_byteoff = entry_valstack_bottom_byteoff; /* tail call -> reuse current "frame" */ -#if 0 - /* Topmost activation retval_byteoff is considered garbage, no need to init. */ - act->retval_byteoff = 0; -#endif - /* Filled in when final reserve is known, dummy value doesn't matter - * even in error unwind because reserve_byteoff is only used when - * returning to -this- activation. - */ - act->reserve_byteoff = 0; - - /* - * Manipulate valstack so that args are on the current bottom and the - * previous caller's 'this' binding (which is the value preceding the - * current bottom) is replaced with the new 'this' binding: - * - * [ ... this_old | (crud) func this_new arg1 ... argN ] - * --> [ ... this_new | arg1 ... argN ] - * - * For tail calling to work properly, the valstack bottom must not grow - * here; otherwise crud would accumulate on the valstack. - */ - - tv1 = thr->valstack_bottom - 1; - tv2 = thr->valstack_bottom + idx_func + 1; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); /* tv1 is -below- valstack_bottom */ - DUK_ASSERT(tv2 >= thr->valstack_bottom && tv2 < thr->valstack_top); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ - - idx_args = idx_func + 2; - duk_remove_n(thr, 0, idx_args); /* may be NORZ */ - - idx_func = 0; DUK_UNREF(idx_func); /* really 'not applicable' anymore, should not be referenced after this */ - idx_args = 0; - - *out_nargs = ((duk_hcompfunc *) func)->nargs; - *out_nregs = ((duk_hcompfunc *) func)->nregs; - DUK_ASSERT(*out_nregs >= 0); - DUK_ASSERT(*out_nregs >= *out_nargs); - *out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA); - - -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) -#if defined(DUK_USE_TAILCALL) -#error incorrect options: tail calls enabled with function caller property -#endif - /* XXX: This doesn't actually work properly for tail calls, so - * tail calls are disabled when DUK_USE_NONSTD_FUNC_CALLER_PROPERTY - * is in use. - */ - duk__update_func_caller_prop(thr, func); -#endif - - /* [ ... this_new | arg1 ... argN ] */ - - return 1; -} -#endif /* DUK_USE_TAILCALL */ - -DUK_LOCAL void duk__call_setup_act_not_tailcall(duk_hthread *thr, - duk_small_uint_t call_flags, - duk_idx_t idx_func, - duk_hobject *func, - duk_size_t entry_valstack_bottom_byteoff, - duk_size_t entry_valstack_end_byteoff, - duk_idx_t *out_nargs, - duk_idx_t *out_nregs, - duk_size_t *out_vs_min_bytes, - duk_activation **out_act) { - duk_activation *act; - duk_activation *new_act; - - DUK_UNREF(entry_valstack_end_byteoff); - - DUK_DDD(DUK_DDDPRINT("not a tail call, pushing a new activation to callstack, to index %ld", - (long) (thr->callstack_top))); - - duk__call_callstack_limit_check(thr); - new_act = duk_hthread_activation_alloc(thr); - DUK_ASSERT(new_act != NULL); - - act = thr->callstack_curr; - if (act != NULL) { - /* - * Update return value stack index of current activation (if any). - * - * Although it might seem this is not necessary (bytecode executor - * does this for Ecmascript-to-Ecmascript calls; other calls are - * handled here), this turns out to be necessary for handling yield - * and resume. For them, an Ecmascript-to-native call happens, and - * the Ecmascript call's retval_byteoff must be set for things to work. - */ - - act->retval_byteoff = entry_valstack_bottom_byteoff + (duk_size_t) idx_func * sizeof(duk_tval); - } - - new_act->parent = act; - thr->callstack_curr = new_act; - thr->callstack_top++; - act = new_act; - *out_act = act; - - DUK_ASSERT(thr->valstack_top > thr->valstack_bottom); /* at least effective 'this' */ - DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); - - act->cat = NULL; - - act->flags = 0; - if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { - act->flags |= DUK_ACT_FLAG_CONSTRUCT; - } -#if defined(DUK_USE_ES6_PROXY) - if (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) { - act->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY; - } -#endif - if (call_flags & DUK_CALL_FLAG_DIRECT_EVAL) { - act->flags |= DUK_ACT_FLAG_DIRECT_EVAL; - } - - /* start of arguments: idx_func + 2. */ - act->func = func; /* NULL for lightfunc */ - if (DUK_LIKELY(func != NULL)) { - DUK_TVAL_SET_OBJECT(&act->tv_func, func); /* borrowed, no refcount */ - if (DUK_HOBJECT_HAS_STRICT(func)) { - act->flags |= DUK_ACT_FLAG_STRICT; - } - if (DUK_HOBJECT_IS_COMPFUNC(func)) { - *out_nargs = ((duk_hcompfunc *) func)->nargs; - *out_nregs = ((duk_hcompfunc *) func)->nregs; - DUK_ASSERT(*out_nregs >= 0); - DUK_ASSERT(*out_nregs >= *out_nargs); - *out_vs_min_bytes = entry_valstack_bottom_byteoff + - sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA); - } else { - /* True because of call target lookup checks. */ - DUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func)); - - *out_nargs = ((duk_hnatfunc *) func)->nargs; - *out_nregs = *out_nargs; - if (*out_nargs >= 0) { - *out_vs_min_bytes = entry_valstack_bottom_byteoff + - sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); - } else { - /* Vararg function. */ - duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack)); - *out_vs_min_bytes = valstack_top_byteoff + - sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); - } - } - } else { - duk_small_uint_t lf_flags; - duk_tval *tv_func; - - act->flags |= DUK_ACT_FLAG_STRICT; - - tv_func = DUK_GET_TVAL_POSIDX(thr, idx_func); - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func)); - DUK_TVAL_SET_TVAL(&act->tv_func, tv_func); /* borrowed, no refcount */ - - lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv_func); - *out_nargs = DUK_LFUNC_FLAGS_GET_NARGS(lf_flags); - if (*out_nargs != DUK_LFUNC_NARGS_VARARGS) { - *out_vs_min_bytes = entry_valstack_bottom_byteoff + - sizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nargs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); - } else { - duk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack)); - *out_vs_min_bytes = valstack_top_byteoff + - sizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); - *out_nargs = -1; /* vararg */ - } - *out_nregs = *out_nargs; - } - - act->var_env = NULL; - act->lex_env = NULL; -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - act->prev_caller = NULL; -#endif - act->curr_pc = NULL; -#if defined(DUK_USE_DEBUGGER_SUPPORT) - act->prev_line = 0; -#endif - act->bottom_byteoff = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U); -#if 0 - act->retval_byteoff = 0; /* topmost activation retval_byteoff is considered garbage, no need to init */ -#endif - /* Filled in when final reserve is known, dummy value doesn't matter - * even in error unwind because reserve_byteoff is only used when - * returning to -this- activation. - */ - act->reserve_byteoff = 0; /* filled in by caller */ - - /* XXX: Is this INCREF necessary? 'func' is always a borrowed - * reference reachable through the value stack? If changed, stack - * unwind code also needs to be fixed to match. - */ - DUK_HOBJECT_INCREF_ALLOWNULL(thr, func); /* act->func */ - -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - if (func) { - duk__update_func_caller_prop(thr, func); - } -#endif -} - -/* - * Environment setup. - */ - -DUK_LOCAL void duk__call_env_setup(duk_hthread *thr, duk_hobject *func, duk_activation *act, duk_idx_t idx_args) { - duk_hobject *env; - - DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound function has already been resolved */ - - if (DUK_LIKELY(func != NULL)) { - if (DUK_LIKELY(DUK_HOBJECT_HAS_NEWENV(func))) { - if (DUK_LIKELY(!DUK_HOBJECT_HAS_CREATEARGS(func))) { - /* Use a new environment but there's no 'arguments' object; - * delayed environment initialization. This is the most - * common case. - */ - DUK_ASSERT(act->lex_env == NULL); - DUK_ASSERT(act->var_env == NULL); - } else { - /* Use a new environment and there's an 'arguments' object. - * We need to initialize it right now. - */ - - /* third arg: absolute index (to entire valstack) of bottom_byteoff of new activation */ - env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff); - DUK_ASSERT(env != NULL); - - /* [ ... func this arg1 ... argN envobj ] */ - - DUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func)); - duk__handle_createargs_for_call(thr, func, env, idx_args); - - /* [ ... func this arg1 ... argN envobj ] */ - - act->lex_env = env; - act->var_env = env; - DUK_HOBJECT_INCREF(thr, env); - DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (2) directly */ - duk_pop(thr); - } - } else { - /* Use existing env (e.g. for non-strict eval); cannot have - * an own 'arguments' object (but can refer to an existing one). - */ - - DUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func)); - - duk__handle_oldenv_for_call(thr, func, act); - - DUK_ASSERT(act->lex_env != NULL); - DUK_ASSERT(act->var_env != NULL); - } - } else { - /* Lightfuncs are always native functions and have "newenv". */ - DUK_ASSERT(act->lex_env == NULL); - DUK_ASSERT(act->var_env == NULL); - } -} - -/* - * Misc shared helpers. - */ - -/* Check thread state, update current thread. */ -DUK_LOCAL void duk__call_thread_state_update(duk_hthread *thr) { - DUK_ASSERT(thr != NULL); - - if (DUK_LIKELY(thr == thr->heap->curr_thread)) { - if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_RUNNING)) { - /* Should actually never happen, but check anyway. */ - goto thread_state_error; - } - } else { - DUK_ASSERT(thr->heap->curr_thread == NULL || - thr->heap->curr_thread->state == DUK_HTHREAD_STATE_RUNNING); - if (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_INACTIVE)) { - goto thread_state_error; - } - DUK_HEAP_SWITCH_THREAD(thr->heap, thr); - thr->state = DUK_HTHREAD_STATE_RUNNING; - - /* Multiple threads may be simultaneously in the RUNNING - * state, but not in the same "resume chain". - */ - } - DUK_ASSERT(thr->heap->curr_thread == thr); - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); - return; - - thread_state_error: - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "invalid thread state (%ld)", (long) thr->state); - DUK_UNREACHABLE(); -} - -/* - * Main unprotected call handler, handles: - * - * - All combinations of native/Ecmascript caller and native/Ecmascript - * target. - * - * - Optimized Ecmascript-to-Ecmascript call where call handling only - * sets up a new duk_activation but reuses an existing bytecode executor - * (the caller) without native recursion. - * - * - Tailcalls, where an activation is reused without increasing call - * stack (duk_activation) depth. - * - * - Setup for an initial Duktape.Thread.resume(). - * - * The call handler doesn't provide any protection guarantees, protected calls - * must be implemented e.g. by wrapping the call in a duk_safe_call(). - * Call setup may fail at any stage, even when the new activation is in - * place; the only guarantee is that the state is consistent for unwinding. - */ - -DUK_LOCAL duk_int_t duk__handle_call_raw(duk_hthread *thr, - duk_idx_t idx_func, - duk_small_uint_t call_flags) { -#if defined(DUK_USE_ASSERTIONS) - duk_activation *entry_act; - duk_size_t entry_callstack_top; -#endif - duk_size_t entry_valstack_bottom_byteoff; - duk_size_t entry_valstack_end_byteoff; - duk_int_t entry_call_recursion_depth; - duk_hthread *entry_curr_thread; - duk_uint_fast8_t entry_thread_state; - duk_instr_t **entry_ptr_curr_pc; - duk_idx_t idx_args; - duk_idx_t nargs; /* # argument registers target function wants (< 0 => "as is") */ - duk_idx_t nregs; /* # total registers target function wants on entry (< 0 => "as is") */ - duk_size_t vs_min_bytes; /* minimum value stack size (bytes) for handling call */ - duk_hobject *func; /* 'func' on stack (borrowed reference) */ - duk_activation *act; - duk_ret_t rc; - duk_small_uint_t use_tailcall; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - /* Asserts for heap->curr_thread omitted: it may be NULL, 'thr', or - * any other thread (e.g. when heap thread is used to run finalizers). - */ - DUK_ASSERT_CTX_VALID(thr); - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - DUK_ASSERT(idx_func >= 0); - - DUK_STATS_INC(thr->heap, stats_call_all); - - /* If a tail call: - * - an Ecmascript activation must be on top of the callstack - * - there cannot be any catch stack entries that would catch - * a return - */ -#if defined(DUK_USE_ASSERTIONS) - if (call_flags & DUK_CALL_FLAG_TAILCALL) { - duk_activation *tmp_act; - duk_catcher *tmp_cat; - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - - /* No entry in the catch stack which would actually catch a - * throw can refer to the callstack entry being reused. - * There *can* be catch stack entries referring to the current - * callstack entry as long as they don't catch (e.g. label sites). - */ - - tmp_act = thr->callstack_curr; - for (tmp_cat = tmp_act->cat; tmp_cat != NULL; tmp_cat = tmp_cat->parent) { - DUK_ASSERT(DUK_CAT_GET_TYPE(tmp_cat) == DUK_CAT_TYPE_LABEL); /* a non-catching entry */ - } - } -#endif /* DUK_USE_ASSERTIONS */ - - /* - * Store entry state. - */ - -#if defined(DUK_USE_ASSERTIONS) - entry_act = thr->callstack_curr; - entry_callstack_top = thr->callstack_top; -#endif - entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); - entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); - entry_call_recursion_depth = thr->heap->call_recursion_depth; - entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */ - entry_thread_state = thr->state; - entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */ - - /* If thr->ptr_curr_pc is set, sync curr_pc to act->pc. Then NULL - * thr->ptr_curr_pc so that it's not accidentally used with an incorrect - * activation when side effects occur. - */ - duk_hthread_sync_and_null_currpc(thr); - DUK_ASSERT(thr->ptr_curr_pc == NULL); - - DUK_DD(DUK_DDPRINT("duk__handle_call_raw: thr=%p, idx_func=%ld, " - "call_flags=0x%08lx (constructor=%ld), " - "valstack_top=%ld, idx_func=%ld, idx_args=%ld, rec_depth=%ld/%ld, " - "entry_valstack_bottom_byteoff=%ld, entry_valstack_end_byteoff=%ld, " - "entry_call_recursion_depth=%ld, " - "entry_curr_thread=%p, entry_thread_state=%ld", - (void *) thr, - (long) idx_func, - (unsigned long) call_flags, - (long) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) != 0 ? 1 : 0), - (long) duk_get_top(thr), - (long) idx_func, - (long) (idx_func + 2), - (long) thr->heap->call_recursion_depth, - (long) thr->heap->call_recursion_limit, - (long) entry_valstack_bottom_byteoff, - (long) entry_valstack_end_byteoff, - (long) entry_call_recursion_depth, - (void *) entry_curr_thread, - (long) entry_thread_state)); - - /* - * Thread state check and book-keeping. - */ - - duk__call_thread_state_update(thr); - - /* - * Resolve final target function; handle bound functions and special - * functions like .call() and .apply(). Also figure out the effective - * 'this' binding, which replaces the current value at idx_func + 1. - */ - - if (DUK_LIKELY(duk__resolve_target_fastpath_check(thr, idx_func, &func, call_flags) != 0U)) { - DUK_DDD(DUK_DDDPRINT("fast path target resolve")); - } else { - DUK_DDD(DUK_DDDPRINT("slow path target resolve")); - func = duk__resolve_target_func_and_this_binding(thr, idx_func, &call_flags); - } - DUK_ASSERT(duk_get_top(thr) - idx_func >= 2); /* at least func and this present */ - - DUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func)); - DUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) || - DUK_HOBJECT_IS_NATFUNC(func))); - - /* [ ... func this arg1 ... argN ] */ - - /* - * Setup a preliminary activation and figure out nargs/nregs and - * value stack minimum size. - * - * Don't touch valstack_bottom or valstack_top yet so that Duktape API - * calls work normally. - * - * Because 'act' is not zeroed, all fields must be filled in. - */ - -#if defined(DUK_USE_TAILCALL) - use_tailcall = (call_flags & DUK_CALL_FLAG_TAILCALL); - if (use_tailcall) { - use_tailcall = duk__call_setup_act_attempt_tailcall(thr, - call_flags, - idx_func, - func, - entry_valstack_bottom_byteoff, - entry_valstack_end_byteoff, - &nargs, - &nregs, - &vs_min_bytes, - &act); - } -#else - DUK_ASSERT((call_flags & DUK_CALL_FLAG_TAILCALL) == 0); /* compiler ensures this */ - use_tailcall = 0; -#endif - - if (use_tailcall) { - idx_args = 0; - DUK_STATS_INC(thr->heap, stats_call_tailcall); - } else { - duk__call_setup_act_not_tailcall(thr, - call_flags, - idx_func, - func, - entry_valstack_bottom_byteoff, - entry_valstack_end_byteoff, - &nargs, - &nregs, - &vs_min_bytes, - &act); - idx_args = idx_func + 2; - } - /* After this point idx_func is no longer valid for tailcalls. */ - - DUK_ASSERT(act != NULL); - - /* [ ... func this arg1 ... argN ] */ - - /* - * Environment record creation and 'arguments' object creation. - * Named function expression name binding is handled by the - * compiler; the compiled function's parent env will contain - * the (immutable) binding already. - * - * This handling is now identical for C and Ecmascript functions. - * C functions always have the 'NEWENV' flag set, so their - * environment record initialization is delayed (which is good). - * - * Delayed creation (on demand) is handled in duk_js_var.c. - */ - - duk__call_env_setup(thr, func, act, idx_args); - - /* [ ... func this arg1 ... argN ] */ - - /* - * Setup value stack: clamp to 'nargs', fill up to 'nregs', - * ensure value stack size matches target requirements, and - * switch value stack bottom. Valstack top is kept. - * - * Value stack can only grow here. - */ - - duk_valstack_grow_check_throw(thr, vs_min_bytes); - act->reserve_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); - - if (use_tailcall) { - DUK_ASSERT(nregs >= 0); - DUK_ASSERT(nregs >= nargs); - duk_set_top_and_wipe(thr, nregs, nargs); - } else { - if (nregs >= 0) { - DUK_ASSERT(nregs >= nargs); - duk_set_top_and_wipe(thr, idx_func + 2 + nregs, idx_func + 2 + nargs); - } else { - ; - } - thr->valstack_bottom = thr->valstack_bottom + idx_func + 2; - } - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - - /* - * Make the actual call. For Ecma-to-Ecma calls detect that - * setup is complete, then return with a status code that allows - * the caller to reuse the running executor. - */ - - if (func != NULL && DUK_HOBJECT_IS_COMPFUNC(func)) { - /* - * Ecmascript call. - */ - - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func)); - act->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func); - - if (call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA) { - DUK_DD(DUK_DDPRINT("avoid native call, use existing executor")); - DUK_STATS_INC(thr->heap, stats_call_ecmatoecma); - DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); - DUK_REFZERO_CHECK_FAST(thr); - DUK_ASSERT(thr->ptr_curr_pc == NULL); - return 1; /* 1=reuse executor */ - } - DUK_ASSERT(use_tailcall == 0); - - /* duk_hthread_activation_unwind_norz() will decrease this on unwind */ - DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); - act->flags |= DUK_ACT_FLAG_PREVENT_YIELD; - thr->callstack_preventcount++; - - /* XXX: we could just do this on entry regardless of reuse, as long - * as recursion depth is decreased for e2e case. - */ - duk__call_c_recursion_limit_check(thr); - thr->heap->call_recursion_depth++; - - /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */ - - /* - * Bytecode executor call. - * - * Execute bytecode, handling any recursive function calls and - * thread resumptions. Returns when execution would return from - * the entry level activation. When the executor returns, a - * single return value is left on the stack top. - * - * The only possible longjmp() is an error (DUK_LJ_TYPE_THROW), - * other types are handled internally by the executor. - */ - - /* thr->ptr_curr_pc is set by bytecode executor early on entry */ - DUK_ASSERT(thr->ptr_curr_pc == NULL); - DUK_DDD(DUK_DDDPRINT("entering bytecode execution")); - duk_js_execute_bytecode(thr); - DUK_DDD(DUK_DDDPRINT("returned from bytecode execution")); - } else { - /* - * Native call. - */ - - DUK_ASSERT(func == NULL || ((duk_hnatfunc *) func)->func != NULL); - DUK_ASSERT(use_tailcall == 0); - - /* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */ - - /* duk_hthread_activation_unwind_norz() will decrease this on unwind */ - DUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0); - act->flags |= DUK_ACT_FLAG_PREVENT_YIELD; - thr->callstack_preventcount++; - - /* XXX: we could just do this on entry regardless of reuse, as long - * as recursion depth is decreased for e2e case. - */ - duk__call_c_recursion_limit_check(thr); - thr->heap->call_recursion_depth++; - - /* For native calls must be NULL so we don't sync back */ - DUK_ASSERT(thr->ptr_curr_pc == NULL); - - /* XXX: native funcptr could come out of call setup. */ - if (func) { - rc = ((duk_hnatfunc *) func)->func(thr); - } else { - duk_tval *tv_func; - duk_c_function funcptr; - - tv_func = &act->tv_func; - DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func)); - funcptr = DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv_func); - rc = funcptr(thr); - } - - /* Automatic error throwing, retval check. */ - - if (rc == 0) { - DUK_ASSERT(thr->valstack < thr->valstack_end); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); - thr->valstack_top++; - } else if (rc == 1) { - ; - } else if (rc < 0) { - duk_error_throw_from_negative_rc(thr, rc); - DUK_UNREACHABLE(); - } else { - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC); - } - } - DUK_ASSERT(thr->ptr_curr_pc == NULL); - DUK_ASSERT(use_tailcall == 0); - - /* - * Constructor call post processing. - */ - -#if defined(DUK_USE_ES6_PROXY) - if (call_flags & (DUK_CALL_FLAG_CONSTRUCT | DUK_CALL_FLAG_CONSTRUCT_PROXY)) { - duk_call_construct_postprocess(thr, call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY); - } -#else - if (call_flags & DUK_CALL_FLAG_CONSTRUCT) { - duk_call_construct_postprocess(thr, 0); - } -#endif - - /* - * Unwind, restore valstack bottom and other book-keeping. - */ - - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent == entry_act); - DUK_ASSERT(thr->callstack_top == entry_callstack_top + 1); - duk_hthread_activation_unwind_norz(thr); - DUK_ASSERT(thr->callstack_curr == entry_act); - DUK_ASSERT(thr->callstack_top == entry_callstack_top); - - thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff); - /* keep current valstack_top */ - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - DUK_ASSERT(thr->valstack_top - thr->valstack_bottom >= idx_func + 1); - - /* Return value handling. */ - - /* [ ... func this (crud) retval ] */ - - { - duk_tval *tv_ret; - duk_tval *tv_funret; - - tv_ret = thr->valstack_bottom + idx_func; - tv_funret = thr->valstack_top - 1; -#if defined(DUK_USE_FASTINT) - /* Explicit check for fastint downgrade. */ - DUK_TVAL_CHKFAST_INPLACE_FAST(tv_funret); -#endif - DUK_TVAL_SET_TVAL_UPDREF(thr, tv_ret, tv_funret); /* side effects */ - } - - duk_set_top_unsafe(thr, idx_func + 1); - - /* [ ... retval ] */ - - /* Restore caller's value stack reserve (cannot fail). */ - DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff >= (duk_uint8_t *) thr->valstack_top); - DUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff <= (duk_uint8_t *) thr->valstack_alloc_end); - thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff); - - /* XXX: Trial value stack shrink would be OK here, but we'd need - * to prevent side effects of the potential realloc. - */ - - /* Restore entry thread executor curr_pc stack frame pointer. */ - thr->ptr_curr_pc = entry_ptr_curr_pc; - - DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ - thr->state = (duk_uint8_t) entry_thread_state; - - /* Disabled assert: triggered with some torture tests. */ -#if 0 - DUK_ASSERT((thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread == NULL) || /* first call */ - (thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread != NULL) || /* other call */ - (thr->state == DUK_HTHREAD_STATE_RUNNING && thr->heap->curr_thread == thr)); /* current thread */ -#endif - - thr->heap->call_recursion_depth = entry_call_recursion_depth; - - /* If the debugger is active we need to force an interrupt so that - * debugger breakpoints are rechecked. This is important for function - * calls caused by side effects (e.g. when doing a DUK_OP_GETPROP), see - * GH-303. Only needed for success path, error path always causes a - * breakpoint recheck in the executor. It would be enough to set this - * only when returning to an Ecmascript activation, but setting the flag - * on every return should have no ill effect. - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (duk_debug_is_attached(thr->heap)) { - DUK_DD(DUK_DDPRINT("returning with debugger enabled, force interrupt")); - DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init); - thr->interrupt_init -= thr->interrupt_counter; - thr->interrupt_counter = 0; - thr->heap->dbg_force_restart = 1; - } -#endif - -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) - duk__interrupt_fixup(thr, entry_curr_thread); -#endif - - /* Restored by success path. */ - DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth); - DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc); - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - - DUK_REFZERO_CHECK_FAST(thr); - - return 0; /* 0=call handled inline */ -} - -DUK_INTERNAL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, - duk_idx_t nargs, - duk_small_uint_t call_flags) { - duk_idx_t idx_func; - DUK_ASSERT(duk_get_top(thr) >= nargs + 2); - idx_func = duk_get_top(thr) - (nargs + 2); - DUK_ASSERT(idx_func >= 0); - return duk_handle_call_unprotected(thr, idx_func, call_flags); -} - -DUK_INTERNAL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, - duk_idx_t idx_func, - duk_small_uint_t call_flags) { - DUK_ASSERT(duk_is_valid_index(thr, idx_func)); - DUK_ASSERT(idx_func >= 0); - return duk__handle_call_raw(thr, idx_func, call_flags); -} - -/* - * duk_handle_safe_call(): make a "C protected call" within the - * current activation. - * - * The allowed thread states for making a call are the same as for - * duk_handle_call_protected(). - * - * Even though this call is protected, errors are thrown for insane arguments - * and may result in a fatal error unless there's another protected call which - * catches such errors. - * - * The error handling path should be error free, even for out-of-memory - * errors, to ensure safe sandboxing. (As of Duktape 2.2.0 this is not - * yet the case for environment closing which may run out of memory, see - * XXX notes below.) - */ - -DUK_LOCAL void duk__handle_safe_call_inner(duk_hthread *thr, - duk_safe_call_function func, - void *udata, -#if defined(DUK_USE_ASSERTIONS) - duk_size_t entry_valstack_bottom_byteoff, - duk_size_t entry_callstack_top, -#endif - duk_hthread *entry_curr_thread, - duk_uint_fast8_t entry_thread_state, - duk_idx_t idx_retbase, - duk_idx_t num_stack_rets) { - duk_ret_t rc; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT_CTX_VALID(thr); - - /* - * Thread state check and book-keeping. - */ - - duk__call_thread_state_update(thr); - - /* - * Recursion limit check. - */ - - duk__call_c_recursion_limit_check(thr); - thr->heap->call_recursion_depth++; - - /* - * Make the C call. - */ - - rc = func(thr, udata); - - DUK_DDD(DUK_DDDPRINT("safe_call, func rc=%ld", (long) rc)); - - /* - * Valstack manipulation for results. - */ - - /* we're running inside the caller's activation, so no change in call/catch stack or valstack bottom */ - DUK_ASSERT(thr->callstack_top == entry_callstack_top); - DUK_ASSERT(thr->valstack_bottom >= thr->valstack); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff); - DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); - DUK_ASSERT(thr->valstack_end >= thr->valstack_top); - - if (DUK_UNLIKELY(rc < 0)) { - duk_error_throw_from_negative_rc(thr, rc); - } - DUK_ASSERT(rc >= 0); - - duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, rc); /* throws for insane rc */ - - DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ - thr->state = (duk_uint8_t) entry_thread_state; -} - -DUK_LOCAL void duk__handle_safe_call_error(duk_hthread *thr, - duk_activation *entry_act, -#if defined(DUK_USE_ASSERTIONS) - duk_size_t entry_callstack_top, -#endif - duk_hthread *entry_curr_thread, - duk_uint_fast8_t entry_thread_state, - duk_idx_t idx_retbase, - duk_idx_t num_stack_rets, - duk_size_t entry_valstack_bottom_byteoff, - duk_jmpbuf *old_jmpbuf_ptr) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT_CTX_VALID(thr); - - /* - * Error during call. The error value is at heap->lj.value1. - * - * The very first thing we do is restore the previous setjmp catcher. - * This means that any error in error handling will propagate outwards - * instead of causing a setjmp() re-entry above. - */ - - DUK_DDD(DUK_DDDPRINT("error caught during protected duk_handle_safe_call()")); - - /* Other longjmp types are handled by executor before propagating - * the error here. - */ - DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW); - DUK_ASSERT_LJSTATE_SET(thr->heap); - - /* Either pointer may be NULL (at entry), so don't assert. */ - thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr; - - /* XXX: callstack unwind may now throw an error when closing - * scopes; this is a sandboxing issue, described in: - * https://github.com/svaarala/duktape/issues/476 - */ - /* XXX: "unwind to" primitive? */ - - DUK_ASSERT(thr->callstack_top >= entry_callstack_top); - while (thr->callstack_curr != entry_act) { - DUK_ASSERT(thr->callstack_curr != NULL); - duk_hthread_activation_unwind_norz(thr); - } - DUK_ASSERT(thr->callstack_top == entry_callstack_top); - - /* Switch active thread before any side effects to avoid a - * dangling curr_thread pointer. - */ - DUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread); /* may be NULL */ - thr->state = (duk_uint8_t) entry_thread_state; - - DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread); - DUK_ASSERT(thr->state == entry_thread_state); - - /* Restore valstack bottom. */ - thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff); - - /* [ ... | (crud) ] */ - - /* XXX: ensure space in valstack (now relies on internal reserve)? */ - duk_push_tval(thr, &thr->heap->lj.value1); - - /* [ ... | (crud) errobj ] */ - - DUK_ASSERT(duk_get_top(thr) >= 1); /* at least errobj must be on stack */ - - duk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, 1); /* 1 = num actual 'return values' */ - - /* [ ... | ] or [ ... | errobj (M * undefined)] where M = num_stack_rets - 1 */ - - /* Reset longjmp state. */ - thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; - thr->heap->lj.iserror = 0; - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value1); - DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value2); - - /* Error handling complete, remove side effect protections. Caller - * will process pending finalizers. - */ -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(thr->heap->error_not_allowed == 1); - thr->heap->error_not_allowed = 0; -#endif - DUK_ASSERT(thr->heap->pf_prevent_count > 0); - thr->heap->pf_prevent_count--; - DUK_DD(DUK_DDPRINT("safe call error handled, pf_prevent_count updated to %ld", (long) thr->heap->pf_prevent_count)); - - /* thr->ptr_curr_pc is restored by - * duk__handle_safe_call_shared_unwind() which is also used for - * success path. - */ -} - -DUK_LOCAL void duk__handle_safe_call_shared_unwind(duk_hthread *thr, - duk_idx_t idx_retbase, - duk_idx_t num_stack_rets, -#if defined(DUK_USE_ASSERTIONS) - duk_size_t entry_callstack_top, -#endif - duk_int_t entry_call_recursion_depth, - duk_hthread *entry_curr_thread, - duk_instr_t **entry_ptr_curr_pc) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT_CTX_VALID(thr); - DUK_UNREF(idx_retbase); - DUK_UNREF(num_stack_rets); - DUK_UNREF(entry_curr_thread); - - DUK_ASSERT(thr->callstack_top == entry_callstack_top); - - /* Restore entry thread executor curr_pc stack frame pointer. - * XXX: would be enough to do in error path only, should nest - * cleanly in success path. - */ - thr->ptr_curr_pc = entry_ptr_curr_pc; - - thr->heap->call_recursion_depth = entry_call_recursion_depth; - - /* stack discipline consistency check */ - DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets); - - /* A debugger forced interrupt check is not needed here, as - * problematic safe calls are not caused by side effects. - */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) - duk__interrupt_fixup(thr, entry_curr_thread); -#endif -} - -DUK_INTERNAL duk_int_t duk_handle_safe_call(duk_hthread *thr, - duk_safe_call_function func, - void *udata, - duk_idx_t num_stack_args, - duk_idx_t num_stack_rets) { - duk_activation *entry_act; - duk_size_t entry_valstack_bottom_byteoff; -#if defined(DUK_USE_ASSERTIONS) - duk_size_t entry_valstack_end_byteoff; - duk_size_t entry_callstack_top; - duk_size_t entry_callstack_preventcount; -#endif - duk_int_t entry_call_recursion_depth; - duk_hthread *entry_curr_thread; - duk_uint_fast8_t entry_thread_state; - duk_instr_t **entry_ptr_curr_pc; - duk_jmpbuf *old_jmpbuf_ptr = NULL; - duk_jmpbuf our_jmpbuf; - duk_idx_t idx_retbase; - duk_int_t retval; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(duk_get_top(thr) >= num_stack_args); /* Caller ensures. */ - - DUK_STATS_INC(thr->heap, stats_safecall_all); - - /* Value stack reserve handling: safe call assumes caller has reserved - * space for nrets (assuming optimal unwind processing). Value stack - * reserve is not stored/restored as for normal calls because a safe - * call conceptually happens in the same activation. - */ - - /* Careful with indices like '-x'; if 'x' is zero, it refers to bottom */ - entry_act = thr->callstack_curr; - entry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack); -#if defined(DUK_USE_ASSERTIONS) - entry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack); - entry_callstack_top = thr->callstack_top; - entry_callstack_preventcount = thr->callstack_preventcount; -#endif - entry_call_recursion_depth = thr->heap->call_recursion_depth; - entry_curr_thread = thr->heap->curr_thread; /* may be NULL if first call */ - entry_thread_state = thr->state; - entry_ptr_curr_pc = thr->ptr_curr_pc; /* may be NULL */ - idx_retbase = duk_get_top(thr) - num_stack_args; /* not a valid stack index if num_stack_args == 0 */ - DUK_ASSERT(idx_retbase >= 0); - - DUK_ASSERT((duk_idx_t) (thr->valstack_top - thr->valstack_bottom) >= num_stack_args); /* Caller ensures. */ - DUK_ASSERT((duk_idx_t) (thr->valstack_end - (thr->valstack_bottom + idx_retbase)) >= num_stack_rets); /* Caller ensures. */ - - /* Cannot portably debug print a function pointer, hence 'func' not printed! */ - DUK_DD(DUK_DDPRINT("duk_handle_safe_call: thr=%p, num_stack_args=%ld, num_stack_rets=%ld, " - "valstack_top=%ld, idx_retbase=%ld, rec_depth=%ld/%ld, " - "entry_act=%p, entry_valstack_bottom_byteoff=%ld, entry_call_recursion_depth=%ld, " - "entry_curr_thread=%p, entry_thread_state=%ld", - (void *) thr, - (long) num_stack_args, - (long) num_stack_rets, - (long) duk_get_top(thr), - (long) idx_retbase, - (long) thr->heap->call_recursion_depth, - (long) thr->heap->call_recursion_limit, - (void *) entry_act, - (long) entry_valstack_bottom_byteoff, - (long) entry_call_recursion_depth, - (void *) entry_curr_thread, - (long) entry_thread_state)); - - /* Setjmp catchpoint setup. */ - old_jmpbuf_ptr = thr->heap->lj.jmpbuf_ptr; - thr->heap->lj.jmpbuf_ptr = &our_jmpbuf; - - /* Prevent yields for the duration of the safe call. This only - * matters if the executor makes safe calls to functions that - * yield, this doesn't currently happen. - */ - thr->callstack_preventcount++; - -#if defined(DUK_USE_CPP_EXCEPTIONS) - try { -#else - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == &our_jmpbuf); - if (DUK_SETJMP(our_jmpbuf.jb) == 0) { - /* Success path. */ -#endif - DUK_DDD(DUK_DDDPRINT("safe_call setjmp catchpoint setup complete")); - - duk__handle_safe_call_inner(thr, - func, - udata, -#if defined(DUK_USE_ASSERTIONS) - entry_valstack_bottom_byteoff, - entry_callstack_top, -#endif - entry_curr_thread, - entry_thread_state, - idx_retbase, - num_stack_rets); - - DUK_STATS_INC(thr->heap, stats_safecall_nothrow); - - /* Either pointer may be NULL (at entry), so don't assert */ - thr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr; - - /* If calls happen inside the safe call, these are restored by - * whatever calls are made. Reserve cannot decrease. - */ - DUK_ASSERT(thr->callstack_curr == entry_act); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - - retval = DUK_EXEC_SUCCESS; -#if defined(DUK_USE_CPP_EXCEPTIONS) - } catch (duk_internal_exception &exc) { - DUK_UNREF(exc); -#else - } else { - /* Error path. */ -#endif - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - - DUK_STATS_INC(thr->heap, stats_safecall_throw); - - duk__handle_safe_call_error(thr, - entry_act, -#if defined(DUK_USE_ASSERTIONS) - entry_callstack_top, -#endif - entry_curr_thread, - entry_thread_state, - idx_retbase, - num_stack_rets, - entry_valstack_bottom_byteoff, - old_jmpbuf_ptr); - - retval = DUK_EXEC_ERROR; - } -#if defined(DUK_USE_CPP_EXCEPTIONS) - catch (std::exception &exc) { - const char *what = exc.what(); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - DUK_STATS_INC(thr->heap, stats_safecall_throw); - if (!what) { - what = "unknown"; - } - DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)")); - try { - DUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what); - } catch (duk_internal_exception exc) { - DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception")); - DUK_UNREF(exc); - duk__handle_safe_call_error(thr, - entry_act, -#if defined(DUK_USE_ASSERTIONS) - entry_callstack_top, -#endif - entry_curr_thread, - entry_thread_state, - idx_retbase, - num_stack_rets, - entry_valstack_bottom_byteoff, - old_jmpbuf_ptr); - retval = DUK_EXEC_ERROR; - } - } catch (...) { - DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)")); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - DUK_STATS_INC(thr->heap, stats_safecall_throw); - try { - DUK_ERROR_TYPE(thr, "caught invalid c++ exception (perhaps thrown by user code)"); - } catch (duk_internal_exception exc) { - DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception")); - DUK_UNREF(exc); - duk__handle_safe_call_error(thr, - entry_act, -#if defined(DUK_USE_ASSERTIONS) - entry_callstack_top, -#endif - entry_curr_thread, - entry_thread_state, - idx_retbase, - num_stack_rets, - entry_valstack_bottom_byteoff, - old_jmpbuf_ptr); - retval = DUK_EXEC_ERROR; - } - } -#endif - - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr == old_jmpbuf_ptr); /* success/error path both do this */ - - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - duk__handle_safe_call_shared_unwind(thr, - idx_retbase, - num_stack_rets, -#if defined(DUK_USE_ASSERTIONS) - entry_callstack_top, -#endif - entry_call_recursion_depth, - entry_curr_thread, - entry_ptr_curr_pc); - - /* Restore preventcount. */ - thr->callstack_preventcount--; - DUK_ASSERT(thr->callstack_preventcount == entry_callstack_preventcount); - - /* Final asserts. */ - DUK_ASSERT(thr->callstack_curr == entry_act); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff); - DUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff); - DUK_ASSERT(thr->callstack_top == entry_callstack_top); - DUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth); - DUK_ASSERT(thr->heap->curr_thread == entry_curr_thread); - DUK_ASSERT(thr->state == entry_thread_state); - DUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc); - DUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets); - DUK_ASSERT_LJSTATE_UNSET(thr->heap); - - /* Pending side effects. */ - DUK_REFZERO_CHECK_FAST(thr); - - return retval; -} - -/* - * Property-based call (foo.noSuch()) error setup: replace target function - * on stack top with a specially tagged (hidden Symbol) error which gets - * thrown in call handling at the proper spot to follow Ecmascript semantics. - */ - -#if defined(DUK_USE_VERBOSE_ERRORS) -DUK_INTERNAL DUK_NOINLINE DUK_COLD void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key) { - const char *str1, *str2, *str3; - duk_idx_t entry_top; - - entry_top = duk_get_top(thr); - - /* Must stabilize pointers first. Argument convention is a bit awkward, - * it comes from the executor call site where some arguments may not be - * on the value stack (consts). - */ - duk_push_tval(thr, tv_base); - duk_push_tval(thr, tv_key); - duk_push_tval(thr, tv_targ); - - DUK_GC_TORTURE(thr->heap); - - /* We only push an error, replacing the call target (at idx_func) - * with the error to ensure side effects come out correctly: - * - Property read - * - Call argument evaluation - * - Callability check and error thrown. - * - * A hidden Symbol on the error object pushed here is used by - * call handling to figure out the error is to be thrown as is. - * It is CRITICAL that the hidden Symbol can never occur on a - * user visible object that may get thrown. - */ - -#if defined(DUK_USE_PARANOID_ERRORS) - str1 = duk_get_type_name(thr, -1); - str2 = duk_get_type_name(thr, -2); - str3 = duk_get_type_name(thr, -3); - duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3); -#else - str1 = duk_push_string_readable(thr, -1); - str2 = duk_push_string_readable(thr, -3); - str3 = duk_push_string_readable(thr, -5); - duk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, "%s not callable (property %s of %s)", str1, str2, str3); -#endif - - duk_push_true(thr); - duk_put_prop_stridx(thr, -2, DUK_STRIDX_INT_TARGET); /* Marker property, reuse _Target. */ - - /* [ propValue error ] */ - duk_replace(thr, entry_top - 1); - duk_set_top(thr, entry_top); - - DUK_ASSERT(!duk_is_callable(thr, -1)); /* Critical so that call handling will throw the error. */ -} -#endif /* DUK_USE_VERBOSE_ERRORS */ - -/* automatic undefs */ -#undef DUK__AUGMENT_CALL_RELAX_COUNT -#line 1 "duk_js_compiler.c" -/* - * Ecmascript compiler. - * - * Parses an input string and generates a function template result. - * Compilation may happen in multiple contexts (global code, eval - * code, function code). - * - * The parser uses a traditional top-down recursive parsing for the - * statement level, and an operator precedence based top-down approach - * for the expression level. The attempt is to minimize the C stack - * depth. Bytecode is generated directly without an intermediate - * representation (tree), at the cost of needing two (and sometimes - * three) passes over each function. - * - * The top-down recursive parser functions are named "duk__parse_XXX". - * - * Recursion limits are in key functions to prevent arbitrary C recursion: - * function body parsing, statement parsing, and expression parsing. - * - * See doc/compiler.rst for discussion on the design. - * - * A few typing notes: - * - * - duk_regconst_t: signed, highest bit set (< 0) means constant, - * some call sites use -1 for "none" (equivalent to constant 0x7fffffff) - * - PC values: duk_int_t, negative values used as markers - */ - -/* #include duk_internal.h -> already included */ - -/* If highest bit of a register number is set, it refers to a constant instead. - * When interpreted as a signed value, this means const values are always - * negative (when interpreted as two's complement). For example DUK__ISREG_TEMP() - * uses this approach to avoid an explicit DUK__ISREG() check (the condition is - * logically "'x' is a register AND 'x' >= temp_first"). - */ -#define DUK__CONST_MARKER DUK_REGCONST_CONST_MARKER -#define DUK__REMOVECONST(x) ((x) & ~DUK__CONST_MARKER) -#define DUK__ISREG(x) ((x) >= 0) -#define DUK__ISCONST(x) ((x) < 0) -#define DUK__ISREG_TEMP(comp_ctx,x) ((duk_int32_t) (x) >= (duk_int32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= temp_first && x >= 0 by comparing as signed. */ -#define DUK__ISREG_NOTTEMP(comp_ctx,x) ((duk_uint32_t) (x) < (duk_uint32_t) ((comp_ctx)->curr_func.temp_first)) /* Check for x >= 0 && x < temp_first by interpreting as unsigned. */ -#define DUK__GETTEMP(comp_ctx) ((comp_ctx)->curr_func.temp_next) -#define DUK__SETTEMP(comp_ctx,x) ((comp_ctx)->curr_func.temp_next = (x)) /* dangerous: must only lower (temp_max not updated) */ -#define DUK__SETTEMP_CHECKMAX(comp_ctx,x) duk__settemp_checkmax((comp_ctx),(x)) -#define DUK__ALLOCTEMP(comp_ctx) duk__alloctemp((comp_ctx)) -#define DUK__ALLOCTEMPS(comp_ctx,count) duk__alloctemps((comp_ctx),(count)) - -/* Init value set size for array and object literals. */ -#define DUK__MAX_ARRAY_INIT_VALUES 20 -#define DUK__MAX_OBJECT_INIT_PAIRS 10 - -/* XXX: hack, remove when const lookup is not O(n) */ -#define DUK__GETCONST_MAX_CONSTS_CHECK 256 - -/* These limits are based on bytecode limits. Max temps is limited - * by duk_hcompfunc nargs/nregs fields being 16 bits. - */ -#define DUK__MAX_CONSTS DUK_BC_BC_MAX -#define DUK__MAX_FUNCS DUK_BC_BC_MAX -#define DUK__MAX_TEMPS 0xffffL - -/* Initial bytecode size allocation. */ -#if defined(DUK_USE_PREFER_SIZE) -#define DUK__BC_INITIAL_INSTS 16 -#else -#define DUK__BC_INITIAL_INSTS 256 -#endif - -#define DUK__RECURSION_INCREASE(comp_ctx,thr) do { \ - DUK_DDD(DUK_DDDPRINT("RECURSION INCREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \ - duk__comp_recursion_increase((comp_ctx)); \ - } while (0) - -#define DUK__RECURSION_DECREASE(comp_ctx,thr) do { \ - DUK_DDD(DUK_DDDPRINT("RECURSION DECREASE: %s:%ld", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \ - duk__comp_recursion_decrease((comp_ctx)); \ - } while (0) - -/* Value stack slot limits: these are quite approximate right now, and - * because they overlap in control flow, some could be eliminated. - */ -#define DUK__COMPILE_ENTRY_SLOTS 8 -#define DUK__FUNCTION_INIT_REQUIRE_SLOTS 16 -#define DUK__FUNCTION_BODY_REQUIRE_SLOTS 16 -#define DUK__PARSE_STATEMENTS_SLOTS 16 -#define DUK__PARSE_EXPR_SLOTS 16 - -/* Temporary structure used to pass a stack allocated region through - * duk_safe_call(). - */ -typedef struct { - duk_small_uint_t flags; - duk_compiler_ctx comp_ctx_alloc; - duk_lexer_point lex_pt_alloc; -} duk__compiler_stkstate; - -/* - * Prototypes - */ - -/* lexing */ -DUK_LOCAL_DECL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect); -DUK_LOCAL_DECL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect); -DUK_LOCAL_DECL void duk__advance(duk_compiler_ctx *ctx); - -/* function helpers */ -DUK_LOCAL_DECL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg); -DUK_LOCAL_DECL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx); - -/* code emission */ -DUK_LOCAL_DECL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc); -DUK_LOCAL_DECL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins); -DUK_LOCAL_DECL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op); -DUK_LOCAL_DECL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c); -DUK_LOCAL_DECL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b); -DUK_LOCAL_DECL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c); -#if 0 /* unused */ -DUK_LOCAL_DECL void duk__emit_a(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a); -DUK_LOCAL_DECL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b); -#endif -DUK_LOCAL_DECL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc); -DUK_LOCAL_DECL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc); -DUK_LOCAL_DECL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc); -DUK_LOCAL_DECL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val); -DUK_LOCAL_DECL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val); -DUK_LOCAL_DECL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc); -DUK_LOCAL_DECL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc); -DUK_LOCAL_DECL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc); -DUK_LOCAL_DECL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc); -DUK_LOCAL_DECL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags); -DUK_LOCAL_DECL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst); -DUK_LOCAL_DECL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst); -DUK_LOCAL_DECL void duk__emit_invalid(duk_compiler_ctx *comp_ctx); - -/* ivalue/ispec helpers */ -DUK_LOCAL_DECL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst); -DUK_LOCAL_DECL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -DUK_LOCAL_DECL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h); -DUK_LOCAL_DECL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst); -DUK_LOCAL_DECL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst); -DUK_LOCAL_DECL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num); -DUK_LOCAL_DECL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next); -DUK_LOCAL_DECL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL -duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx, - duk_ispec *x, - duk_regconst_t forced_reg, - duk_small_uint_t flags); -DUK_LOCAL_DECL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg); -DUK_LOCAL_DECL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg); -DUK_LOCAL_DECL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -DUK_LOCAL_DECL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -DUK_LOCAL_DECL -duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx, - duk_ivalue *x, - duk_regconst_t forced_reg, - duk_small_uint_t flags); -DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -#if 0 /* unused */ -DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -#endif -DUK_LOCAL_DECL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg); -DUK_LOCAL_DECL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x); -DUK_LOCAL_DECL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x); - -/* identifier handling */ -DUK_LOCAL_DECL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname); - -/* label handling */ -DUK_LOCAL_DECL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id); -DUK_LOCAL_DECL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags); -DUK_LOCAL_DECL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest); -DUK_LOCAL_DECL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len); - -/* top-down expression parser */ -DUK_LOCAL_DECL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res); -DUK_LOCAL_DECL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx); - -/* exprtop is the top level variant which resets nud/led counts */ -DUK_LOCAL_DECL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -DUK_LOCAL_DECL void duk__exprtop(duk_compiler_ctx *ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); - -/* convenience helpers */ -#if 0 /* unused */ -DUK_LOCAL_DECL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#endif -#if 0 /* unused */ -DUK_LOCAL_DECL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#endif -DUK_LOCAL_DECL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg); -DUK_LOCAL_DECL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#if 0 /* unused */ -DUK_LOCAL_DECL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#endif -DUK_LOCAL_DECL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -DUK_LOCAL_DECL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#if 0 /* unused */ -DUK_LOCAL_DECL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#endif -DUK_LOCAL_DECL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg); -DUK_LOCAL_DECL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#if 0 /* unused */ -DUK_LOCAL_DECL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags); -#endif - -/* expression parsing helpers */ -DUK_LOCAL_DECL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res); - -/* statement parsing */ -DUK_LOCAL_DECL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname); -DUK_LOCAL_DECL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags); -DUK_LOCAL_DECL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); -DUK_LOCAL_DECL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); -DUK_LOCAL_DECL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); -DUK_LOCAL_DECL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site); -DUK_LOCAL_DECL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res); -DUK_LOCAL_DECL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem); -DUK_LOCAL_DECL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id); -DUK_LOCAL_DECL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof); - -DUK_LOCAL_DECL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token); -DUK_LOCAL_DECL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx); -DUK_LOCAL_DECL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags); -DUK_LOCAL_DECL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags); - -#define DUK__FUNC_FLAG_DECL (1 << 0) /* Parsing a function declaration. */ -#define DUK__FUNC_FLAG_GETSET (1 << 1) /* Parsing an object literal getter/setter. */ -#define DUK__FUNC_FLAG_METDEF (1 << 2) /* Parsing an object literal method definition shorthand. */ -#define DUK__FUNC_FLAG_PUSHNAME_PASS1 (1 << 3) /* Push function name when creating template (first pass only). */ -#define DUK__FUNC_FLAG_USE_PREVTOKEN (1 << 4) /* Use prev_token to start function parsing (workaround for object literal). */ - -/* - * Parser control values for tokens. The token table is ordered by the - * DUK_TOK_XXX defines. - * - * The binding powers are for lbp() use (i.e. for use in led() context). - * Binding powers are positive for typing convenience, and bits at the - * top should be reserved for flags. Binding power step must be higher - * than 1 so that binding power "lbp - 1" can be used for right associative - * operators. Currently a step of 2 is used (which frees one more bit for - * flags). - */ - -/* XXX: actually single step levels would work just fine, clean up */ - -/* binding power "levels" (see doc/compiler.rst) */ -#define DUK__BP_INVALID 0 /* always terminates led() */ -#define DUK__BP_EOF 2 -#define DUK__BP_CLOSING 4 /* token closes expression, e.g. ')', ']' */ -#define DUK__BP_FOR_EXPR DUK__BP_CLOSING /* bp to use when parsing a top level Expression */ -#define DUK__BP_COMMA 6 -#define DUK__BP_ASSIGNMENT 8 -#define DUK__BP_CONDITIONAL 10 -#define DUK__BP_LOR 12 -#define DUK__BP_LAND 14 -#define DUK__BP_BOR 16 -#define DUK__BP_BXOR 18 -#define DUK__BP_BAND 20 -#define DUK__BP_EQUALITY 22 -#define DUK__BP_RELATIONAL 24 -#define DUK__BP_SHIFT 26 -#define DUK__BP_ADDITIVE 28 -#define DUK__BP_MULTIPLICATIVE 30 -#define DUK__BP_EXPONENTIATION 32 -#define DUK__BP_POSTFIX 34 -#define DUK__BP_CALL 36 -#define DUK__BP_MEMBER 38 - -#define DUK__TOKEN_LBP_BP_MASK 0x1f -#define DUK__TOKEN_LBP_FLAG_NO_REGEXP (1 << 5) /* regexp literal must not follow this token */ -#define DUK__TOKEN_LBP_FLAG_TERMINATES (1 << 6) /* terminates expression; e.g. post-increment/-decrement */ -#define DUK__TOKEN_LBP_FLAG_UNUSED (1 << 7) /* unused */ - -#define DUK__TOKEN_LBP_GET_BP(x) ((duk_small_uint_t) (((x) & DUK__TOKEN_LBP_BP_MASK) * 2)) - -#define DUK__MK_LBP(bp) ((bp) >> 1) /* bp is assumed to be even */ -#define DUK__MK_LBP_FLAGS(bp,flags) (((bp) >> 1) | (flags)) - -DUK_LOCAL const duk_uint8_t duk__token_lbp[] = { - DUK__MK_LBP(DUK__BP_EOF), /* DUK_TOK_EOF */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_IDENTIFIER */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BREAK */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CASE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CATCH */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONTINUE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEBUGGER */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DEFAULT */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DELETE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_DO */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ELSE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FINALLY */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FOR */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_FUNCTION */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IF */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_IN */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_INSTANCEOF */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_NEW */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_RETURN */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SWITCH */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_THIS */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_THROW */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TRY */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_TYPEOF */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VAR */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CONST */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_VOID */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WHILE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_WITH */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_CLASS */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_ENUM */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXPORT */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_EXTENDS */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPORT */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SUPER */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NULL */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_TRUE */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_FALSE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_GET */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SET */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_IMPLEMENTS */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_INTERFACE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LET */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PACKAGE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PRIVATE */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PROTECTED */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_PUBLIC */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_STATIC */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_YIELD */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LCURLY */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RCURLY */ - DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_LBRACKET */ - DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RBRACKET */ - DUK__MK_LBP(DUK__BP_CALL), /* DUK_TOK_LPAREN */ - DUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_RPAREN */ - DUK__MK_LBP(DUK__BP_MEMBER), /* DUK_TOK_PERIOD */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_SEMICOLON */ - DUK__MK_LBP(DUK__BP_COMMA), /* DUK_TOK_COMMA */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LT */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GT */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_LE */ - DUK__MK_LBP(DUK__BP_RELATIONAL), /* DUK_TOK_GE */ - DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_EQ */ - DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_NEQ */ - DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SEQ */ - DUK__MK_LBP(DUK__BP_EQUALITY), /* DUK_TOK_SNEQ */ - DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_ADD */ - DUK__MK_LBP(DUK__BP_ADDITIVE), /* DUK_TOK_SUB */ - DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MUL */ - DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_DIV */ - DUK__MK_LBP(DUK__BP_MULTIPLICATIVE), /* DUK_TOK_MOD */ - DUK__MK_LBP(DUK__BP_EXPONENTIATION), /* DUK_TOK_EXP */ - DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_INCREMENT */ - DUK__MK_LBP(DUK__BP_POSTFIX), /* DUK_TOK_DECREMENT */ - DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ALSHIFT */ - DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_ARSHIFT */ - DUK__MK_LBP(DUK__BP_SHIFT), /* DUK_TOK_RSHIFT */ - DUK__MK_LBP(DUK__BP_BAND), /* DUK_TOK_BAND */ - DUK__MK_LBP(DUK__BP_BOR), /* DUK_TOK_BOR */ - DUK__MK_LBP(DUK__BP_BXOR), /* DUK_TOK_BXOR */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_LNOT */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_BNOT */ - DUK__MK_LBP(DUK__BP_LAND), /* DUK_TOK_LAND */ - DUK__MK_LBP(DUK__BP_LOR), /* DUK_TOK_LOR */ - DUK__MK_LBP(DUK__BP_CONDITIONAL), /* DUK_TOK_QUESTION */ - DUK__MK_LBP(DUK__BP_INVALID), /* DUK_TOK_COLON */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EQUALSIGN */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ADD_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_SUB_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MUL_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_DIV_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_MOD_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_EXP_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ALSHIFT_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_ARSHIFT_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_RSHIFT_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BAND_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BOR_EQ */ - DUK__MK_LBP(DUK__BP_ASSIGNMENT), /* DUK_TOK_BXOR_EQ */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_NUMBER */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_STRING */ - DUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP), /* DUK_TOK_REGEXP */ -}; - -/* - * Misc helpers - */ - -DUK_LOCAL void duk__comp_recursion_increase(duk_compiler_ctx *comp_ctx) { - DUK_ASSERT(comp_ctx != NULL); - DUK_ASSERT(comp_ctx->recursion_depth >= 0); - if (comp_ctx->recursion_depth >= comp_ctx->recursion_limit) { - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_COMPILER_RECURSION_LIMIT); - } - comp_ctx->recursion_depth++; -} - -DUK_LOCAL void duk__comp_recursion_decrease(duk_compiler_ctx *comp_ctx) { - DUK_ASSERT(comp_ctx != NULL); - DUK_ASSERT(comp_ctx->recursion_depth > 0); - comp_ctx->recursion_depth--; -} - -DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments(duk_compiler_ctx *comp_ctx, duk_hstring *h) { - DUK_UNREF(comp_ctx); - DUK_ASSERT(h != NULL); - return DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h); -} - -DUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments_in_strict_mode(duk_compiler_ctx *comp_ctx, duk_hstring *h) { - DUK_ASSERT(h != NULL); - return (comp_ctx->curr_func.is_strict && - DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h)); -} - -/* - * Parser duk__advance() token eating functions - */ - -/* XXX: valstack handling is awkward. Add a valstack helper which - * avoids dup():ing; valstack_copy(src, dst)? - */ - -DUK_LOCAL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) { - duk_hthread *thr = comp_ctx->thr; - duk_bool_t regexp; - - DUK_ASSERT_DISABLE(comp_ctx->curr_token.t >= 0); /* unsigned */ - DUK_ASSERT(comp_ctx->curr_token.t <= DUK_TOK_MAXVAL); /* MAXVAL is inclusive */ - - /* - * Use current token to decide whether a RegExp can follow. - * - * We can use either 't' or 't_nores'; the latter would not - * recognize keywords. Some keywords can be followed by a - * RegExp (e.g. "return"), so using 't' is better. This is - * not trivial, see doc/compiler.rst. - */ - - regexp = 1; - if (duk__token_lbp[comp_ctx->curr_token.t] & DUK__TOKEN_LBP_FLAG_NO_REGEXP) { - regexp = 0; - } - if (comp_ctx->curr_func.reject_regexp_in_adv) { - comp_ctx->curr_func.reject_regexp_in_adv = 0; - regexp = 0; - } - - if (expect >= 0 && comp_ctx->curr_token.t != (duk_small_uint_t) expect) { - DUK_D(DUK_DPRINT("parse error: expect=%ld, got=%ld", - (long) expect, (long) comp_ctx->curr_token.t)); - DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); - } - - /* make current token the previous; need to fiddle with valstack "backing store" */ - DUK_MEMCPY(&comp_ctx->prev_token, &comp_ctx->curr_token, sizeof(duk_token)); - duk_copy(thr, comp_ctx->tok11_idx, comp_ctx->tok21_idx); - duk_copy(thr, comp_ctx->tok12_idx, comp_ctx->tok22_idx); - - /* parse new token */ - duk_lexer_parse_js_input_element(&comp_ctx->lex, - &comp_ctx->curr_token, - comp_ctx->curr_func.is_strict, - regexp); - - DUK_DDD(DUK_DDDPRINT("advance: curr: tok=%ld/%ld,%ld,term=%ld,%!T,%!T " - "prev: tok=%ld/%ld,%ld,term=%ld,%!T,%!T", - (long) comp_ctx->curr_token.t, - (long) comp_ctx->curr_token.t_nores, - (long) comp_ctx->curr_token.start_line, - (long) comp_ctx->curr_token.lineterm, - (duk_tval *) duk_get_tval(thr, comp_ctx->tok11_idx), - (duk_tval *) duk_get_tval(thr, comp_ctx->tok12_idx), - (long) comp_ctx->prev_token.t, - (long) comp_ctx->prev_token.t_nores, - (long) comp_ctx->prev_token.start_line, - (long) comp_ctx->prev_token.lineterm, - (duk_tval *) duk_get_tval(thr, comp_ctx->tok21_idx), - (duk_tval *) duk_get_tval(thr, comp_ctx->tok22_idx))); -} - -/* advance, expecting current token to be a specific token; parse next token in regexp context */ -DUK_LOCAL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) { - duk__advance_helper(comp_ctx, expect); -} - -/* advance, whatever the current token is; parse next token in regexp context */ -DUK_LOCAL void duk__advance(duk_compiler_ctx *comp_ctx) { - duk__advance_helper(comp_ctx, -1); -} - -/* - * Helpers for duk_compiler_func. - */ - -/* init function state: inits valstack allocations */ -DUK_LOCAL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx) { - duk_compiler_func *func = &comp_ctx->curr_func; - duk_hthread *thr = comp_ctx->thr; - duk_idx_t entry_top; - - entry_top = duk_get_top(thr); - - DUK_MEMZERO(func, sizeof(*func)); /* intentional overlap with earlier memzero */ -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - func->h_name = NULL; - func->h_consts = NULL; - func->h_funcs = NULL; - func->h_decls = NULL; - func->h_labelnames = NULL; - func->h_labelinfos = NULL; - func->h_argnames = NULL; - func->h_varmap = NULL; -#endif - - duk_require_stack(thr, DUK__FUNCTION_INIT_REQUIRE_SLOTS); - - DUK_BW_INIT_PUSHBUF(thr, &func->bw_code, DUK__BC_INITIAL_INSTS * sizeof(duk_compiler_instr)); - /* code_idx = entry_top + 0 */ - - duk_push_array(thr); - func->consts_idx = entry_top + 1; - func->h_consts = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 1); - DUK_ASSERT(func->h_consts != NULL); - - duk_push_array(thr); - func->funcs_idx = entry_top + 2; - func->h_funcs = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 2); - DUK_ASSERT(func->h_funcs != NULL); - DUK_ASSERT(func->fnum_next == 0); - - duk_push_array(thr); - func->decls_idx = entry_top + 3; - func->h_decls = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 3); - DUK_ASSERT(func->h_decls != NULL); - - duk_push_array(thr); - func->labelnames_idx = entry_top + 4; - func->h_labelnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 4); - DUK_ASSERT(func->h_labelnames != NULL); - - duk_push_dynamic_buffer(thr, 0); - func->labelinfos_idx = entry_top + 5; - func->h_labelinfos = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 5); - DUK_ASSERT(func->h_labelinfos != NULL); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(func->h_labelinfos) && !DUK_HBUFFER_HAS_EXTERNAL(func->h_labelinfos)); - - duk_push_array(thr); - func->argnames_idx = entry_top + 6; - func->h_argnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 6); - DUK_ASSERT(func->h_argnames != NULL); - - duk_push_bare_object(thr); - func->varmap_idx = entry_top + 7; - func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 7); - DUK_ASSERT(func->h_varmap != NULL); -} - -/* reset function state (prepare for pass 2) */ -DUK_LOCAL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx) { - duk_compiler_func *func = &comp_ctx->curr_func; - duk_hthread *thr = comp_ctx->thr; - - /* reset bytecode buffer but keep current size; pass 2 will - * require same amount or more. - */ - DUK_BW_RESET_SIZE(thr, &func->bw_code); - - duk_set_length(thr, func->consts_idx, 0); - /* keep func->h_funcs; inner functions are not reparsed to avoid O(depth^2) parsing */ - func->fnum_next = 0; - /* duk_set_length(thr, func->funcs_idx, 0); */ - duk_set_length(thr, func->labelnames_idx, 0); - duk_hbuffer_reset(thr, func->h_labelinfos); - /* keep func->h_argnames; it is fixed for all passes */ - - /* truncated in case pass 3 needed */ - duk_push_bare_object(thr); - duk_replace(thr, func->varmap_idx); - func->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, func->varmap_idx); - DUK_ASSERT(func->h_varmap != NULL); -} - -/* cleanup varmap from any null entries, compact it, etc; returns number - * of final entries after cleanup. - */ -DUK_LOCAL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx) { - duk_hthread *thr = comp_ctx->thr; - duk_hobject *h_varmap; - duk_hstring *h_key; - duk_tval *tv; - duk_uint32_t i, e_next; - duk_int_t ret; - - /* [ ... varmap ] */ - - h_varmap = DUK_GET_HOBJECT_NEGIDX(thr, -1); - DUK_ASSERT(h_varmap != NULL); - - ret = 0; - e_next = DUK_HOBJECT_GET_ENEXT(h_varmap); - for (i = 0; i < e_next; i++) { - h_key = DUK_HOBJECT_E_GET_KEY(thr->heap, h_varmap, i); - if (!h_key) { - continue; - } - - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h_varmap, i)); - - /* The entries can either be register numbers or 'null' values. - * Thus, no need to DECREF them and get side effects. DECREF'ing - * the keys (strings) can cause memory to be freed but no side - * effects as strings don't have finalizers. This is why we can - * rely on the object properties not changing from underneath us. - */ - - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h_varmap, i); - if (!DUK_TVAL_IS_NUMBER(tv)) { - DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); - DUK_HOBJECT_E_SET_KEY(thr->heap, h_varmap, i, NULL); - DUK_HSTRING_DECREF(thr, h_key); - /* when key is NULL, value is garbage so no need to set */ - } else { - ret++; - } - } - - duk_compact_m1(thr); - - return ret; -} - -/* Convert duk_compiler_func into a function template, leaving the result - * on top of stack. - */ -/* XXX: awkward and bloated asm -- use faster internal accesses */ -DUK_LOCAL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx) { - duk_compiler_func *func = &comp_ctx->curr_func; - duk_hthread *thr = comp_ctx->thr; - duk_hcompfunc *h_res; - duk_hbuffer_fixed *h_data; - duk_size_t consts_count; - duk_size_t funcs_count; - duk_size_t code_count; - duk_size_t code_size; - duk_size_t data_size; - duk_size_t i; - duk_tval *p_const; - duk_hobject **p_func; - duk_instr_t *p_instr; - duk_compiler_instr *q_instr; - duk_tval *tv; - duk_bool_t keep_varmap; - duk_bool_t keep_formals; -#if !defined(DUK_USE_DEBUGGER_SUPPORT) - duk_size_t formals_length; -#endif - - DUK_DDD(DUK_DDDPRINT("converting duk_compiler_func to function/template")); - - /* - * Push result object and init its flags - */ - - /* Valstack should suffice here, required on function valstack init */ - - h_res = duk_push_hcompfunc(thr); - DUK_ASSERT(h_res != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_res) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) h_res, NULL); /* Function templates are "bare objects". */ - - if (func->is_function) { - DUK_DDD(DUK_DDDPRINT("function -> set NEWENV")); - DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res); - - if (!func->is_arguments_shadowed) { - /* arguments object would be accessible; note that shadowing - * bindings are arguments or function declarations, neither - * of which are deletable, so this is safe. - */ - - if (func->id_access_arguments || func->may_direct_eval) { - DUK_DDD(DUK_DDDPRINT("function may access 'arguments' object directly or " - "indirectly -> set CREATEARGS")); - DUK_HOBJECT_SET_CREATEARGS((duk_hobject *) h_res); - } - } - } else if (func->is_eval && func->is_strict) { - DUK_DDD(DUK_DDDPRINT("strict eval code -> set NEWENV")); - DUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res); - } else { - /* non-strict eval: env is caller's env or global env (direct vs. indirect call) - * global code: env is is global env - */ - DUK_DDD(DUK_DDDPRINT("non-strict eval code or global code -> no NEWENV")); - DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) h_res)); - } - -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - if (func->is_function && func->is_namebinding && func->h_name != NULL) { - /* Object literal set/get functions have a name (property - * name) but must not have a lexical name binding, see - * test-bug-getset-func-name.js. - */ - DUK_DDD(DUK_DDDPRINT("function expression with a name -> set NAMEBINDING")); - DUK_HOBJECT_SET_NAMEBINDING((duk_hobject *) h_res); - } -#endif - - if (func->is_strict) { - DUK_DDD(DUK_DDDPRINT("function is strict -> set STRICT")); - DUK_HOBJECT_SET_STRICT((duk_hobject *) h_res); - } - - if (func->is_notail) { - DUK_DDD(DUK_DDDPRINT("function is notail -> set NOTAIL")); - DUK_HOBJECT_SET_NOTAIL((duk_hobject *) h_res); - } - - if (func->is_constructable) { - DUK_DDD(DUK_DDDPRINT("function is constructable -> set CONSTRUCTABLE")); - DUK_HOBJECT_SET_CONSTRUCTABLE((duk_hobject *) h_res); - } - - /* - * Build function fixed size 'data' buffer, which contains bytecode, - * constants, and inner function references. - * - * During the building phase 'data' is reachable but incomplete. - * Only incref's occur during building (no refzero or GC happens), - * so the building process is atomic. - */ - - consts_count = duk_hobject_get_length(thr, func->h_consts); - funcs_count = duk_hobject_get_length(thr, func->h_funcs) / 3; - code_count = DUK_BW_GET_SIZE(thr, &func->bw_code) / sizeof(duk_compiler_instr); - code_size = code_count * sizeof(duk_instr_t); - - data_size = consts_count * sizeof(duk_tval) + - funcs_count * sizeof(duk_hobject *) + - code_size; - - DUK_DDD(DUK_DDDPRINT("consts_count=%ld, funcs_count=%ld, code_size=%ld -> " - "data_size=%ld*%ld + %ld*%ld + %ld = %ld", - (long) consts_count, (long) funcs_count, (long) code_size, - (long) consts_count, (long) sizeof(duk_tval), - (long) funcs_count, (long) sizeof(duk_hobject *), - (long) code_size, (long) data_size)); - - duk_push_fixed_buffer_nozero(thr, data_size); - h_data = (duk_hbuffer_fixed *) duk_known_hbuffer(thr, -1); - - DUK_HCOMPFUNC_SET_DATA(thr->heap, h_res, (duk_hbuffer *) h_data); - DUK_HEAPHDR_INCREF(thr, h_data); - - p_const = (duk_tval *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data); - for (i = 0; i < consts_count; i++) { - DUK_ASSERT(i <= DUK_UARRIDX_MAX); /* const limits */ - tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_consts, (duk_uarridx_t) i); - DUK_ASSERT(tv != NULL); - DUK_TVAL_SET_TVAL(p_const, tv); - p_const++; - DUK_TVAL_INCREF(thr, tv); /* may be a string constant */ - - DUK_DDD(DUK_DDDPRINT("constant: %!T", (duk_tval *) tv)); - } - - p_func = (duk_hobject **) p_const; - DUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_res, p_func); - for (i = 0; i < funcs_count; i++) { - duk_hobject *h; - DUK_ASSERT(i * 3 <= DUK_UARRIDX_MAX); /* func limits */ - tv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_funcs, (duk_uarridx_t) (i * 3)); - DUK_ASSERT(tv != NULL); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - h = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(h)); - *p_func++ = h; - DUK_HOBJECT_INCREF(thr, h); - - DUK_DDD(DUK_DDDPRINT("inner function: %p -> %!iO", - (void *) h, (duk_heaphdr *) h)); - } - - p_instr = (duk_instr_t *) p_func; - DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_res, p_instr); - - /* copy bytecode instructions one at a time */ - q_instr = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(thr, &func->bw_code); - for (i = 0; i < code_count; i++) { - p_instr[i] = q_instr[i].ins; - } - /* Note: 'q_instr' is still used below */ - - DUK_ASSERT((duk_uint8_t *) (p_instr + code_count) == DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data) + data_size); - - duk_pop(thr); /* 'data' (and everything in it) is reachable through h_res now */ - - /* - * Init non-property result fields - * - * 'nregs' controls how large a register frame is allocated. - * - * 'nargs' controls how many formal arguments are written to registers: - * r0, ... r(nargs-1). The remaining registers are initialized to - * undefined. - */ - - DUK_ASSERT(func->temp_max >= 0); - h_res->nregs = (duk_uint16_t) func->temp_max; - h_res->nargs = (duk_uint16_t) duk_hobject_get_length(thr, func->h_argnames); - DUK_ASSERT(h_res->nregs >= h_res->nargs); /* pass2 allocation handles this */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - h_res->start_line = (duk_uint32_t) func->min_line; - h_res->end_line = (duk_uint32_t) func->max_line; -#endif - - /* - * Init object properties - * - * Properties should be added in decreasing order of access frequency. - * (Not very critical for function templates.) - */ - - DUK_DDD(DUK_DDDPRINT("init function properties")); - - /* [ ... res ] */ - - /* _Varmap: omitted if function is guaranteed not to do a slow path - * identifier access that might be caught by locally declared variables. - * The varmap can also be omitted if it turns out empty of actual - * register mappings after a cleanup. When debugging is enabled, we - * always need the varmap to be able to lookup variables at any point. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - DUK_DD(DUK_DDPRINT("keeping _Varmap because debugger support is enabled")); - keep_varmap = 1; -#else - if (func->id_access_slow_own || /* directly uses slow accesses that may match own variables */ - func->id_access_arguments || /* accesses 'arguments' directly */ - func->may_direct_eval || /* may indirectly slow access through a direct eval */ - funcs_count > 0) { /* has inner functions which may slow access (XXX: this can be optimized by looking at the inner functions) */ - DUK_DD(DUK_DDPRINT("keeping _Varmap because of direct eval, slow path access that may match local variables, or presence of inner functions")); - keep_varmap = 1; - } else { - DUK_DD(DUK_DDPRINT("dropping _Varmap")); - keep_varmap = 0; - } -#endif - - if (keep_varmap) { - duk_int_t num_used; - duk_dup(thr, func->varmap_idx); - num_used = duk__cleanup_varmap(comp_ctx); - DUK_DDD(DUK_DDDPRINT("cleaned up varmap: %!T (num_used=%ld)", - (duk_tval *) duk_get_tval(thr, -1), (long) num_used)); - - if (num_used > 0) { - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE); - } else { - DUK_DD(DUK_DDPRINT("varmap is empty after cleanup -> no need to add")); - duk_pop(thr); - } - } - - /* _Formals: omitted if function is guaranteed not to need a (non-strict) - * arguments object, and _Formals.length matches nargs exactly. - * - * Non-arrow functions can't see an outer function's 'argument' binding - * (because they have their own), but arrow functions can. When arrow - * functions are added, this condition would need to be added: - * inner_arrow_funcs_count > 0 inner arrow functions may access 'arguments' - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - DUK_DD(DUK_DDPRINT("keeping _Formals because debugger support is enabled")); - keep_formals = 1; -#else - formals_length = duk_get_length(thr, func->argnames_idx); - if (formals_length != (duk_size_t) h_res->nargs) { - /* Nargs not enough for closure .length: keep _Formals regardless - * of its length. Shouldn't happen in practice at the moment. - */ - DUK_DD(DUK_DDPRINT("keeping _Formals because _Formals.length != nargs")); - keep_formals = 1; - } else if ((func->id_access_arguments || func->may_direct_eval) && - (formals_length > 0)) { - /* Direct eval (may access 'arguments') or accesses 'arguments' - * explicitly: keep _Formals unless it is zero length. - */ - DUK_DD(DUK_DDPRINT("keeping _Formals because of direct eval or explicit access to 'arguments', and _Formals.length != 0")); - keep_formals = 1; - } else { - DUK_DD(DUK_DDPRINT("omitting _Formals, nargs matches _Formals.length, so no properties added")); - keep_formals = 0; - } -#endif - - if (keep_formals) { - duk_dup(thr, func->argnames_idx); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE); - } - - /* name */ -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - if (func->h_name) { - duk_push_hstring(thr, func->h_name); - DUK_DD(DUK_DDPRINT("setting function template .name to %!T", duk_get_tval(thr, -1))); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE); - } -#endif /* DUK_USE_FUNC_NAME_PROPERTY */ - - /* _Source */ -#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY) - if (0) { - /* XXX: Currently function source code is not stored, as it is not - * required by the standard. Source code should not be stored by - * default (user should enable it explicitly), and the source should - * probably be compressed with a trivial text compressor; average - * compression of 20-30% is quite easy to achieve even with a trivial - * compressor (RLE + backwards lookup). - * - * Debugging needs source code to be useful: sometimes input code is - * not found in files as it may be generated and then eval()'d, given - * by dynamic C code, etc. - * - * Other issues: - * - * - Need tokenizer indices for start and end to substring - * - Always normalize function declaration part? - * - If we keep _Formals, only need to store body - */ - - /* - * For global or eval code this is straightforward. For functions - * created with the Function constructor we only get the source for - * the body and must manufacture the "function ..." part. - * - * For instance, for constructed functions (v8): - * - * > a = new Function("foo", "bar", "print(foo)"); - * [Function] - * > a.toString() - * 'function anonymous(foo,bar) {\nprint(foo)\n}' - * - * Similarly for e.g. getters (v8): - * - * > x = { get a(foo,bar) { print(foo); } } - * { a: [Getter] } - * > Object.getOwnPropertyDescriptor(x, 'a').get.toString() - * 'function a(foo,bar) { print(foo); }' - */ - -#if 0 - duk_push_string(thr, "XXX"); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE); -#endif - } -#endif /* DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY */ - - /* _Pc2line */ -#if defined(DUK_USE_PC2LINE) - if (1) { - /* - * Size-optimized pc->line mapping. - */ - - DUK_ASSERT(code_count <= DUK_COMPILER_MAX_BYTECODE_LENGTH); - duk_hobject_pc2line_pack(thr, q_instr, (duk_uint_fast32_t) code_count); /* -> pushes fixed buffer */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_NONE); - - /* XXX: if assertions enabled, walk through all valid PCs - * and check line mapping. - */ - } -#endif /* DUK_USE_PC2LINE */ - - /* fileName */ -#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) - if (comp_ctx->h_filename) { - /* - * Source filename (or equivalent), for identifying thrown errors. - */ - - duk_push_hstring(thr, comp_ctx->h_filename); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_NONE); - } -#endif - - DUK_DD(DUK_DDPRINT("converted function: %!ixT", - (duk_tval *) duk_get_tval(thr, -1))); - - /* - * Compact the function template. - */ - - duk_compact_m1(thr); - - /* - * Debug dumping - */ - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - { - duk_hcompfunc *h; - duk_instr_t *p, *p_start, *p_end; - - h = (duk_hcompfunc *) duk_get_hobject(thr, -1); - p_start = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, h); - p_end = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, h); - - p = p_start; - while (p < p_end) { - DUK_DDD(DUK_DDDPRINT("BC %04ld: %!I ; 0x%08lx op=%ld (%!C) a=%ld b=%ld c=%ld", - (long) (p - p_start), - (duk_instr_t) (*p), - (unsigned long) (*p), - (long) DUK_DEC_OP(*p), - (long) DUK_DEC_OP(*p), - (long) DUK_DEC_A(*p), - (long) DUK_DEC_B(*p), - (long) DUK_DEC_C(*p))); - p++; - } - } -#endif -} - -/* - * Code emission helpers - * - * Some emission helpers understand the range of target and source reg/const - * values and automatically emit shuffling code if necessary. This is the - * case when the slot in question (A, B, C) is used in the standard way and - * for opcodes the emission helpers explicitly understand (like DUK_OP_MPUTOBJ). - * - * The standard way is that: - * - slot A is a target register - * - slot B is a source register/constant - * - slot C is a source register/constant - * - * If a slot is used in a non-standard way the caller must indicate this - * somehow. If a slot is used as a target instead of a source (or vice - * versa), this can be indicated with a flag to trigger proper shuffling - * (e.g. DUK__EMIT_FLAG_B_IS_TARGET). If the value in the slot is not - * register/const related at all, the caller must ensure that the raw value - * fits into the corresponding slot so as to not trigger shuffling. The - * caller must set a "no shuffle" flag to ensure compilation fails if - * shuffling were to be triggered because of an internal error. - * - * For slots B and C the raw slot size is 9 bits but one bit is reserved for - * the reg/const indicator. To use the full 9-bit range for a raw value, - * shuffling must be disabled with the DUK__EMIT_FLAG_NO_SHUFFLE_{B,C} flag. - * Shuffling is only done for A, B, and C slots, not the larger BC or ABC slots. - * - * There is call handling specific understanding in the A-B-C emitter to - * convert call setup and call instructions into indirect ones if necessary. - */ - -/* Code emission flags, passed in the 'opcode' field. Opcode + flags - * fit into 16 bits for now, so use duk_small_uint_t. - */ -#define DUK__EMIT_FLAG_NO_SHUFFLE_A (1 << 8) -#define DUK__EMIT_FLAG_NO_SHUFFLE_B (1 << 9) -#define DUK__EMIT_FLAG_NO_SHUFFLE_C (1 << 10) -#define DUK__EMIT_FLAG_A_IS_SOURCE (1 << 11) /* slot A is a source (default: target) */ -#define DUK__EMIT_FLAG_B_IS_TARGET (1 << 12) /* slot B is a target (default: source) */ -#define DUK__EMIT_FLAG_C_IS_TARGET (1 << 13) /* slot C is a target (default: source) */ -#define DUK__EMIT_FLAG_BC_REGCONST (1 << 14) /* slots B and C are reg/const */ -#define DUK__EMIT_FLAG_RESERVE_JUMPSLOT (1 << 15) /* reserve a jumpslot after instr before target spilling, used for NEXTENUM */ - -/* XXX: macro smaller than call? */ -DUK_LOCAL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx) { - duk_compiler_func *func; - func = &comp_ctx->curr_func; - return (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &func->bw_code) / sizeof(duk_compiler_instr)); -} - -DUK_LOCAL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc) { - DUK_ASSERT(pc >= 0); - DUK_ASSERT((duk_size_t) pc < (duk_size_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr))); - return ((duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code)) + pc; -} - -/* emit instruction; could return PC but that's not needed in the majority - * of cases. - */ -DUK_LOCAL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins) { -#if defined(DUK_USE_PC2LINE) - duk_int_t line; -#endif - duk_compiler_instr *instr; - - DUK_DDD(DUK_DDDPRINT("duk__emit: 0x%08lx curr_token.start_line=%ld prev_token.start_line=%ld pc=%ld --> %!I", - (unsigned long) ins, - (long) comp_ctx->curr_token.start_line, - (long) comp_ctx->prev_token.start_line, - (long) duk__get_current_pc(comp_ctx), - (duk_instr_t) ins)); - - instr = (duk_compiler_instr *) (void *) DUK_BW_ENSURE_GETPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); - DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); - -#if defined(DUK_USE_PC2LINE) - /* The line number tracking is a bit inconsistent right now, which - * affects debugger accuracy. Mostly call sites emit opcodes when - * they have parsed a token (say a terminating semicolon) and called - * duk__advance(). In this case the line number of the previous - * token is the most accurate one (except in prologue where - * prev_token.start_line is 0). This is probably not 100% correct - * right now. - */ - /* approximation, close enough */ - line = comp_ctx->prev_token.start_line; - if (line == 0) { - line = comp_ctx->curr_token.start_line; - } -#endif - - instr->ins = ins; -#if defined(DUK_USE_PC2LINE) - instr->line = (duk_uint32_t) line; -#endif -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (line < comp_ctx->curr_func.min_line) { - comp_ctx->curr_func.min_line = line; - } - if (line > comp_ctx->curr_func.max_line) { - comp_ctx->curr_func.max_line = line; - } -#endif - - /* Limit checks for bytecode byte size and line number. */ - if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) { - goto fail_bc_limit; - } -#if defined(DUK_USE_PC2LINE) && defined(DUK_USE_ESBC_LIMITS) -#if defined(DUK_USE_BUFLEN16) - /* Buffer length is bounded to 0xffff automatically, avoid compile warning. */ - if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) { - goto fail_bc_limit; - } -#else - if (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) { - goto fail_bc_limit; - } -#endif -#endif - - return; - - fail_bc_limit: - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT); -} - -/* Update function min/max line from current token. Needed to improve - * function line range information for debugging, so that e.g. opening - * curly brace is covered by line range even when no opcodes are emitted - * for the line containing the brace. - */ -DUK_LOCAL void duk__update_lineinfo_currtoken(duk_compiler_ctx *comp_ctx) { -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_int_t line; - - line = comp_ctx->curr_token.start_line; - if (line == 0) { - return; - } - if (line < comp_ctx->curr_func.min_line) { - comp_ctx->curr_func.min_line = line; - } - if (line > comp_ctx->curr_func.max_line) { - comp_ctx->curr_func.max_line = line; - } -#else - DUK_UNREF(comp_ctx); -#endif -} - -DUK_LOCAL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op) { - duk__emit(comp_ctx, DUK_ENC_OP_ABC(op, 0)); -} - -/* Important main primitive. */ -DUK_LOCAL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c) { - duk_instr_t ins = 0; - duk_int_t a_out = -1; - duk_int_t b_out = -1; - duk_int_t c_out = -1; - duk_int_t tmp; - duk_small_uint_t op = op_flags & 0xffU; - - DUK_DDD(DUK_DDDPRINT("emit: op_flags=%04lx, a=%ld, b=%ld, c=%ld", - (unsigned long) op_flags, (long) a, (long) b, (long) c)); - - /* We could rely on max temp/const checks: if they don't exceed BC - * limit, nothing here can either (just asserts would be enough). - * Currently we check for the limits, which provides additional - * protection against creating invalid bytecode due to compiler - * bugs. - */ - - DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */ - DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX); - DUK_ASSERT(DUK__ISREG(a)); - DUK_ASSERT(b != -1); /* Not 'none'. */ - DUK_ASSERT(c != -1); /* Not 'none'. */ - - /* Input shuffling happens before the actual operation, while output - * shuffling happens afterwards. Output shuffling decisions are still - * made at the same time to reduce branch clutter; output shuffle decisions - * are recorded into X_out variables. - */ - - /* Slot A: currently no support for reg/const. */ - -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) { -#else - if (a <= DUK_BC_A_MAX) { -#endif - ; - } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) { - DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but shuffle prohibited, a: %ld", (long) a)); - goto error_outofregs; - } else if (a <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle1; - if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) { - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a)); - } else { - /* Output shuffle needed after main operation */ - a_out = a; - - /* The DUK_OP_CSVAR output shuffle assumes shuffle registers are - * consecutive. - */ - DUK_ASSERT((comp_ctx->curr_func.shuffle1 == 0 && comp_ctx->curr_func.shuffle2 == 0) || - (comp_ctx->curr_func.shuffle2 == comp_ctx->curr_func.shuffle1 + 1)); - if (op == DUK_OP_CSVAR) { - /* For CSVAR the limit is one smaller because output shuffle - * must be able to express 'a + 1' in BC. - */ - if (a + 1 > DUK_BC_BC_MAX) { - goto error_outofregs; - } - } - } - a = tmp; - } else { - DUK_D(DUK_DPRINT("out of regs: 'a' (reg) needs shuffling but does not fit into BC, a: %ld", (long) a)); - goto error_outofregs; - } - - /* Slot B: reg/const support, mapped to bit 0 of opcode. */ - - if ((b & DUK__CONST_MARKER) != 0) { - DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) == 0); - DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0); - b = b & ~DUK__CONST_MARKER; -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (0) { -#else - if (b <= 0xff) { -#endif - if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) { - /* Opcode follows B/C reg/const convention. */ - DUK_ASSERT((op & 0x01) == 0); - ins |= DUK_ENC_OP_A_B_C(0x01, 0, 0, 0); /* const flag for B */ - } else { - DUK_D(DUK_DPRINT("B is const, opcode is not B/C reg/const: %x", op_flags)); - } - } else if (b <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle2; - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, b)); - b = tmp; - } else { - DUK_D(DUK_DPRINT("out of regs: 'b' (const) needs shuffling but does not fit into BC, b: %ld", (long) b)); - goto error_outofregs; - } - } else { -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (b <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B)) { -#else - if (b <= 0xff) { -#endif - ; - } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) { - if (b > DUK_BC_B_MAX) { - /* Note: 0xff != DUK_BC_B_MAX */ - DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but shuffle prohibited, b: %ld", (long) b)); - goto error_outofregs; - } - } else if (b <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle2; - if (op_flags & DUK__EMIT_FLAG_B_IS_TARGET) { - /* Output shuffle needed after main operation */ - b_out = b; - } - if (!(op_flags & DUK__EMIT_FLAG_B_IS_TARGET)) { - if (op == DUK_OP_MPUTOBJ || op == DUK_OP_MPUTARR) { - /* Special handling for MPUTOBJ/MPUTARR shuffling. - * For each, slot B identifies the first register of a range - * of registers, so normal shuffling won't work. Instead, - * an indirect version of the opcode is used. - */ - DUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0); - duk__emit_load_int32_noshuffle(comp_ctx, tmp, b); - DUK_ASSERT(DUK_OP_MPUTOBJI == DUK_OP_MPUTOBJ + 1); - DUK_ASSERT(DUK_OP_MPUTARRI == DUK_OP_MPUTARR + 1); - op_flags++; /* indirect opcode follows direct */ - } else { - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, b)); - } - } - b = tmp; - } else { - DUK_D(DUK_DPRINT("out of regs: 'b' (reg) needs shuffling but does not fit into BC, b: %ld", (long) b)); - goto error_outofregs; - } - } - - /* Slot C: reg/const support, mapped to bit 1 of opcode. */ - - if ((c & DUK__CONST_MARKER) != 0) { - DUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) == 0); - DUK_ASSERT((op_flags & DUK__EMIT_FLAG_C_IS_TARGET) == 0); - c = c & ~DUK__CONST_MARKER; -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (0) { -#else - if (c <= 0xff) { -#endif - if (op_flags & DUK__EMIT_FLAG_BC_REGCONST) { - /* Opcode follows B/C reg/const convention. */ - DUK_ASSERT((op & 0x02) == 0); - ins |= DUK_ENC_OP_A_B_C(0x02, 0, 0, 0); /* const flag for C */ - } else { - DUK_D(DUK_DPRINT("C is const, opcode is not B/C reg/const: %x", op_flags)); - } - } else if (c <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle3; - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, c)); - c = tmp; - } else { - DUK_D(DUK_DPRINT("out of regs: 'c' (const) needs shuffling but does not fit into BC, c: %ld", (long) c)); - goto error_outofregs; - } - } else { -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (c <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C)) { -#else - if (c <= 0xff) { -#endif - ; - } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) { - if (c > DUK_BC_C_MAX) { - /* Note: 0xff != DUK_BC_C_MAX */ - DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but shuffle prohibited, c: %ld", (long) c)); - goto error_outofregs; - } - } else if (c <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle3; - if (op_flags & DUK__EMIT_FLAG_C_IS_TARGET) { - /* Output shuffle needed after main operation */ - c_out = c; - } else { - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, c)); - } - c = tmp; - } else { - DUK_D(DUK_DPRINT("out of regs: 'c' (reg) needs shuffling but does not fit into BC, c: %ld", (long) c)); - goto error_outofregs; - } - } - - /* Main operation */ - - DUK_ASSERT(a >= DUK_BC_A_MIN); - DUK_ASSERT(a <= DUK_BC_A_MAX); - DUK_ASSERT(b >= DUK_BC_B_MIN); - DUK_ASSERT(b <= DUK_BC_B_MAX); - DUK_ASSERT(c >= DUK_BC_C_MIN); - DUK_ASSERT(c <= DUK_BC_C_MAX); - - ins |= DUK_ENC_OP_A_B_C(op_flags & 0xff, a, b, c); - duk__emit(comp_ctx, ins); - - /* NEXTENUM needs a jump slot right after the main instruction. - * When the JUMP is taken, output spilling is not needed so this - * workaround is possible. The jump slot PC is exceptionally - * plumbed through comp_ctx to minimize call sites. - */ - if (op_flags & DUK__EMIT_FLAG_RESERVE_JUMPSLOT) { - comp_ctx->emit_jumpslot_pc = duk__get_current_pc(comp_ctx); - duk__emit_abc(comp_ctx, DUK_OP_JUMP, 0); - } - - /* Output shuffling: only one output register is realistically possible. - * - * (Zero would normally be an OK marker value: if the target register - * was zero, it would never be shuffled. But with DUK_USE_SHUFFLE_TORTURE - * this is no longer true, so use -1 as a marker instead.) - */ - - if (a_out >= 0) { - DUK_ASSERT(b_out < 0); - DUK_ASSERT(c_out < 0); - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a, a_out)); - - if (op == DUK_OP_CSVAR) { - /* Special handling for CSVAR shuffling. The variable lookup - * results in a pair in successive - * registers so use two shuffle registers and two output - * loads. (In practice this is dead code because temp/const - * limit is reached first.) - */ - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a + 1, a_out + 1)); - } - } else if (b_out >= 0) { - DUK_ASSERT(a_out < 0); - DUK_ASSERT(c_out < 0); - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, b, b_out)); - } else if (c_out >= 0) { - DUK_ASSERT(b_out < 0); - DUK_ASSERT(c_out < 0); - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, c, c_out)); - } - - return; - - error_outofregs: - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); -} - -/* For many of the helpers below it'd be technically correct to add - * "no shuffle" flags for parameters passed in as zero. For example, - * duk__emit_a_b() should call duk__emit_a_b_c() with C set to 0, and - * DUK__EMIT_FLAG_NO_SHUFFLE_C added to op_flags. However, since the - * C value is 0, it'll never get shuffled so adding the flag is just - * unnecessary additional code. This is unfortunately not true for - * "shuffle torture" mode which needs special handling. - */ - -DUK_LOCAL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b) { -#if defined(DUK_USE_SHUFFLE_TORTURE) - op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_C; -#endif - duk__emit_a_b_c(comp_ctx, op_flags, a, b, 0); -} - -DUK_LOCAL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c) { -#if defined(DUK_USE_SHUFFLE_TORTURE) - op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A; -#endif - duk__emit_a_b_c(comp_ctx, op_flags, 0, b, c); -} - -#if 0 /* unused */ -DUK_LOCAL void duk__emit_a(duk_compiler_ctx *comp_ctx, int op_flags, int a) { -#if defined(DUK_USE_SHUFFLE_TORTURE) - op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_B | DUK__EMIT_FLAG_NO_SHUFFLE_C; -#endif - duk__emit_a_b_c(comp_ctx, op_flags, a, 0, 0); -} -#endif - -#if 0 /* unused */ -DUK_LOCAL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b) { -#if defined(DUK_USE_SHUFFLE_TORTURE) - op_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_NO_SHUFFLE_C; -#endif - duk__emit_a_b_c(comp_ctx, op_flags, 0, b, 0); -} -#endif - -DUK_LOCAL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc) { - duk_instr_t ins; - duk_int_t tmp; - - /* allow caller to give a const number with the DUK__CONST_MARKER */ - DUK_ASSERT(bc != -1); /* Not 'none'. */ - bc = bc & (~DUK__CONST_MARKER); - - DUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN); /* unsigned */ - DUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX); - DUK_ASSERT(bc >= DUK_BC_BC_MIN); - DUK_ASSERT(bc <= DUK_BC_BC_MAX); - DUK_ASSERT((bc & DUK__CONST_MARKER) == 0); - - if (bc <= DUK_BC_BC_MAX) { - ; - } else { - /* No BC shuffling now. */ - goto error_outofregs; - } - -#if defined(DUK_USE_SHUFFLE_TORTURE) - if (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) { -#else - if (a <= DUK_BC_A_MAX) { -#endif - ins = DUK_ENC_OP_A_BC(op_flags & 0xff, a, bc); - duk__emit(comp_ctx, ins); - } else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) { - goto error_outofregs; - } else if ((op_flags & 0xf0U) == DUK_OP_CALL0) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle1; - duk__emit_load_int32_noshuffle(comp_ctx, tmp, a); - op_flags |= DUK_BC_CALL_FLAG_INDIRECT; - ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc); - duk__emit(comp_ctx, ins); - } else if (a <= DUK_BC_BC_MAX) { - comp_ctx->curr_func.needs_shuffle = 1; - tmp = comp_ctx->curr_func.shuffle1; - ins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc); - if (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) { - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a)); - duk__emit(comp_ctx, ins); - } else { - duk__emit(comp_ctx, ins); - duk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, tmp, a)); - } - } else { - goto error_outofregs; - } - return; - - error_outofregs: - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); -} - -DUK_LOCAL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc) { -#if defined(DUK_USE_SHUFFLE_TORTURE) - op |= DUK__EMIT_FLAG_NO_SHUFFLE_A; -#endif - duk__emit_a_bc(comp_ctx, op, 0, bc); -} - -DUK_LOCAL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc) { - duk_instr_t ins; - - DUK_ASSERT_DISABLE(op >= DUK_BC_OP_MIN); /* unsigned */ - DUK_ASSERT(op <= DUK_BC_OP_MAX); - DUK_ASSERT_DISABLE(abc >= DUK_BC_ABC_MIN); /* unsigned */ - DUK_ASSERT(abc <= DUK_BC_ABC_MAX); - DUK_ASSERT((abc & DUK__CONST_MARKER) == 0); - DUK_ASSERT(abc != -1); /* Not 'none'. */ - - if (abc <= DUK_BC_ABC_MAX) { - ; - } else { - goto error_outofregs; - } - ins = DUK_ENC_OP_ABC(op, abc); - DUK_DDD(DUK_DDDPRINT("duk__emit_abc: 0x%08lx line=%ld pc=%ld op=%ld (%!C) abc=%ld (%!I)", - (unsigned long) ins, (long) comp_ctx->curr_token.start_line, - (long) duk__get_current_pc(comp_ctx), (long) op, (long) op, - (long) abc, (duk_instr_t) ins)); - duk__emit(comp_ctx, ins); - return; - - error_outofregs: - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); -} - -DUK_LOCAL void duk__emit_load_int32_raw(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val, duk_small_uint_t op_flags) { - /* XXX: Shuffling support could be implemented here so that LDINT+LDINTX - * would only shuffle once (instead of twice). The current code works - * though, and has a smaller compiler footprint. - */ - - if ((val >= (duk_int32_t) DUK_BC_BC_MIN - (duk_int32_t) DUK_BC_LDINT_BIAS) && - (val <= (duk_int32_t) DUK_BC_BC_MAX - (duk_int32_t) DUK_BC_LDINT_BIAS)) { - DUK_DDD(DUK_DDDPRINT("emit LDINT to reg %ld for %ld", (long) reg, (long) val)); - duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (val + (duk_int32_t) DUK_BC_LDINT_BIAS)); - } else { - duk_int32_t hi = val >> DUK_BC_LDINTX_SHIFT; - duk_int32_t lo = val & ((((duk_int32_t) 1) << DUK_BC_LDINTX_SHIFT) - 1); - DUK_ASSERT(lo >= 0); - DUK_DDD(DUK_DDDPRINT("emit LDINT+LDINTX to reg %ld for %ld -> hi %ld, lo %ld", - (long) reg, (long) val, (long) hi, (long) lo)); - duk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (hi + (duk_int32_t) DUK_BC_LDINT_BIAS)); - duk__emit_a_bc(comp_ctx, DUK_OP_LDINTX | op_flags, reg, (duk_regconst_t) lo); - } -} - -DUK_LOCAL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { - duk__emit_load_int32_raw(comp_ctx, reg, val, 0 /*op_flags*/); -} - -#if defined(DUK_USE_SHUFFLE_TORTURE) -/* Used by duk__emit*() calls so that we don't shuffle the loadints that - * are needed to handle indirect opcodes. - */ -DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { - duk__emit_load_int32_raw(comp_ctx, reg, val, DUK__EMIT_FLAG_NO_SHUFFLE_A /*op_flags*/); -} -#else -DUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) { - /* When torture not enabled, can just use the same helper because - * 'reg' won't get spilled. - */ - DUK_ASSERT(reg <= DUK_BC_A_MAX); - duk__emit_load_int32(comp_ctx, reg, val); -} -#endif - -DUK_LOCAL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc) { - duk_int_t curr_pc; - duk_int_t offset; - - curr_pc = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)); - offset = (duk_int_t) target_pc - (duk_int_t) curr_pc - 1; - DUK_ASSERT(offset + DUK_BC_JUMP_BIAS >= DUK_BC_ABC_MIN); - DUK_ASSERT(offset + DUK_BC_JUMP_BIAS <= DUK_BC_ABC_MAX); - duk__emit_abc(comp_ctx, DUK_OP_JUMP, (duk_regconst_t) (offset + DUK_BC_JUMP_BIAS)); -} - -DUK_LOCAL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx) { - duk_int_t ret; - - ret = duk__get_current_pc(comp_ctx); /* useful for patching jumps later */ - duk__emit_op_only(comp_ctx, DUK_OP_JUMP); - return ret; -} - -/* Insert an empty jump in the middle of code emitted earlier. This is - * currently needed for compiling for-in. - */ -DUK_LOCAL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) { -#if defined(DUK_USE_PC2LINE) - duk_int_t line; -#endif - duk_compiler_instr *instr; - duk_size_t offset; - - DUK_ASSERT(jump_pc >= 0); - offset = (duk_size_t) jump_pc * sizeof(duk_compiler_instr); - instr = (duk_compiler_instr *) (void *) - DUK_BW_INSERT_ENSURE_AREA(comp_ctx->thr, - &comp_ctx->curr_func.bw_code, - offset, - sizeof(duk_compiler_instr)); - -#if defined(DUK_USE_PC2LINE) - line = comp_ctx->curr_token.start_line; /* approximation, close enough */ -#endif - instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, 0); -#if defined(DUK_USE_PC2LINE) - instr->line = (duk_uint32_t) line; -#endif - - DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr)); - if (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) { - goto fail_bc_limit; - } - return; - - fail_bc_limit: - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT); -} - -/* Does not assume that jump_pc contains a DUK_OP_JUMP previously; this is intentional - * to allow e.g. an INVALID opcode be overwritten with a JUMP (label management uses this). - */ -DUK_LOCAL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc) { - duk_compiler_instr *instr; - duk_int_t offset; - - /* allow negative PCs, behave as a no-op */ - if (jump_pc < 0) { - DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): nop call, jump_pc=%ld (<0), target_pc=%ld", - (long) jump_pc, (long) target_pc)); - return; - } - DUK_ASSERT(jump_pc >= 0); - - /* XXX: range assert */ - instr = duk__get_instr_ptr(comp_ctx, jump_pc); - DUK_ASSERT(instr != NULL); - - /* XXX: range assert */ - offset = target_pc - jump_pc - 1; - - instr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, offset + DUK_BC_JUMP_BIAS); - DUK_DDD(DUK_DDDPRINT("duk__patch_jump(): jump_pc=%ld, target_pc=%ld, offset=%ld", - (long) jump_pc, (long) target_pc, (long) offset)); -} - -DUK_LOCAL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) { - duk__patch_jump(comp_ctx, jump_pc, duk__get_current_pc(comp_ctx)); -} - -DUK_LOCAL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags) { - duk_compiler_instr *instr; - - DUK_ASSERT(DUK__ISREG(reg_catch)); - - instr = duk__get_instr_ptr(comp_ctx, ldconst_pc); - DUK_ASSERT(DUK_DEC_OP(instr->ins) == DUK_OP_LDCONST); - DUK_ASSERT(instr != NULL); - if (const_varname & DUK__CONST_MARKER) { - /* Have a catch variable. */ - const_varname = const_varname & (~DUK__CONST_MARKER); - if (reg_catch > DUK_BC_BC_MAX || const_varname > DUK_BC_BC_MAX) { - /* Catch attempts to use out-of-range reg/const. Without this - * check Duktape 0.12.0 could generate invalid code which caused - * an assert failure on execution. This error is triggered e.g. - * for functions with a lot of constants and a try-catch statement. - * Shuffling or opcode semantics change is needed to fix the issue. - * See: test-bug-trycatch-many-constants.js. - */ - DUK_D(DUK_DPRINT("failed to patch trycatch: flags=%ld, reg_catch=%ld, const_varname=%ld (0x%08lx)", - (long) flags, (long) reg_catch, (long) const_varname, (long) const_varname)); - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT); - } - instr->ins |= DUK_ENC_OP_A_BC(0, 0, const_varname); - } else { - /* No catch variable, e.g. a try-finally; replace LDCONST with - * NOP to avoid a bogus LDCONST. - */ - instr->ins = DUK_ENC_OP(DUK_OP_NOP); - } - - instr = duk__get_instr_ptr(comp_ctx, trycatch_pc); - DUK_ASSERT(instr != NULL); - DUK_ASSERT_DISABLE(flags >= DUK_BC_A_MIN); - DUK_ASSERT(flags <= DUK_BC_A_MAX); - instr->ins = DUK_ENC_OP_A_BC(DUK_OP_TRYCATCH, flags, reg_catch); -} - -DUK_LOCAL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) { - duk_small_uint_t op; - - op = DUK__ISREG(regconst) ? DUK_OP_IFFALSE_R : DUK_OP_IFFALSE_C; - duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */ -} - -DUK_LOCAL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) { - duk_small_uint_t op; - - op = DUK__ISREG(regconst) ? DUK_OP_IFTRUE_R : DUK_OP_IFTRUE_C; - duk__emit_bc(comp_ctx, op, regconst); /* helper will remove const flag */ -} - -DUK_LOCAL void duk__emit_invalid(duk_compiler_ctx *comp_ctx) { - duk__emit_op_only(comp_ctx, DUK_OP_INVALID); -} - -/* - * Peephole optimizer for finished bytecode. - * - * Does not remove opcodes; currently only straightens out unconditional - * jump chains which are generated by several control structures. - */ - -DUK_LOCAL void duk__peephole_optimize_bytecode(duk_compiler_ctx *comp_ctx) { - duk_compiler_instr *bc; - duk_small_uint_t iter; - duk_int_t i, n; - duk_int_t count_opt; - - bc = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code); -#if defined(DUK_USE_BUFLEN16) - /* No need to assert, buffer size maximum is 0xffff. */ -#else - DUK_ASSERT((duk_size_t) DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr) <= (duk_size_t) DUK_INT_MAX); /* bytecode limits */ -#endif - n = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)); - - for (iter = 0; iter < DUK_COMPILER_PEEPHOLE_MAXITER; iter++) { - count_opt = 0; - - for (i = 0; i < n; i++) { - duk_instr_t ins; - duk_int_t target_pc1; - duk_int_t target_pc2; - - ins = bc[i].ins; - if (DUK_DEC_OP(ins) != DUK_OP_JUMP) { - continue; - } - - target_pc1 = i + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS; - DUK_DDD(DUK_DDDPRINT("consider jump at pc %ld; target_pc=%ld", (long) i, (long) target_pc1)); - DUK_ASSERT(target_pc1 >= 0); - DUK_ASSERT(target_pc1 < n); - - /* Note: if target_pc1 == i, we'll optimize a jump to itself. - * This does not need to be checked for explicitly; the case - * is rare and max iter breaks us out. - */ - - ins = bc[target_pc1].ins; - if (DUK_DEC_OP(ins) != DUK_OP_JUMP) { - continue; - } - - target_pc2 = target_pc1 + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS; - - DUK_DDD(DUK_DDDPRINT("optimizing jump at pc %ld; old target is %ld -> new target is %ld", - (long) i, (long) target_pc1, (long) target_pc2)); - - bc[i].ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, target_pc2 - (i + 1) + DUK_BC_JUMP_BIAS); - - count_opt++; - } - - DUK_DD(DUK_DDPRINT("optimized %ld jumps on peephole round %ld", (long) count_opt, (long) (iter + 1))); - - if (count_opt == 0) { - break; - } - } -} - -/* - * Intermediate value helpers - */ - -/* Flags for intermediate value coercions. A flag for using a forced reg - * is not needed, the forced_reg argument suffices and generates better - * code (it is checked as it is used). - */ -/* XXX: DUK__IVAL_FLAG_REQUIRE_SHORT is passed but not currently implemented - * by ispec/ivalue operations. - */ -#define DUK__IVAL_FLAG_ALLOW_CONST (1 << 0) /* allow a constant to be returned */ -#define DUK__IVAL_FLAG_REQUIRE_TEMP (1 << 1) /* require a (mutable) temporary as a result (or a const if allowed) */ -#define DUK__IVAL_FLAG_REQUIRE_SHORT (1 << 2) /* require a short (8-bit) reg/const which fits into bytecode B/C slot */ - -/* XXX: some code might benefit from DUK__SETTEMP_IFTEMP(thr,x) */ - -#if 0 /* enable manually for dumping */ -#define DUK__DUMP_ISPEC(compctx,ispec) do { duk__dump_ispec((compctx), (ispec)); } while (0) -#define DUK__DUMP_IVALUE(compctx,ivalue) do { duk__dump_ivalue((compctx), (ivalue)); } while (0) - -DUK_LOCAL void duk__dump_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *x) { - DUK_D(DUK_DPRINT("ispec dump: t=%ld regconst=0x%08lx, valstack_idx=%ld, value=%!T", - (long) x->t, (unsigned long) x->regconst, (long) x->valstack_idx, - duk_get_tval(comp_ctx->thr, x->valstack_idx))); -} -DUK_LOCAL void duk__dump_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - DUK_D(DUK_DPRINT("ivalue dump: t=%ld op=%ld " - "x1={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T} " - "x2={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T}", - (long) x->t, (long) x->op, - (long) x->x1.t, (unsigned long) x->x1.regconst, (long) x->x1.valstack_idx, - duk_get_tval(comp_ctx->thr, x->x1.valstack_idx), - (long) x->x2.t, (unsigned long) x->x2.regconst, (long) x->x2.valstack_idx, - duk_get_tval(comp_ctx->thr, x->x2.valstack_idx))); -} -#else -#define DUK__DUMP_ISPEC(comp_ctx,x) do {} while (0) -#define DUK__DUMP_IVALUE(comp_ctx,x) do {} while (0) -#endif - -DUK_LOCAL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst) { - x->t = DUK_IVAL_PLAIN; - x->x1.t = DUK_ISPEC_REGCONST; - x->x1.regconst = regconst; -} - -DUK_LOCAL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - x->t = DUK_IVAL_PLAIN; - x->x1.t = DUK_ISPEC_VALUE; - duk_replace(comp_ctx->thr, x->x1.valstack_idx); -} - -DUK_LOCAL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - x->t = DUK_IVAL_VAR; - x->x1.t = DUK_ISPEC_VALUE; - duk_replace(comp_ctx->thr, x->x1.valstack_idx); -} - -DUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h) { - DUK_ASSERT(h != NULL); - duk_push_hstring(comp_ctx->thr, h); - duk__ivalue_var_fromstack(comp_ctx, x); -} - -DUK_LOCAL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst) { - dst->t = src->t; - dst->regconst = src->regconst; - duk_copy(comp_ctx->thr, src->valstack_idx, dst->valstack_idx); -} - -DUK_LOCAL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst) { - dst->t = src->t; - dst->op = src->op; - dst->x1.t = src->x1.t; - dst->x1.regconst = src->x1.regconst; - dst->x2.t = src->x2.t; - dst->x2.regconst = src->x2.regconst; - duk_copy(comp_ctx->thr, src->x1.valstack_idx, dst->x1.valstack_idx); - duk_copy(comp_ctx->thr, src->x2.valstack_idx, dst->x2.valstack_idx); -} - -DUK_LOCAL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num) { - duk_regconst_t res; - - res = comp_ctx->curr_func.temp_next; - comp_ctx->curr_func.temp_next += num; - - if (comp_ctx->curr_func.temp_next > DUK__MAX_TEMPS) { /* == DUK__MAX_TEMPS is OK */ - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_TEMP_LIMIT); - } - - /* maintain highest 'used' temporary, needed to figure out nregs of function */ - if (comp_ctx->curr_func.temp_next > comp_ctx->curr_func.temp_max) { - comp_ctx->curr_func.temp_max = comp_ctx->curr_func.temp_next; - } - - return res; -} - -DUK_LOCAL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx) { - return duk__alloctemps(comp_ctx, 1); -} - -DUK_LOCAL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next) { - comp_ctx->curr_func.temp_next = temp_next; - if (temp_next > comp_ctx->curr_func.temp_max) { - comp_ctx->curr_func.temp_max = temp_next; - } -} - -/* get const for value at valstack top */ -DUK_LOCAL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx) { - duk_hthread *thr = comp_ctx->thr; - duk_compiler_func *f = &comp_ctx->curr_func; - duk_tval *tv1; - duk_int_t i, n, n_check; - - n = (duk_int_t) duk_get_length(thr, f->consts_idx); - - tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(tv1 != NULL); - -#if defined(DUK_USE_FASTINT) - /* Explicit check for fastint downgrade. */ - DUK_TVAL_CHKFAST_INPLACE_SLOW(tv1); -#endif - - /* Sanity workaround for handling functions with a large number of - * constants at least somewhat reasonably. Otherwise checking whether - * we already have the constant would grow very slow (as it is O(N^2)). - */ - n_check = (n > DUK__GETCONST_MAX_CONSTS_CHECK ? DUK__GETCONST_MAX_CONSTS_CHECK : n); - for (i = 0; i < n_check; i++) { - duk_tval *tv2 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, f->h_consts, i); - - /* Strict equality is NOT enough, because we cannot use the same - * constant for e.g. +0 and -0. - */ - if (duk_js_samevalue(tv1, tv2)) { - DUK_DDD(DUK_DDDPRINT("reused existing constant for %!T -> const index %ld", - (duk_tval *) tv1, (long) i)); - duk_pop(thr); - return (duk_regconst_t) i | (duk_regconst_t) DUK__CONST_MARKER; - } - } - - if (n > DUK__MAX_CONSTS) { - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_CONST_LIMIT); - } - - DUK_DDD(DUK_DDDPRINT("allocating new constant for %!T -> const index %ld", - (duk_tval *) tv1, (long) n)); - (void) duk_put_prop_index(thr, f->consts_idx, (duk_uarridx_t) n); /* invalidates tv1, tv2 */ - return (duk_regconst_t) n | (duk_regconst_t) DUK__CONST_MARKER; -} - -DUK_LOCAL duk_bool_t duk__const_needs_refcount(duk_compiler_ctx *comp_ctx, duk_regconst_t rc) { -#if defined(DUK_USE_REFERENCE_COUNTING) - duk_compiler_func *f = &comp_ctx->curr_func; - duk_bool_t ret; - - DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */ - (void) duk_get_prop_index(comp_ctx->thr, f->consts_idx, (duk_uarridx_t) rc); - ret = !duk_is_number(comp_ctx->thr, -1); /* now only number/string, so conservative check */ - duk_pop(comp_ctx->thr); - return ret; -#else - DUK_UNREF(comp_ctx); - DUK_UNREF(rc); - DUK_ASSERT((rc & DUK__CONST_MARKER) == 0); /* caller removes const marker */ - return 0; -#endif -} - -/* Get the value represented by an duk_ispec to a register or constant. - * The caller can control the result by indicating whether or not: - * - * (1) a constant is allowed (sometimes the caller needs the result to - * be in a register) - * - * (2) a temporary register is required (usually when caller requires - * the register to be safely mutable; normally either a bound - * register or a temporary register are both OK) - * - * (3) a forced register target needs to be used - * - * Bytecode may be emitted to generate the necessary value. The return - * value is either a register or a constant. - */ - -DUK_LOCAL -duk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx, - duk_ispec *x, - duk_regconst_t forced_reg, - duk_small_uint_t flags) { - duk_hthread *thr = comp_ctx->thr; - - DUK_DDD(DUK_DDDPRINT("duk__ispec_toregconst_raw(): x={%ld:%ld:%!T}, " - "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld", - (long) x->t, - (long) x->regconst, - (duk_tval *) duk_get_tval(thr, x->valstack_idx), - (long) forced_reg, - (unsigned long) flags, - (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0), - (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0), - (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0))); - - switch (x->t) { - case DUK_ISPEC_VALUE: { - duk_tval *tv; - - tv = DUK_GET_TVAL_POSIDX(thr, x->valstack_idx); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: { - /* Note: although there is no 'undefined' literal, undefined - * values can occur during compilation as a result of e.g. - * the 'void' operator. - */ - duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, dest); - return dest; - } - case DUK_TAG_NULL: { - duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_bc(comp_ctx, DUK_OP_LDNULL, dest); - return dest; - } - case DUK_TAG_BOOLEAN: { - duk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_bc(comp_ctx, - (DUK_TVAL_GET_BOOLEAN(tv) ? DUK_OP_LDTRUE : DUK_OP_LDFALSE), - dest); - return dest; - } - case DUK_TAG_POINTER: { - DUK_UNREACHABLE(); - break; - } - case DUK_TAG_STRING: { - duk_hstring *h; - duk_regconst_t dest; - duk_regconst_t constidx; - - h = DUK_TVAL_GET_STRING(tv); - DUK_UNREF(h); - DUK_ASSERT(h != NULL); - -#if 0 /* XXX: to be implemented? */ - /* Use special opcodes to load short strings */ - if (DUK_HSTRING_GET_BYTELEN(h) <= 2) { - /* Encode into a single opcode (18 bits can encode 1-2 bytes + length indicator) */ - } else if (DUK_HSTRING_GET_BYTELEN(h) <= 6) { - /* Encode into a double constant (53 bits can encode 6*8 = 48 bits + 3-bit length */ - } -#endif - duk_dup(thr, x->valstack_idx); - constidx = duk__getconst(comp_ctx); - - if (flags & DUK__IVAL_FLAG_ALLOW_CONST) { - return constidx; - } - - dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx); - return dest; - } - case DUK_TAG_OBJECT: { - DUK_UNREACHABLE(); - break; - } - case DUK_TAG_BUFFER: { - DUK_UNREACHABLE(); - break; - } - case DUK_TAG_LIGHTFUNC: { - DUK_UNREACHABLE(); - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - /* number */ - duk_regconst_t dest; - duk_regconst_t constidx; - duk_double_t dval; - duk_int32_t ival; - - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - dval = DUK_TVAL_GET_NUMBER(tv); - - if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) { - /* A number can be loaded either through a constant, using - * LDINT, or using LDINT+LDINTX. LDINT is always a size win, - * LDINT+LDINTX is not if the constant is used multiple times. - * Currently always prefer LDINT+LDINTX over a double constant. - */ - - if (duk_is_whole_get_int32_nonegzero(dval, &ival)) { - dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_load_int32(comp_ctx, dest, ival); - return dest; - } - } - - duk_dup(thr, x->valstack_idx); - constidx = duk__getconst(comp_ctx); - - if (flags & DUK__IVAL_FLAG_ALLOW_CONST) { - return constidx; - } else { - dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx); - return dest; - } - } - } /* end switch */ - } - case DUK_ISPEC_REGCONST: { - if (forced_reg >= 0) { - if (DUK__ISCONST(x->regconst)) { - duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, forced_reg, x->regconst); - } else if (x->regconst != forced_reg) { - duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, forced_reg, x->regconst); - } else { - ; /* already in correct reg */ - } - return forced_reg; - } - - DUK_ASSERT(forced_reg < 0); - if (DUK__ISCONST(x->regconst)) { - if (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) { - duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, x->regconst); - return dest; - } - return x->regconst; - } - - DUK_ASSERT(forced_reg < 0 && !DUK__ISCONST(x->regconst)); - if ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) && !DUK__ISREG_TEMP(comp_ctx, x->regconst)) { - duk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_bc(comp_ctx, DUK_OP_LDREG, dest, x->regconst); - return dest; - } - return x->regconst; - } - default: { - break; - } - } - - DUK_ERROR_INTERNAL(thr); - return 0; -} - -DUK_LOCAL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg) { - DUK_ASSERT(forced_reg >= 0); - (void) duk__ispec_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/); -} - -/* Coerce an duk_ivalue to a 'plain' value by generating the necessary - * arithmetic operations, property access, or variable access bytecode. - * The duk_ivalue argument ('x') is converted into a plain value as a - * side effect. - */ -DUK_LOCAL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg) { - duk_hthread *thr = comp_ctx->thr; - - DUK_DDD(DUK_DDDPRINT("duk__ivalue_toplain_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, " - "forced_reg=%ld", - (long) x->t, (long) x->op, - (long) x->x1.t, (long) x->x1.regconst, - (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx), - (long) x->x2.t, (long) x->x2.regconst, - (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx), - (long) forced_reg)); - - switch (x->t) { - case DUK_IVAL_PLAIN: { - return; - } - /* XXX: support unary arithmetic ivalues (useful?) */ - case DUK_IVAL_ARITH: { - duk_regconst_t arg1; - duk_regconst_t arg2; - duk_regconst_t dest; - duk_tval *tv1; - duk_tval *tv2; - - DUK_DDD(DUK_DDDPRINT("arith to plain conversion")); - - /* inline arithmetic check for constant values */ - /* XXX: use the exactly same arithmetic function here as in executor */ - if (x->x1.t == DUK_ISPEC_VALUE && x->x2.t == DUK_ISPEC_VALUE && x->t == DUK_IVAL_ARITH) { - tv1 = DUK_GET_TVAL_POSIDX(thr, x->x1.valstack_idx); - tv2 = DUK_GET_TVAL_POSIDX(thr, x->x2.valstack_idx); - DUK_ASSERT(tv1 != NULL); - DUK_ASSERT(tv2 != NULL); - - DUK_DDD(DUK_DDDPRINT("arith: tv1=%!T, tv2=%!T", - (duk_tval *) tv1, - (duk_tval *) tv2)); - - if (DUK_TVAL_IS_NUMBER(tv1) && DUK_TVAL_IS_NUMBER(tv2)) { - duk_double_t d1 = DUK_TVAL_GET_NUMBER(tv1); - duk_double_t d2 = DUK_TVAL_GET_NUMBER(tv2); - duk_double_t d3; - duk_bool_t accept_fold = 1; - - DUK_DDD(DUK_DDDPRINT("arith inline check: d1=%lf, d2=%lf, op=%ld", - (double) d1, (double) d2, (long) x->op)); - switch (x->op) { - case DUK_OP_ADD: { - d3 = d1 + d2; - break; - } - case DUK_OP_SUB: { - d3 = d1 - d2; - break; - } - case DUK_OP_MUL: { - d3 = d1 * d2; - break; - } - case DUK_OP_DIV: { - d3 = d1 / d2; - break; - } - case DUK_OP_EXP: { - d3 = (duk_double_t) duk_js_arith_pow((double) d1, (double) d2); - break; - } - default: { - d3 = 0.0; /* Won't be used, but silence MSVC /W4 warning. */ - accept_fold = 0; - break; - } - } - - if (accept_fold) { - duk_double_union du; - du.d = d3; - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); - d3 = du.d; - - x->t = DUK_IVAL_PLAIN; - DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); - DUK_TVAL_SET_NUMBER(tv1, d3); /* old value is number: no refcount */ - return; - } - } else if (x->op == DUK_OP_ADD && DUK_TVAL_IS_STRING(tv1) && DUK_TVAL_IS_STRING(tv2)) { - /* Inline string concatenation. No need to check for - * symbols, as all inputs are valid Ecmascript strings. - */ - duk_dup(thr, x->x1.valstack_idx); - duk_dup(thr, x->x2.valstack_idx); - duk_concat(thr, 2); - duk_replace(thr, x->x1.valstack_idx); - x->t = DUK_IVAL_PLAIN; - DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); - return; - } - } - - arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); - arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); - - /* If forced reg, use it as destination. Otherwise try to - * use either coerced ispec if it is a temporary. - */ - if (forced_reg >= 0) { - dest = forced_reg; - } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) { - dest = arg1; - } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) { - dest = arg2; - } else { - dest = DUK__ALLOCTEMP(comp_ctx); - } - - DUK_ASSERT(DUK__ISREG(dest)); - duk__emit_a_b_c(comp_ctx, x->op | DUK__EMIT_FLAG_BC_REGCONST, dest, arg1, arg2); - - duk__ivalue_regconst(x, dest); - return; - } - case DUK_IVAL_PROP: { - /* XXX: very similar to DUK_IVAL_ARITH - merge? */ - duk_regconst_t arg1; - duk_regconst_t arg2; - duk_regconst_t dest; - - /* Need a short reg/const, does not have to be a mutable temp. */ - arg1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); - arg2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/); - - /* Pick a destination register. If either base value or key - * happens to be a temp value, reuse it as the destination. - * - * XXX: The temp must be a "mutable" one, i.e. such that no - * other expression is using it anymore. Here this should be - * the case because the value of a property access expression - * is neither the base nor the key, but the lookup result. - */ - - if (forced_reg >= 0) { - dest = forced_reg; - } else if (DUK__ISREG_TEMP(comp_ctx, arg1)) { - dest = arg1; - } else if (DUK__ISREG_TEMP(comp_ctx, arg2)) { - dest = arg2; - } else { - dest = DUK__ALLOCTEMP(comp_ctx); - } - - duk__emit_a_b_c(comp_ctx, - DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST, - dest, - arg1, - arg2); - - duk__ivalue_regconst(x, dest); - return; - } - case DUK_IVAL_VAR: { - /* x1 must be a string */ - duk_regconst_t dest; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - DUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE); - - duk_dup(thr, x->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - duk__ivalue_regconst(x, reg_varbind); - } else { - dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx)); - duk__emit_a_bc(comp_ctx, DUK_OP_GETVAR, dest, rc_varname); - duk__ivalue_regconst(x, dest); - } - return; - } - case DUK_IVAL_NONE: - default: { - DUK_D(DUK_DPRINT("invalid ivalue type: %ld", (long) x->t)); - break; - } - } - - DUK_ERROR_INTERNAL(thr); - return; -} - -/* evaluate to plain value, no forced register (temp/bound reg both ok) */ -DUK_LOCAL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/); -} - -/* evaluate to final form (e.g. coerce GETPROP to code), throw away temp */ -DUK_LOCAL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - duk_regconst_t temp; - - /* If duk__ivalue_toplain_raw() allocates a temp, forget it and - * restore next temp state. - */ - temp = DUK__GETTEMP(comp_ctx); - duk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/); - DUK__SETTEMP(comp_ctx, temp); -} - -/* Coerce an duk_ivalue to a register or constant; result register may - * be a temp or a bound register. - * - * The duk_ivalue argument ('x') is converted into a regconst as a - * side effect. - */ -DUK_LOCAL -duk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx, - duk_ivalue *x, - duk_regconst_t forced_reg, - duk_small_uint_t flags) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t reg; - DUK_UNREF(thr); - - DUK_DDD(DUK_DDDPRINT("duk__ivalue_toregconst_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, " - "forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld", - (long) x->t, (long) x->op, - (long) x->x1.t, (long) x->x1.regconst, - (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx), - (long) x->x2.t, (long) x->x2.regconst, - (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx), - (long) forced_reg, - (unsigned long) flags, - (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0), - (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0), - (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0))); - - /* first coerce to a plain value */ - duk__ivalue_toplain_raw(comp_ctx, x, forced_reg); - DUK_ASSERT(x->t == DUK_IVAL_PLAIN); - - /* then to a register */ - reg = duk__ispec_toregconst_raw(comp_ctx, &x->x1, forced_reg, flags); - duk__ivalue_regconst(x, reg); - - return reg; -} - -DUK_LOCAL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - return duk__ivalue_toregconst_raw(comp_ctx, x, -1, 0 /*flags*/); -} - -#if 0 /* unused */ -DUK_LOCAL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); -} -#endif - -DUK_LOCAL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg) { - DUK_ASSERT(forced_reg >= 0); - (void) duk__ivalue_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/); -} - -DUK_LOCAL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); -} - -DUK_LOCAL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) { - return duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); -} - -/* The issues below can be solved with better flags */ - -/* XXX: many operations actually want toforcedtemp() -- brand new temp? */ -/* XXX: need a toplain_ignore() which will only coerce a value to a temp - * register if it might have a side effect. Side-effect free values do not - * need to be coerced. - */ - -/* - * Identifier handling - */ - -DUK_LOCAL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx) { - duk_hthread *thr = comp_ctx->thr; - duk_hstring *h_varname; - duk_regconst_t ret; - - DUK_DDD(DUK_DDDPRINT("resolving identifier reference to '%!T'", - (duk_tval *) duk_get_tval(thr, -1))); - - /* - * Special name handling - */ - - h_varname = duk_known_hstring(thr, -1); - - if (h_varname == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)) { - DUK_DDD(DUK_DDDPRINT("flagging function as accessing 'arguments'")); - comp_ctx->curr_func.id_access_arguments = 1; - } - - /* - * Inside one or more 'with' statements fall back to slow path always. - * (See e.g. test-stmt-with.js.) - */ - - if (comp_ctx->curr_func.with_depth > 0) { - DUK_DDD(DUK_DDDPRINT("identifier lookup inside a 'with' -> fall back to slow path")); - goto slow_path_own; - } - - /* - * Any catch bindings ("catch (e)") also affect identifier binding. - * - * Currently, the varmap is modified for the duration of the catch - * clause to ensure any identifier accesses with the catch variable - * name will use slow path. - */ - - duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); - if (duk_is_number(thr, -1)) { - ret = duk_to_int(thr, -1); - duk_pop(thr); - } else { - duk_pop(thr); - if (comp_ctx->curr_func.catch_depth > 0 || comp_ctx->curr_func.with_depth > 0) { - DUK_DDD(DUK_DDDPRINT("slow path access from inside a try-catch or with needs _Varmap")); - goto slow_path_own; - } else { - /* In this case we're doing a variable lookup that doesn't - * match our own variables, so _Varmap won't be needed at - * run time. - */ - DUK_DDD(DUK_DDDPRINT("slow path access outside of try-catch and with, no need for _Varmap")); - goto slow_path_notown; - } - } - - DUK_DDD(DUK_DDDPRINT("identifier lookup -> reg %ld", (long) ret)); - return ret; - - slow_path_notown: - DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, not own variable")); - - comp_ctx->curr_func.id_access_slow = 1; - return (duk_regconst_t) -1; - - slow_path_own: - DUK_DDD(DUK_DDDPRINT("identifier lookup -> slow path, may be own variable")); - - comp_ctx->curr_func.id_access_slow = 1; - comp_ctx->curr_func.id_access_slow_own = 1; - return (duk_regconst_t) -1; -} - -/* Lookup an identifier name in the current varmap, indicating whether the - * identifier is register-bound and if not, allocating a constant for the - * identifier name. Returns 1 if register-bound, 0 otherwise. Caller can - * also check (out_reg_varbind >= 0) to check whether or not identifier is - * register bound. The caller must NOT use out_rc_varname at all unless - * return code is 0 or out_reg_varbind is < 0; this is becuase out_rc_varname - * is unsigned and doesn't have a "unused" / none value. - */ -DUK_LOCAL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - /* [ ... varname ] */ - - duk_dup_top(thr); - reg_varbind = duk__lookup_active_register_binding(comp_ctx); - - if (reg_varbind >= 0) { - *out_reg_varbind = reg_varbind; - *out_rc_varname = 0; /* duk_regconst_t is unsigned, so use 0 as dummy value (ignored by caller) */ - duk_pop(thr); - return 1; - } else { - rc_varname = duk__getconst(comp_ctx); - *out_reg_varbind = -1; - *out_rc_varname = rc_varname; - return 0; - } -} - -/* - * Label handling - * - * Labels are initially added with flags prohibiting both break and continue. - * When the statement type is finally uncovered (after potentially multiple - * labels), all the labels are updated to allow/prohibit break and continue. - */ - -DUK_LOCAL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id) { - duk_hthread *thr = comp_ctx->thr; - duk_size_t n; - duk_size_t new_size; - duk_uint8_t *p; - duk_labelinfo *li_start, *li; - - /* Duplicate (shadowing) labels are not allowed, except for the empty - * labels (which are used as default labels for switch and iteration - * statements). - * - * We could also allow shadowing of non-empty pending labels without any - * other issues than breaking the required label shadowing requirements - * of the E5 specification, see Section 12.12. - */ - - p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); - li_start = (duk_labelinfo *) (void *) p; - li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); - n = (duk_size_t) (li - li_start); - - while (li > li_start) { - li--; - - if (li->h_label == h_label && h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) { - DUK_ERROR_SYNTAX(thr, DUK_STR_DUPLICATE_LABEL); - } - } - - duk_push_hstring(thr, h_label); - DUK_ASSERT(n <= DUK_UARRIDX_MAX); /* label limits */ - (void) duk_put_prop_index(thr, comp_ctx->curr_func.labelnames_idx, (duk_uarridx_t) n); - - new_size = (n + 1) * sizeof(duk_labelinfo); - duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, new_size); - /* XXX: slack handling, slow now */ - - /* relookup after possible realloc */ - p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); - li_start = (duk_labelinfo *) (void *) p; - DUK_UNREF(li_start); /* silence scan-build warning */ - li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); - li--; - - /* Labels can be used for iteration statements but also for other statements, - * in particular a label can be used for a block statement. All cases of a - * named label accept a 'break' so that flag is set here. Iteration statements - * also allow 'continue', so that flag is updated when we figure out the - * statement type. - */ - - li->flags = DUK_LABEL_FLAG_ALLOW_BREAK; - li->label_id = label_id; - li->h_label = h_label; - li->catch_depth = comp_ctx->curr_func.catch_depth; /* catch depth from current func */ - li->pc_label = pc_label; - - DUK_DDD(DUK_DDDPRINT("registered label: flags=0x%08lx, id=%ld, name=%!O, catch_depth=%ld, pc_label=%ld", - (unsigned long) li->flags, (long) li->label_id, (duk_heaphdr *) li->h_label, - (long) li->catch_depth, (long) li->pc_label)); -} - -/* Update all labels with matching label_id. */ -DUK_LOCAL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags) { - duk_uint8_t *p; - duk_labelinfo *li_start, *li; - - p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(comp_ctx->thr->heap, comp_ctx->curr_func.h_labelinfos); - li_start = (duk_labelinfo *) (void *) p; - li = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); - - /* Match labels starting from latest; once label_id no longer matches, we can - * safely exit without checking the rest of the labels (only the topmost labels - * are ever updated). - */ - while (li > li_start) { - li--; - - if (li->label_id != label_id) { - break; - } - - DUK_DDD(DUK_DDDPRINT("updating (overwriting) label flags for li=%p, label_id=%ld, flags=%ld", - (void *) li, (long) label_id, (long) flags)); - - li->flags = flags; - } -} - -/* Lookup active label information. Break/continue distinction is necessary to handle switch - * statement related labels correctly: a switch will only catch a 'break', not a 'continue'. - * - * An explicit label cannot appear multiple times in the active set, but empty labels (unlabelled - * iteration and switch statements) can. A break will match the closest unlabelled or labelled - * statement. A continue will match the closest unlabelled or labelled iteration statement. It is - * a syntax error if a continue matches a labelled switch statement; because an explicit label cannot - * be duplicated, the continue cannot match any valid label outside the switch. - * - * A side effect of these rules is that a LABEL statement related to a switch should never actually - * catch a continue abrupt completion at run-time. Hence an INVALID opcode can be placed in the - * continue slot of the switch's LABEL statement. - */ - -/* XXX: awkward, especially the bunch of separate output values -> output struct? */ -DUK_LOCAL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest) { - duk_hthread *thr = comp_ctx->thr; - duk_uint8_t *p; - duk_labelinfo *li_start, *li_end, *li; - duk_bool_t match = 0; - - DUK_DDD(DUK_DDDPRINT("looking up active label: label='%!O', is_break=%ld", - (duk_heaphdr *) h_label, (long) is_break)); - - DUK_UNREF(thr); - - p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos); - li_start = (duk_labelinfo *) (void *) p; - li_end = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos)); - li = li_end; - - /* Match labels starting from latest label because there can be duplicate empty - * labels in the label set. - */ - while (li > li_start) { - li--; - - if (li->h_label != h_label) { - DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] ->'%!O' != %!O", - (long) (li - li_start), - (duk_heaphdr *) li->h_label, - (duk_heaphdr *) h_label)); - continue; - } - - DUK_DDD(DUK_DDDPRINT("labelinfo[%ld] -> '%!O' label name matches (still need to check type)", - (long) (li - li_start), (duk_heaphdr *) h_label)); - - /* currently all labels accept a break, so no explicit check for it now */ - DUK_ASSERT(li->flags & DUK_LABEL_FLAG_ALLOW_BREAK); - - if (is_break) { - /* break matches always */ - match = 1; - break; - } else if (li->flags & DUK_LABEL_FLAG_ALLOW_CONTINUE) { - /* iteration statements allow continue */ - match = 1; - break; - } else { - /* continue matched this label -- we can only continue if this is the empty - * label, for which duplication is allowed, and thus there is hope of - * finding a match deeper in the label stack. - */ - if (h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL); - } else { - DUK_DDD(DUK_DDDPRINT("continue matched an empty label which does not " - "allow a continue -> continue lookup deeper in label stack")); - } - } - } - /* XXX: match flag is awkward, rework */ - if (!match) { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL); - } - - DUK_DDD(DUK_DDDPRINT("label match: %!O -> label_id %ld, catch_depth=%ld, pc_label=%ld", - (duk_heaphdr *) h_label, (long) li->label_id, - (long) li->catch_depth, (long) li->pc_label)); - - *out_label_id = li->label_id; - *out_label_catch_depth = li->catch_depth; - *out_label_pc = li->pc_label; - *out_is_closest = (li == li_end - 1); -} - -DUK_LOCAL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len) { - duk_hthread *thr = comp_ctx->thr; - - duk_set_length(thr, comp_ctx->curr_func.labelnames_idx, len); - duk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, sizeof(duk_labelinfo) * len); -} - -/* - * Expression parsing: duk__expr_nud(), duk__expr_led(), duk__expr_lbp(), and helpers. - * - * - duk__expr_nud(): ("null denotation"): process prev_token as a "start" of an expression (e.g. literal) - * - duk__expr_led(): ("left denotation"): process prev_token in the "middle" of an expression (e.g. operator) - * - duk__expr_lbp(): ("left-binding power"): return left-binding power of curr_token - */ - -/* object literal key tracking flags */ -#define DUK__OBJ_LIT_KEY_PLAIN (1 << 0) /* key encountered as a plain property */ -#define DUK__OBJ_LIT_KEY_GET (1 << 1) /* key encountered as a getter */ -#define DUK__OBJ_LIT_KEY_SET (1 << 2) /* key encountered as a setter */ - -DUK_LOCAL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t reg_obj; /* result reg */ - duk_regconst_t reg_temp; /* temp reg */ - duk_regconst_t temp_start; /* temp reg value for start of loop */ - duk_small_uint_t max_init_values; /* max # of values initialized in one MPUTARR set */ - duk_small_uint_t num_values; /* number of values in current MPUTARR set */ - duk_uarridx_t curr_idx; /* current (next) array index */ - duk_uarridx_t start_idx; /* start array index of current MPUTARR set */ - duk_uarridx_t init_idx; /* last array index explicitly initialized, +1 */ - duk_bool_t require_comma; /* next loop requires a comma */ -#if !defined(DUK_USE_PREFER_SIZE) - duk_int_t pc_newarr; - duk_compiler_instr *instr; -#endif - - /* DUK_TOK_LBRACKET already eaten, current token is right after that */ - DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LBRACKET); - - max_init_values = DUK__MAX_ARRAY_INIT_VALUES; /* XXX: depend on available temps? */ - - reg_obj = DUK__ALLOCTEMP(comp_ctx); -#if !defined(DUK_USE_PREFER_SIZE) - pc_newarr = duk__get_current_pc(comp_ctx); -#endif - duk__emit_bc(comp_ctx, DUK_OP_NEWARR, reg_obj); /* XXX: patch initial size hint afterwards? */ - temp_start = DUK__GETTEMP(comp_ctx); - - /* - * Emit initializers in sets of maximum max_init_values. - * Corner cases such as single value initializers do not have - * special handling now. - * - * Elided elements must not be emitted as 'undefined' values, - * because such values would be enumerable (which is incorrect). - * Also note that trailing elisions must be reflected in the - * length of the final array but cause no elements to be actually - * inserted. - */ - - curr_idx = 0; - init_idx = 0; /* tracks maximum initialized index + 1 */ - start_idx = 0; - require_comma = 0; - - for (;;) { - num_values = 0; - DUK__SETTEMP(comp_ctx, temp_start); - - if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) { - break; - } - - for (;;) { - if (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) { - /* the outer loop will recheck and exit */ - break; - } - - /* comma check */ - if (require_comma) { - if (comp_ctx->curr_token.t == DUK_TOK_COMMA) { - /* comma after a value, expected */ - duk__advance(comp_ctx); - require_comma = 0; - continue; - } else { - goto syntax_error; - } - } else { - if (comp_ctx->curr_token.t == DUK_TOK_COMMA) { - /* elision - flush */ - curr_idx++; - duk__advance(comp_ctx); - /* if num_values > 0, MPUTARR emitted by outer loop after break */ - break; - } - } - /* else an array initializer element */ - - /* initial index */ - if (num_values == 0) { - start_idx = curr_idx; - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_load_int32(comp_ctx, reg_temp, (duk_int32_t) start_idx); - } - - reg_temp = DUK__ALLOCTEMP(comp_ctx); /* alloc temp just in case, to update max temp */ - DUK__SETTEMP(comp_ctx, reg_temp); - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); - DUK__SETTEMP(comp_ctx, reg_temp + 1); - - num_values++; - curr_idx++; - require_comma = 1; - - if (num_values >= max_init_values) { - /* MPUTARR emitted by outer loop */ - break; - } - } - - if (num_values > 0) { - /* - A is a source register (it's not a write target, but used - * to identify the target object) but can be shuffled. - * - B cannot be shuffled normally because it identifies a range - * of registers, the emitter has special handling for this - * (the "no shuffle" flag must not be set). - * - C is a non-register number and cannot be shuffled, but - * never needs to be. - */ - duk__emit_a_b_c(comp_ctx, - DUK_OP_MPUTARR | - DUK__EMIT_FLAG_NO_SHUFFLE_C | - DUK__EMIT_FLAG_A_IS_SOURCE, - reg_obj, - temp_start, - (duk_regconst_t) (num_values + 1)); - init_idx = start_idx + num_values; - - /* num_values and temp_start reset at top of outer loop */ - } - } - - /* Update initil size for NEWARR, doesn't need to be exact and is - * capped at A field limit. - */ -#if !defined(DUK_USE_PREFER_SIZE) - instr = duk__get_instr_ptr(comp_ctx, pc_newarr); - instr->ins |= DUK_ENC_OP_A(0, curr_idx > DUK_BC_A_MAX ? DUK_BC_A_MAX : curr_idx); -#endif - - DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RBRACKET); - duk__advance(comp_ctx); - - DUK_DDD(DUK_DDDPRINT("array literal done, curridx=%ld, initidx=%ld", - (long) curr_idx, (long) init_idx)); - - /* trailing elisions? */ - if (curr_idx > init_idx) { - /* yes, must set array length explicitly */ - DUK_DDD(DUK_DDDPRINT("array literal has trailing elisions which affect its length")); - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_load_int32(comp_ctx, reg_temp, (duk_int_t) curr_idx); - duk__emit_a_bc(comp_ctx, - DUK_OP_SETALEN | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_obj, - reg_temp); - } - - DUK__SETTEMP(comp_ctx, temp_start); - - duk__ivalue_regconst(res, reg_obj); - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARRAY_LITERAL); -} - -typedef struct { - duk_regconst_t reg_obj; - duk_regconst_t temp_start; - duk_small_uint_t num_pairs; - duk_small_uint_t num_total_pairs; -} duk__objlit_state; - -DUK_LOCAL void duk__objlit_flush_keys(duk_compiler_ctx *comp_ctx, duk__objlit_state *st) { - if (st->num_pairs > 0) { - /* - A is a source register (it's not a write target, but used - * to identify the target object) but can be shuffled. - * - B cannot be shuffled normally because it identifies a range - * of registers, the emitter has special handling for this - * (the "no shuffle" flag must not be set). - * - C is a non-register number and cannot be shuffled, but - * never needs to be. - */ - DUK_ASSERT(st->num_pairs > 0); - duk__emit_a_b_c(comp_ctx, - DUK_OP_MPUTOBJ | - DUK__EMIT_FLAG_NO_SHUFFLE_C | - DUK__EMIT_FLAG_A_IS_SOURCE, - st->reg_obj, - st->temp_start, - (duk_regconst_t) (st->num_pairs * 2)); - st->num_total_pairs += st->num_pairs; - st->num_pairs = 0; - } - DUK__SETTEMP(comp_ctx, st->temp_start); -} - -DUK_LOCAL duk_bool_t duk__objlit_load_key(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_token *tok, duk_regconst_t reg_temp) { - if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t_nores == DUK_TOK_STRING) { - /* same handling for identifiers and strings */ - DUK_ASSERT(tok->str1 != NULL); - duk_push_hstring(comp_ctx->thr, tok->str1); - } else if (tok->t == DUK_TOK_NUMBER) { - /* numbers can be loaded as numbers and coerced on the fly */ - duk_push_number(comp_ctx->thr, tok->num); - } else { - return 1; /* error */ - } - - duk__ivalue_plain_fromstack(comp_ctx, res); - DUK__SETTEMP(comp_ctx, reg_temp + 1); - duk__ivalue_toforcedreg(comp_ctx, res, reg_temp); - DUK__SETTEMP(comp_ctx, reg_temp + 1); - return 0; -} - -DUK_LOCAL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk__objlit_state st; - duk_regconst_t reg_temp; /* temp reg */ - duk_small_uint_t max_init_pairs; /* max # of key-value pairs initialized in one MPUTOBJ set */ - duk_bool_t first; /* first value: comma must not precede the value */ - duk_bool_t is_set, is_get; /* temps */ -#if !defined(DUK_USE_PREFER_SIZE) - duk_int_t pc_newobj; - duk_compiler_instr *instr; -#endif - - DUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LCURLY); - - max_init_pairs = DUK__MAX_OBJECT_INIT_PAIRS; /* XXX: depend on available temps? */ - - st.reg_obj = DUK__ALLOCTEMP(comp_ctx); /* target object */ - st.temp_start = DUK__GETTEMP(comp_ctx); /* start of MPUTOBJ argument list */ - st.num_pairs = 0; /* number of key/value pairs emitted for current MPUTOBJ set */ - st.num_total_pairs = 0; /* number of key/value pairs emitted overall */ - -#if !defined(DUK_USE_PREFER_SIZE) - pc_newobj = duk__get_current_pc(comp_ctx); -#endif - duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, st.reg_obj); - - /* - * Emit initializers in sets of maximum max_init_pairs keys. - * Setter/getter is handled separately and terminates the - * current set of initializer values. Corner cases such as - * single value initializers do not have special handling now. - */ - - first = 1; - for (;;) { - /* - * ES5 and ES2015+ provide a lot of different PropertyDefinition - * formats, see http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer. - * - * PropertyName can be IdentifierName (includes reserved words), a string - * literal, or a number literal. Note that IdentifierName allows 'get' and - * 'set' too, so we need to look ahead to the next token to distinguish: - * - * { get : 1 } - * - * and - * - * { get foo() { return 1 } } - * { get get() { return 1 } } // 'get' as getter propertyname - * - * Finally, a trailing comma is allowed. - * - * Key name is coerced to string at compile time (and ends up as a - * a string constant) even for numeric keys (e.g. "{1:'foo'}"). - * These could be emitted using e.g. LDINT, but that seems hardly - * worth the effort and would increase code size. - */ - - DUK_DDD(DUK_DDDPRINT("object literal loop, curr_token->t = %ld", - (long) comp_ctx->curr_token.t)); - - if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { - break; - } - - if (first) { - first = 0; - } else { - if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { - goto syntax_error; - } - duk__advance(comp_ctx); - if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { - /* trailing comma followed by rcurly */ - break; - } - } - - /* Advance to get one step of lookup. */ - duk__advance(comp_ctx); - - /* Flush current MPUTOBJ if enough many pairs gathered. */ - if (st.num_pairs >= max_init_pairs) { - duk__objlit_flush_keys(comp_ctx, &st); - DUK_ASSERT(st.num_pairs == 0); - } - - /* Reset temp register state and reserve reg_temp and - * reg_temp + 1 for handling the current property. - */ - DUK__SETTEMP(comp_ctx, st.temp_start + 2 * (duk_regconst_t) st.num_pairs); - reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2); - - /* NOTE: "get" and "set" are not officially ReservedWords and the lexer - * currently treats them always like ordinary identifiers (DUK_TOK_GET - * and DUK_TOK_SET are unused). They need to be detected based on the - * identifier string content. - */ - - is_get = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && - comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_GET(thr)); - is_set = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && - comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_SET(thr)); - if ((is_get || is_set) && comp_ctx->curr_token.t != DUK_TOK_COLON) { - /* getter/setter */ - duk_int_t fnum; - - duk__objlit_flush_keys(comp_ctx, &st); - DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start); /* 2 regs are guaranteed to be allocated w.r.t. temp_max */ - reg_temp = DUK__ALLOCTEMPS(comp_ctx, 2); - - if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->curr_token, reg_temp) != 0) { - goto syntax_error; - } - - /* curr_token = get/set name */ - fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_GETSET); - - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - st.temp_start + 1, - (duk_regconst_t) fnum); - - /* Slot C is used in a non-standard fashion (range of regs), - * emitter code has special handling for it (must not set the - * "no shuffle" flag). - */ - duk__emit_a_bc(comp_ctx, - (is_get ? DUK_OP_INITGET : DUK_OP_INITSET) | DUK__EMIT_FLAG_A_IS_SOURCE, - st.reg_obj, - st.temp_start); /* temp_start+0 = key, temp_start+1 = closure */ - - DUK_ASSERT(st.num_pairs == 0); /* temp state is reset on next loop */ -#if defined(DUK_USE_ES6) - } else if (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && - (comp_ctx->curr_token.t == DUK_TOK_COMMA || comp_ctx->curr_token.t == DUK_TOK_RCURLY)) { - duk_bool_t load_rc; - - load_rc = duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp); - DUK_UNREF(load_rc); - DUK_ASSERT(load_rc == 0); /* always succeeds because token is identifier */ - - duk__ivalue_var_hstring(comp_ctx, res, comp_ctx->prev_token.str1); - DUK_ASSERT(DUK__GETTEMP(comp_ctx) == reg_temp + 1); - duk__ivalue_toforcedreg(comp_ctx, res, reg_temp + 1); - - st.num_pairs++; - } else if ((comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER || - comp_ctx->prev_token.t == DUK_TOK_STRING || - comp_ctx->prev_token.t == DUK_TOK_NUMBER) && - comp_ctx->curr_token.t == DUK_TOK_LPAREN) { - duk_int_t fnum; - - /* Parsing-wise there's a small hickup here: the token parsing - * state is one step too advanced for the function parse helper - * compared to other cases. The current solution is an extra - * flag to indicate whether function parsing should use the - * current or the previous token to starting parsing from. - */ - - if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) { - goto syntax_error; - } - - fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_USE_PREVTOKEN | DUK__FUNC_FLAG_METDEF); - - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - reg_temp + 1, - (duk_regconst_t) fnum); - - st.num_pairs++; -#endif /* DUK_USE_ES6 */ - } else { -#if defined(DUK_USE_ES6) - if (comp_ctx->prev_token.t == DUK_TOK_LBRACKET) { - /* ES2015 computed property name. Executor ToPropertyKey() - * coerces the key at runtime. - */ - DUK__SETTEMP(comp_ctx, reg_temp); - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR, reg_temp); - duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET); - - /* XXX: If next token is '(' we're dealing with - * the method shorthand with a computed name, - * e.g. { [Symbol.for('foo')](a,b) {} }. This - * form is not yet supported and causes a - * SyntaxError on the DUK_TOK_COLON check below. - */ - } - else -#endif /* DUK_USE_ES6 */ - { - if (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) { - goto syntax_error; - } - } - - duk__advance_expect(comp_ctx, DUK_TOK_COLON); - - DUK__SETTEMP(comp_ctx, reg_temp + 1); - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp + 1 /*forced_reg*/); - - st.num_pairs++; - } - } /* property loop */ - - /* Flush remaining properties. */ - duk__objlit_flush_keys(comp_ctx, &st); - DUK_ASSERT(st.num_pairs == 0); - DUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start); - - /* Update initial size for NEWOBJ. The init size doesn't need to be - * exact as the purpose is just to avoid object resizes in common - * cases. The size is capped to field A limit, and will be too high - * if the object literal contains duplicate keys (this is harmless but - * increases memory traffic if the object is compacted later on). - */ -#if !defined(DUK_USE_PREFER_SIZE) - instr = duk__get_instr_ptr(comp_ctx, pc_newobj); - instr->ins |= DUK_ENC_OP_A(0, st.num_total_pairs > DUK_BC_A_MAX ? DUK_BC_A_MAX : st.num_total_pairs); -#endif - - DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY); - duk__advance(comp_ctx); - - duk__ivalue_regconst(res, st.reg_obj); - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_OBJECT_LITERAL); -} - -/* Parse argument list. Arguments are written to temps starting from - * "next temp". Returns number of arguments parsed. Expects left paren - * to be already eaten, and eats the right paren before returning. - */ -DUK_LOCAL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_int_t nargs = 0; - duk_regconst_t reg_temp; - - /* Note: expect that caller has already eaten the left paren */ - - DUK_DDD(DUK_DDDPRINT("start parsing arguments, prev_token.t=%ld, curr_token.t=%ld", - (long) comp_ctx->prev_token.t, (long) comp_ctx->curr_token.t)); - - for (;;) { - if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) { - break; - } - if (nargs > 0) { - duk__advance_expect(comp_ctx, DUK_TOK_COMMA); - } - - /* We want the argument expression value to go to "next temp" - * without additional moves. That should almost always be the - * case, but we double check after expression parsing. - * - * This is not the cleanest possible approach. - */ - - reg_temp = DUK__ALLOCTEMP(comp_ctx); /* bump up "allocated" reg count, just in case */ - DUK__SETTEMP(comp_ctx, reg_temp); - - /* binding power must be high enough to NOT allow comma expressions directly */ - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp); /* always allow 'in', coerce to 'tr' just in case */ - - DUK__SETTEMP(comp_ctx, reg_temp + 1); - nargs++; - - DUK_DDD(DUK_DDDPRINT("argument #%ld written into reg %ld", (long) nargs, (long) reg_temp)); - } - - /* eat the right paren */ - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - DUK_DDD(DUK_DDDPRINT("end parsing arguments")); - - return nargs; -} - -DUK_LOCAL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx) { - /* empty expressions can be detected conveniently with nud/led counts */ - return (comp_ctx->curr_func.nud_count == 0) && - (comp_ctx->curr_func.led_count == 0); -} - -DUK_LOCAL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_token *tk; - duk_regconst_t temp_at_entry; - duk_small_uint_t tok; - duk_uint32_t args; /* temp variable to pass constants and flags to shared code */ - - /* - * ctx->prev_token token to process with duk__expr_nud() - * ctx->curr_token updated by caller - * - * Note: the token in the switch below has already been eaten. - */ - - temp_at_entry = DUK__GETTEMP(comp_ctx); - - comp_ctx->curr_func.nud_count++; - - tk = &comp_ctx->prev_token; - tok = tk->t; - res->t = DUK_IVAL_NONE; - - DUK_DDD(DUK_DDDPRINT("duk__expr_nud(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld", - (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level)); - - switch (tok) { - - /* PRIMARY EXPRESSIONS */ - - case DUK_TOK_THIS: { - duk_regconst_t reg_temp; - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_bc(comp_ctx, - DUK_OP_LDTHIS, - reg_temp); - duk__ivalue_regconst(res, reg_temp); - return; - } - case DUK_TOK_IDENTIFIER: { - duk__ivalue_var_hstring(comp_ctx, res, tk->str1); - return; - } - case DUK_TOK_NULL: { - duk_push_null(thr); - goto plain_value; - } - case DUK_TOK_TRUE: { - duk_push_true(thr); - goto plain_value; - } - case DUK_TOK_FALSE: { - duk_push_false(thr); - goto plain_value; - } - case DUK_TOK_NUMBER: { - duk_push_number(thr, tk->num); - goto plain_value; - } - case DUK_TOK_STRING: { - DUK_ASSERT(tk->str1 != NULL); - duk_push_hstring(thr, tk->str1); - goto plain_value; - } - case DUK_TOK_REGEXP: { -#if defined(DUK_USE_REGEXP_SUPPORT) - duk_regconst_t reg_temp; - duk_regconst_t rc_re_bytecode; /* const */ - duk_regconst_t rc_re_source; /* const */ - - DUK_ASSERT(tk->str1 != NULL); - DUK_ASSERT(tk->str2 != NULL); - - DUK_DDD(DUK_DDDPRINT("emitting regexp op, str1=%!O, str2=%!O", - (duk_heaphdr *) tk->str1, - (duk_heaphdr *) tk->str2)); - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk_push_hstring(thr, tk->str1); - duk_push_hstring(thr, tk->str2); - - /* [ ... pattern flags ] */ - - duk_regexp_compile(thr); - - /* [ ... escaped_source bytecode ] */ - - rc_re_bytecode = duk__getconst(comp_ctx); - rc_re_source = duk__getconst(comp_ctx); - - duk__emit_a_b_c(comp_ctx, - DUK_OP_REGEXP | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp /*a*/, - rc_re_bytecode /*b*/, - rc_re_source /*c*/); - - duk__ivalue_regconst(res, reg_temp); - return; -#else /* DUK_USE_REGEXP_SUPPORT */ - goto syntax_error; -#endif /* DUK_USE_REGEXP_SUPPORT */ - } - case DUK_TOK_LBRACKET: { - DUK_DDD(DUK_DDDPRINT("parsing array literal")); - duk__nud_array_literal(comp_ctx, res); - return; - } - case DUK_TOK_LCURLY: { - DUK_DDD(DUK_DDDPRINT("parsing object literal")); - duk__nud_object_literal(comp_ctx, res); - return; - } - case DUK_TOK_LPAREN: { - duk_bool_t prev_allow_in; - - comp_ctx->curr_func.paren_level++; - prev_allow_in = comp_ctx->curr_func.allow_in; - comp_ctx->curr_func.allow_in = 1; /* reset 'allow_in' for parenthesized expression */ - - duk__expr(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, terminates at a ')' */ - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - comp_ctx->curr_func.allow_in = prev_allow_in; - comp_ctx->curr_func.paren_level--; - return; - } - - /* MEMBER/NEW/CALL EXPRESSIONS */ - - case DUK_TOK_NEW: { - /* - * Parsing an expression starting with 'new' is tricky because - * there are multiple possible productions deriving from - * LeftHandSideExpression which begin with 'new'. - * - * We currently resort to one-token lookahead to distinguish the - * cases. Hopefully this is correct. The binding power must be - * such that parsing ends at an LPAREN (CallExpression) but not at - * a PERIOD or LBRACKET (MemberExpression). - * - * See doc/compiler.rst for discussion on the parsing approach, - * and testcases/test-dev-new.js for a bunch of documented tests. - */ - - duk_regconst_t reg_target; - duk_int_t nargs; - - DUK_DDD(DUK_DDDPRINT("begin parsing new expression")); - - reg_target = DUK__ALLOCTEMPS(comp_ctx, 2); - -#if defined(DUK_USE_ES6) - if (comp_ctx->curr_token.t == DUK_TOK_PERIOD) { - /* new.target */ - DUK_DDD(DUK_DDDPRINT("new.target")); - duk__advance(comp_ctx); - if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER || - !duk_hstring_equals_ascii_cstring(comp_ctx->curr_token.str1, "target")) { - goto syntax_error_newtarget; - } - if (comp_ctx->curr_func.is_global) { - goto syntax_error_newtarget; - } - duk__advance(comp_ctx); - duk__emit_bc(comp_ctx, - DUK_OP_NEWTARGET, - reg_target); - duk__ivalue_regconst(res, reg_target); - return; - } -#endif /* DUK_USE_ES6 */ - - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_CALL /*rbp_flags*/, reg_target /*forced_reg*/); - duk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, reg_target + 1); /* default instance */ - DUK__SETTEMP(comp_ctx, reg_target + 2); - - /* XXX: 'new obj.noSuch()' doesn't use GETPROPC now which - * makes the error message worse than for obj.noSuch(). - */ - - if (comp_ctx->curr_token.t == DUK_TOK_LPAREN) { - /* 'new' MemberExpression Arguments */ - DUK_DDD(DUK_DDDPRINT("new expression has argument list")); - duk__advance(comp_ctx); - nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp", reg_target + 1 */ - /* right paren eaten */ - } else { - /* 'new' MemberExpression */ - DUK_DDD(DUK_DDDPRINT("new expression has no argument list")); - nargs = 0; - } - - duk__emit_a_bc(comp_ctx, - DUK_OP_CALL0 | DUK_BC_CALL_FLAG_CONSTRUCT, - nargs /*num_args*/, - reg_target /*target*/); - - DUK_DDD(DUK_DDDPRINT("end parsing new expression")); - - duk__ivalue_regconst(res, reg_target); - return; - } - - /* FUNCTION EXPRESSIONS */ - - case DUK_TOK_FUNCTION: { - /* Function expression. Note that any statement beginning with 'function' - * is handled by the statement parser as a function declaration, or a - * non-standard function expression/statement (or a SyntaxError). We only - * handle actual function expressions (occurring inside an expression) here. - * - * O(depth^2) parse count for inner functions is handled by recording a - * lexer offset on the first compilation pass, so that the function can - * be efficiently skipped on the second pass. This is encapsulated into - * duk__parse_func_like_fnum(). - */ - - duk_regconst_t reg_temp; - duk_int_t fnum; - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - - /* curr_token follows 'function' */ - fnum = duk__parse_func_like_fnum(comp_ctx, 0 /*flags*/); - DUK_DDD(DUK_DDDPRINT("parsed inner function -> fnum %ld", (long) fnum)); - - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - reg_temp /*a*/, - (duk_regconst_t) fnum /*bc*/); - - duk__ivalue_regconst(res, reg_temp); - return; - } - - /* UNARY EXPRESSIONS */ - - case DUK_TOK_DELETE: { - /* Delete semantics are a bit tricky. The description in E5 specification - * is kind of confusing, because it distinguishes between resolvability of - * a reference (which is only known at runtime) seemingly at compile time - * (= SyntaxError throwing). - */ - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - if (res->t == DUK_IVAL_VAR) { - /* not allowed in strict mode, regardless of whether resolves; - * in non-strict mode DELVAR handles both non-resolving and - * resolving cases (the specification description is a bit confusing). - */ - - duk_regconst_t reg_temp; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - if (comp_ctx->curr_func.is_strict) { - DUK_ERROR_SYNTAX(thr, DUK_STR_CANNOT_DELETE_IDENTIFIER); - } - - DUK__SETTEMP(comp_ctx, temp_at_entry); - reg_temp = DUK__ALLOCTEMP(comp_ctx); - - duk_dup(thr, res->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - /* register bound variables are non-configurable -> always false */ - duk__emit_bc(comp_ctx, - DUK_OP_LDFALSE, - reg_temp); - } else { - duk_dup(thr, res->x1.valstack_idx); - rc_varname = duk__getconst(comp_ctx); - duk__emit_a_bc(comp_ctx, - DUK_OP_DELVAR, - reg_temp, - rc_varname); - } - duk__ivalue_regconst(res, reg_temp); - } else if (res->t == DUK_IVAL_PROP) { - duk_regconst_t reg_temp; - duk_regconst_t reg_obj; - duk_regconst_t rc_key; - - DUK__SETTEMP(comp_ctx, temp_at_entry); - reg_temp = DUK__ALLOCTEMP(comp_ctx); - reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ - rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - duk__emit_a_b_c(comp_ctx, - DUK_OP_DELPROP | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp, - reg_obj, - rc_key); - - duk__ivalue_regconst(res, reg_temp); - } else { - /* non-Reference deletion is always 'true', even in strict mode */ - duk_push_true(thr); - goto plain_value; - } - return; - } - case DUK_TOK_VOID: { - duk__expr_toplain_ignore(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - duk_push_undefined(thr); - goto plain_value; - } - case DUK_TOK_TYPEOF: { - /* 'typeof' must handle unresolvable references without throwing - * a ReferenceError (E5 Section 11.4.3). Register mapped values - * will never be unresolvable so special handling is only required - * when an identifier is a "slow path" one. - */ - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - - if (res->t == DUK_IVAL_VAR) { - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - duk_regconst_t reg_temp; - - duk_dup(thr, res->x1.valstack_idx); - if (!duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - DUK_DDD(DUK_DDDPRINT("typeof for an identifier name which could not be resolved " - "at compile time, need to use special run-time handling")); - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_bc(comp_ctx, - DUK_OP_TYPEOFID, - reg_temp, - rc_varname); - duk__ivalue_regconst(res, reg_temp); - return; - } - } - - args = DUK_OP_TYPEOF; - goto unary; - } - case DUK_TOK_INCREMENT: { - args = (DUK_OP_PREINCP << 8) + DUK_OP_PREINCR; - goto preincdec; - } - case DUK_TOK_DECREMENT: { - args = (DUK_OP_PREDECP << 8) + DUK_OP_PREDECR; - goto preincdec; - } - case DUK_TOK_ADD: { - /* unary plus */ - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE && - duk_is_number(thr, res->x1.valstack_idx)) { - /* unary plus of a number is identity */ - return; - } - args = DUK_OP_UNP; - goto unary; - } - case DUK_TOK_SUB: { - /* unary minus */ - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE && - duk_is_number(thr, res->x1.valstack_idx)) { - /* this optimization is important to handle negative literals - * (which are not directly provided by the lexical grammar) - */ - duk_tval *tv_num; - duk_double_union du; - - tv_num = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx); - DUK_ASSERT(tv_num != NULL); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_num)); - du.d = DUK_TVAL_GET_NUMBER(tv_num); - du.d = -du.d; - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); - DUK_TVAL_SET_NUMBER(tv_num, du.d); - return; - } - args = DUK_OP_UNM; - goto unary; - } - case DUK_TOK_BNOT: { - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - args = DUK_OP_BNOT; - goto unary; - } - case DUK_TOK_LNOT: { - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - if (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE) { - /* Very minimal inlining to handle common idioms '!0' and '!1', - * and also boolean arguments like '!false' and '!true'. - */ - duk_tval *tv_val; - - tv_val = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx); - DUK_ASSERT(tv_val != NULL); - if (DUK_TVAL_IS_NUMBER(tv_val)) { - duk_double_t d; - d = DUK_TVAL_GET_NUMBER(tv_val); - if (d == 0.0) { - /* Matches both +0 and -0 on purpose. */ - DUK_DDD(DUK_DDDPRINT("inlined lnot: !0 -> true")); - DUK_TVAL_SET_BOOLEAN_TRUE(tv_val); - return; - } else if (d == 1.0) { - DUK_DDD(DUK_DDDPRINT("inlined lnot: !1 -> false")); - DUK_TVAL_SET_BOOLEAN_FALSE(tv_val); - return; - } - } else if (DUK_TVAL_IS_BOOLEAN(tv_val)) { - duk_small_uint_t v; - v = DUK_TVAL_GET_BOOLEAN(tv_val); - DUK_DDD(DUK_DDDPRINT("inlined lnot boolean: %ld", (long) v)); - DUK_ASSERT(v == 0 || v == 1); - DUK_TVAL_SET_BOOLEAN(tv_val, v ^ 0x01); - return; - } - } - args = DUK_OP_LNOT; - goto unary; - } - - } /* end switch */ - - DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); - return; - - unary: - { - /* Unary opcodes use just the 'BC' register source because it - * matches current shuffle limits, and maps cleanly to 16 high - * bits of the opcode. - */ - - duk_regconst_t reg_src, reg_res; - - reg_src = duk__ivalue_toregconst_raw(comp_ctx, res, -1 /*forced_reg*/, 0 /*flags*/); - if (DUK__ISREG_TEMP(comp_ctx, reg_src)) { - reg_res = reg_src; - } else { - reg_res = DUK__ALLOCTEMP(comp_ctx); - } - duk__emit_a_bc(comp_ctx, - args, - reg_res, - reg_src); - duk__ivalue_regconst(res, reg_res); - return; - } - - preincdec: - { - /* preincrement and predecrement */ - duk_regconst_t reg_res; - duk_small_uint_t args_op1 = args & 0xff; /* DUK_OP_PREINCR/DUK_OP_PREDECR */ - duk_small_uint_t args_op2 = args >> 8; /* DUK_OP_PREINCP_RR/DUK_OP_PREDECP_RR */ - - /* Specific assumptions for opcode numbering. */ - DUK_ASSERT(DUK_OP_PREINCR + 4 == DUK_OP_PREINCV); - DUK_ASSERT(DUK_OP_PREDECR + 4 == DUK_OP_PREDECV); - - reg_res = DUK__ALLOCTEMP(comp_ctx); - - duk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/); /* UnaryExpression */ - if (res->t == DUK_IVAL_VAR) { - duk_hstring *h_varname; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - h_varname = duk_known_hstring(thr, res->x1.valstack_idx); - - if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { - goto syntax_error; - } - - duk_dup(thr, res->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - duk__emit_a_bc(comp_ctx, - args_op1, /* e.g. DUK_OP_PREINCR */ - reg_res, - reg_varbind); - } else { - duk__emit_a_bc(comp_ctx, - args_op1 + 4, /* e.g. DUK_OP_PREINCV */ - reg_res, - rc_varname); - } - - DUK_DDD(DUK_DDDPRINT("preincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld", - (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); - } else if (res->t == DUK_IVAL_PROP) { - duk_regconst_t reg_obj; /* allocate to reg only (not const) */ - duk_regconst_t rc_key; - reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ - rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - duk__emit_a_b_c(comp_ctx, - args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_PREINCP */ - reg_res, - reg_obj, - rc_key); - } else { - /* Technically return value is not needed because INVLHS will - * unconditially throw a ReferenceError. Coercion is necessary - * for proper semantics (consider ToNumber() called for an object). - * Use DUK_OP_UNP with a dummy register to get ToNumber(). - */ - - duk__ivalue_toforcedreg(comp_ctx, res, reg_res); - duk__emit_bc(comp_ctx, - DUK_OP_UNP, - reg_res); /* for side effects, result ignored */ - duk__emit_op_only(comp_ctx, - DUK_OP_INVLHS); - } - DUK__SETTEMP(comp_ctx, reg_res + 1); - duk__ivalue_regconst(res, reg_res); - return; - } - - plain_value: - { - /* Stack top contains plain value */ - duk__ivalue_plain_fromstack(comp_ctx, res); - return; - } - -#if defined(DUK_USE_ES6) - syntax_error_newtarget: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_NEWTARGET); -#endif - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION); -} - -/* XXX: add flag to indicate whether caller cares about return value; this - * affects e.g. handling of assignment expressions. This change needs API - * changes elsewhere too. - */ -DUK_LOCAL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_token *tk; - duk_small_uint_t tok; - duk_uint32_t args; /* temp variable to pass constants and flags to shared code */ - - /* - * ctx->prev_token token to process with duk__expr_led() - * ctx->curr_token updated by caller - */ - - comp_ctx->curr_func.led_count++; - - /* The token in the switch has already been eaten here */ - tk = &comp_ctx->prev_token; - tok = tk->t; - - DUK_DDD(DUK_DDDPRINT("duk__expr_led(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld", - (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level)); - - /* XXX: default priority for infix operators is duk__expr_lbp(tok) -> get it here? */ - - switch (tok) { - - /* PRIMARY EXPRESSIONS */ - - case DUK_TOK_PERIOD: { - /* Property access expressions are critical for correct LHS ordering, - * see comments in duk__expr()! - * - * A conservative approach would be to use duk__ivalue_totempconst() - * for 'left'. However, allowing a reg-bound variable seems safe here - * and is nice because "foo.bar" is a common expression. If the ivalue - * is used in an expression a GETPROP will occur before any changes to - * the base value can occur. If the ivalue is used as an assignment - * LHS, the assignment code will ensure the base value is safe from - * RHS mutation. - */ - - /* XXX: This now coerces an identifier into a GETVAR to a temp, which - * causes an extra LDREG in call setup. It's sufficient to coerce to a - * unary ivalue? - */ - duk__ivalue_toplain(comp_ctx, left); - - /* NB: must accept reserved words as property name */ - if (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER) { - DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER); - } - - res->t = DUK_IVAL_PROP; - duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */ - DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); - duk_push_hstring(thr, comp_ctx->curr_token.str1); - duk_replace(thr, res->x2.valstack_idx); - res->x2.t = DUK_ISPEC_VALUE; - - /* special RegExp literal handling after IdentifierName */ - comp_ctx->curr_func.reject_regexp_in_adv = 1; - - duk__advance(comp_ctx); - return; - } - case DUK_TOK_LBRACKET: { - /* Property access expressions are critical for correct LHS ordering, - * see comments in duk__expr()! - */ - - /* XXX: optimize temp reg use */ - /* XXX: similar coercion issue as in DUK_TOK_PERIOD */ - /* XXX: coerce to regs? it might be better for enumeration use, where the - * same PROP ivalue is used multiple times. Or perhaps coerce PROP further - * there? - */ - /* XXX: for simple cases like x['y'] an unnecessary LDREG is - * emitted for the base value; could avoid it if we knew that - * the key expression is safe (e.g. just a single literal). - */ - - /* The 'left' value must not be a register bound variable - * because it may be mutated during the rest of the expression - * and E5.1 Section 11.2.1 specifies the order of evaluation - * so that the base value is evaluated first. - * See: test-bug-nested-prop-mutate.js. - */ - duk__ivalue_totempconst(comp_ctx, left); - duk__expr_toplain(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression, ']' terminates */ - duk__advance_expect(comp_ctx, DUK_TOK_RBRACKET); - - res->t = DUK_IVAL_PROP; - duk__copy_ispec(comp_ctx, &res->x1, &res->x2); /* res.x1 -> res.x2 */ - duk__copy_ispec(comp_ctx, &left->x1, &res->x1); /* left.x1 -> res.x1 */ - return; - } - case DUK_TOK_LPAREN: { - /* function call */ - duk_regconst_t reg_cs = DUK__ALLOCTEMPS(comp_ctx, 2); - duk_int_t nargs; - duk_small_uint_t call_op = DUK_OP_CALL0; - - /* XXX: attempt to get the call result to "next temp" whenever - * possible to avoid unnecessary register shuffles. - */ - - /* - * Setup call: target and 'this' binding. Three cases: - * - * 1. Identifier base (e.g. "foo()") - * 2. Property base (e.g. "foo.bar()") - * 3. Register base (e.g. "foo()()"; i.e. when a return value is a function) - */ - - if (left->t == DUK_IVAL_VAR) { - duk_hstring *h_varname; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - DUK_DDD(DUK_DDDPRINT("function call with identifier base")); - - h_varname = duk_known_hstring(thr, left->x1.valstack_idx); - if (h_varname == DUK_HTHREAD_STRING_EVAL(thr)) { - /* Potential direct eval call detected, flag the CALL - * so that a run-time "direct eval" check is made and - * special behavior may be triggered. Note that this - * does not prevent 'eval' from being register bound. - */ - DUK_DDD(DUK_DDDPRINT("function call with identifier 'eval' " - "-> using EVALCALL, marking function " - "as may_direct_eval")); - call_op |= DUK_BC_CALL_FLAG_CALLED_AS_EVAL; - comp_ctx->curr_func.may_direct_eval = 1; - } - - duk_dup(thr, left->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - duk__emit_a_bc(comp_ctx, - DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_varbind, - reg_cs + 0); - } else { - /* XXX: expand target register or constant field to - * reduce shuffling. - */ - DUK_ASSERT(DUK__ISCONST(rc_varname)); - duk__emit_a_b(comp_ctx, - DUK_OP_CSVAR | DUK__EMIT_FLAG_BC_REGCONST, - reg_cs + 0, - rc_varname); - } - } else if (left->t == DUK_IVAL_PROP) { - /* Call through a property lookup, E5 Section 11.2.3, step 6.a.i, - * E5 Section 10.4.3. There used to be a separate CSPROP opcode - * but a typical call setup took 3 opcodes (e.g. LDREG, LDCONST, - * CSPROP) and the same can be achieved with ordinary loads. - */ -#if defined(DUK_USE_VERBOSE_ERRORS) - duk_regconst_t reg_key; -#endif - - DUK_DDD(DUK_DDDPRINT("function call with property base")); - - /* XXX: For Math.sin() this generates: LDCONST + LDREG + - * GETPROPC + call. The LDREG is unnecessary because LDCONST - * could be loaded directly into reg_cs + 1. This doesn't - * happen now because a variable cannot be in left->x1 of a - * DUK_IVAL_PROP. We could notice that left->x1 is a temp - * and reuse, but it would still be in the wrong position - * (reg_cs + 0 rather than reg_cs + 1). - */ - duk__ispec_toforcedreg(comp_ctx, &left->x1, reg_cs + 1); /* base */ -#if defined(DUK_USE_VERBOSE_ERRORS) - reg_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - duk__emit_a_b_c(comp_ctx, - DUK_OP_GETPROPC | DUK__EMIT_FLAG_BC_REGCONST, - reg_cs + 0, - reg_cs + 1, - reg_key); -#else - duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0); /* base[key] */ -#endif - } else { - DUK_DDD(DUK_DDDPRINT("function call with register base")); - - duk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0); -#if 0 - duk__emit_a_bc(comp_ctx, - DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_cs + 0, - reg_cs + 0); /* in-place setup */ -#endif - /* Because of in-place setup, REGCS is equivalent to - * just this LDUNDEF. - */ - duk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, reg_cs + 1); - } - - DUK__SETTEMP(comp_ctx, reg_cs + 2); - nargs = duk__parse_arguments(comp_ctx, res); /* parse args starting from "next temp" */ - - /* Tailcalls are handled by back-patching the already emitted opcode - * later in return statement parser. - */ - - duk__emit_a_bc(comp_ctx, - call_op, - (duk_regconst_t) nargs /*numargs*/, - reg_cs /*basereg*/); - DUK__SETTEMP(comp_ctx, reg_cs + 1); /* result in csreg */ - - duk__ivalue_regconst(res, reg_cs); - return; - } - - /* POSTFIX EXPRESSION */ - - case DUK_TOK_INCREMENT: { - args = (DUK_OP_POSTINCP_RR << 16) + (DUK_OP_POSTINCR << 8) + 0; - goto postincdec; - } - case DUK_TOK_DECREMENT: { - args = (DUK_OP_POSTDECP_RR << 16) + (DUK_OP_POSTDECR << 8) + 0; - goto postincdec; - } - - /* EXPONENTIATION EXPRESSION */ - -#if defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_TOK_EXP: { - args = (DUK_OP_EXP << 8) + DUK__BP_EXPONENTIATION - 1; /* UnaryExpression */ - goto binary; - } -#endif - - /* MULTIPLICATIVE EXPRESSION */ - - case DUK_TOK_MUL: { - args = (DUK_OP_MUL << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ - goto binary; - } - case DUK_TOK_DIV: { - args = (DUK_OP_DIV << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ - goto binary; - } - case DUK_TOK_MOD: { - args = (DUK_OP_MOD << 8) + DUK__BP_MULTIPLICATIVE; /* ExponentiationExpression */ - goto binary; - } - - /* ADDITIVE EXPRESSION */ - - case DUK_TOK_ADD: { - args = (DUK_OP_ADD << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */ - goto binary; - } - case DUK_TOK_SUB: { - args = (DUK_OP_SUB << 8) + DUK__BP_ADDITIVE; /* MultiplicativeExpression */ - goto binary; - } - - /* SHIFT EXPRESSION */ - - case DUK_TOK_ALSHIFT: { - /* << */ - args = (DUK_OP_BASL << 8) + DUK__BP_SHIFT; - goto binary; - } - case DUK_TOK_ARSHIFT: { - /* >> */ - args = (DUK_OP_BASR << 8) + DUK__BP_SHIFT; - goto binary; - } - case DUK_TOK_RSHIFT: { - /* >>> */ - args = (DUK_OP_BLSR << 8) + DUK__BP_SHIFT; - goto binary; - } - - /* RELATIONAL EXPRESSION */ - - case DUK_TOK_LT: { - /* < */ - args = (DUK_OP_LT << 8) + DUK__BP_RELATIONAL; - goto binary; - } - case DUK_TOK_GT: { - args = (DUK_OP_GT << 8) + DUK__BP_RELATIONAL; - goto binary; - } - case DUK_TOK_LE: { - args = (DUK_OP_LE << 8) + DUK__BP_RELATIONAL; - goto binary; - } - case DUK_TOK_GE: { - args = (DUK_OP_GE << 8) + DUK__BP_RELATIONAL; - goto binary; - } - case DUK_TOK_INSTANCEOF: { - args = (DUK_OP_INSTOF << 8) + DUK__BP_RELATIONAL; - goto binary; - } - case DUK_TOK_IN: { - args = (DUK_OP_IN << 8) + DUK__BP_RELATIONAL; - goto binary; - } - - /* EQUALITY EXPRESSION */ - - case DUK_TOK_EQ: { - args = (DUK_OP_EQ << 8) + DUK__BP_EQUALITY; - goto binary; - } - case DUK_TOK_NEQ: { - args = (DUK_OP_NEQ << 8) + DUK__BP_EQUALITY; - goto binary; - } - case DUK_TOK_SEQ: { - args = (DUK_OP_SEQ << 8) + DUK__BP_EQUALITY; - goto binary; - } - case DUK_TOK_SNEQ: { - args = (DUK_OP_SNEQ << 8) + DUK__BP_EQUALITY; - goto binary; - } - - /* BITWISE EXPRESSIONS */ - - case DUK_TOK_BAND: { - args = (DUK_OP_BAND << 8) + DUK__BP_BAND; - goto binary; - } - case DUK_TOK_BXOR: { - args = (DUK_OP_BXOR << 8) + DUK__BP_BXOR; - goto binary; - } - case DUK_TOK_BOR: { - args = (DUK_OP_BOR << 8) + DUK__BP_BOR; - goto binary; - } - - /* LOGICAL EXPRESSIONS */ - - case DUK_TOK_LAND: { - /* syntactically left-associative but parsed as right-associative */ - args = (1 << 8) + DUK__BP_LAND - 1; - goto binary_logical; - } - case DUK_TOK_LOR: { - /* syntactically left-associative but parsed as right-associative */ - args = (0 << 8) + DUK__BP_LOR - 1; - goto binary_logical; - } - - /* CONDITIONAL EXPRESSION */ - - case DUK_TOK_QUESTION: { - /* XXX: common reg allocation need is to reuse a sub-expression's temp reg, - * but only if it really is a temp. Nothing fancy here now. - */ - duk_regconst_t reg_temp; - duk_int_t pc_jump1; - duk_int_t pc_jump2; - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__ivalue_toforcedreg(comp_ctx, left, reg_temp); - duk__emit_if_true_skip(comp_ctx, reg_temp); - pc_jump1 = duk__emit_jump_empty(comp_ctx); /* jump to false */ - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */ - duk__advance_expect(comp_ctx, DUK_TOK_COLON); - pc_jump2 = duk__emit_jump_empty(comp_ctx); /* jump to end */ - duk__patch_jump_here(comp_ctx, pc_jump1); - duk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/); /* AssignmentExpression */ - duk__patch_jump_here(comp_ctx, pc_jump2); - - DUK__SETTEMP(comp_ctx, reg_temp + 1); - duk__ivalue_regconst(res, reg_temp); - return; - } - - /* ASSIGNMENT EXPRESSION */ - - case DUK_TOK_EQUALSIGN: { - /* - * Assignments are right associative, allows e.g. - * a = 5; - * a += b = 9; // same as a += (b = 9) - * -> expression value 14, a = 14, b = 9 - * - * Right associativiness is reflected in the BP for recursion, - * "-1" ensures assignment operations are allowed. - * - * XXX: just use DUK__BP_COMMA (i.e. no need for 2-step bp levels)? - */ - args = (DUK_OP_NONE << 8) + DUK__BP_ASSIGNMENT - 1; /* DUK_OP_NONE marks a 'plain' assignment */ - goto assign; - } - case DUK_TOK_ADD_EQ: { - /* right associative */ - args = (DUK_OP_ADD << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_SUB_EQ: { - /* right associative */ - args = (DUK_OP_SUB << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_MUL_EQ: { - /* right associative */ - args = (DUK_OP_MUL << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_DIV_EQ: { - /* right associative */ - args = (DUK_OP_DIV << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_MOD_EQ: { - /* right associative */ - args = (DUK_OP_MOD << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } -#if defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_TOK_EXP_EQ: { - /* right associative */ - args = (DUK_OP_EXP << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } -#endif - case DUK_TOK_ALSHIFT_EQ: { - /* right associative */ - args = (DUK_OP_BASL << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_ARSHIFT_EQ: { - /* right associative */ - args = (DUK_OP_BASR << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_RSHIFT_EQ: { - /* right associative */ - args = (DUK_OP_BLSR << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_BAND_EQ: { - /* right associative */ - args = (DUK_OP_BAND << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_BOR_EQ: { - /* right associative */ - args = (DUK_OP_BOR << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - case DUK_TOK_BXOR_EQ: { - /* right associative */ - args = (DUK_OP_BXOR << 8) + DUK__BP_ASSIGNMENT - 1; - goto assign; - } - - /* COMMA */ - - case DUK_TOK_COMMA: { - /* right associative */ - - duk__ivalue_toplain_ignore(comp_ctx, left); /* need side effects, not value */ - duk__expr_toplain(comp_ctx, res, DUK__BP_COMMA - 1 /*rbp_flags*/); - - /* return 'res' (of right part) as our result */ - return; - } - - default: { - break; - } - } - - DUK_D(DUK_DPRINT("parse error: unexpected token: %ld", (long) tok)); - DUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR); - return; - -#if 0 - /* XXX: shared handling for 'duk__expr_lhs'? */ - if (comp_ctx->curr_func.paren_level == 0 && XXX) { - comp_ctx->curr_func.duk__expr_lhs = 0; - } -#endif - - binary: - /* - * Shared handling of binary operations - * - * args = (opcode << 8) + rbp - */ - { - duk__ivalue_toplain(comp_ctx, left); - duk__expr_toplain(comp_ctx, res, args & 0xff /*rbp_flags*/); - - /* combine left->x1 and res->x1 (right->x1, really) -> (left->x1 OP res->x1) */ - DUK_ASSERT(left->t == DUK_IVAL_PLAIN); - DUK_ASSERT(res->t == DUK_IVAL_PLAIN); - - res->t = DUK_IVAL_ARITH; - res->op = (args >> 8) & 0xff; - - res->x2.t = res->x1.t; - res->x2.regconst = res->x1.regconst; - duk_copy(thr, res->x1.valstack_idx, res->x2.valstack_idx); - - res->x1.t = left->x1.t; - res->x1.regconst = left->x1.regconst; - duk_copy(thr, left->x1.valstack_idx, res->x1.valstack_idx); - - DUK_DDD(DUK_DDDPRINT("binary op, res: t=%ld, x1.t=%ld, x1.regconst=0x%08lx, x2.t=%ld, x2.regconst=0x%08lx", - (long) res->t, (long) res->x1.t, (unsigned long) res->x1.regconst, (long) res->x2.t, (unsigned long) res->x2.regconst)); - return; - } - - binary_logical: - /* - * Shared handling for logical AND and logical OR. - * - * args = (truthval << 8) + rbp - * - * Truthval determines when to skip right-hand-side. - * For logical AND truthval=1, for logical OR truthval=0. - * - * See doc/compiler.rst for discussion on compiling logical - * AND and OR expressions. The approach here is very simplistic, - * generating extra jumps and multiple evaluations of truth values, - * but generates code on-the-fly with only local back-patching. - * - * Both logical AND and OR are syntactically left-associated. - * However, logical ANDs are compiled as right associative - * expressions, i.e. "A && B && C" as "A && (B && C)", to allow - * skip jumps to skip over the entire tail. Similarly for logical OR. - */ - - { - duk_regconst_t reg_temp; - duk_int_t pc_jump; - duk_small_uint_t args_truthval = args >> 8; - duk_small_uint_t args_rbp = args & 0xff; - - /* XXX: unoptimal use of temps, resetting */ - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - - duk__ivalue_toforcedreg(comp_ctx, left, reg_temp); - DUK_ASSERT(DUK__ISREG(reg_temp)); - duk__emit_bc(comp_ctx, - (args_truthval ? DUK_OP_IFTRUE_R : DUK_OP_IFFALSE_R), - reg_temp); /* skip jump conditionally */ - pc_jump = duk__emit_jump_empty(comp_ctx); - duk__expr_toforcedreg(comp_ctx, res, args_rbp /*rbp_flags*/, reg_temp /*forced_reg*/); - duk__patch_jump_here(comp_ctx, pc_jump); - - duk__ivalue_regconst(res, reg_temp); - return; - } - - assign: - /* - * Shared assignment expression handling - * - * args = (opcode << 8) + rbp - * - * If 'opcode' is DUK_OP_NONE, plain assignment without arithmetic. - * Syntactically valid left-hand-side forms which are not accepted as - * left-hand-side values (e.g. as in "f() = 1") must NOT cause a - * SyntaxError, but rather a run-time ReferenceError. - * - * When evaluating X = Y, the LHS (X) is conceptually evaluated - * to a temporary first. The RHS is then evaluated. Finally, the - * is applied to the initial value of RHS (not the value after - * RHS evaluation), and written to X. Doing so concretely generates - * inefficient code so we'd like to avoid the temporary when possible. - * See: https://github.com/svaarala/duktape/pull/992. - * - * The expression value (final LHS value, written to RHS) is - * conceptually copied into a fresh temporary so that it won't - * change even if the LHS/RHS values change in outer expressions. - * For example, it'd be generally incorrect for the expression value - * to be the RHS register binding, unless there's a guarantee that it - * won't change during further expression evaluation. Using the - * temporary concretely produces inefficient bytecode, so we try to - * avoid the extra temporary for some known-to-be-safe cases. - * Currently the only safe case we detect is a "top level assignment", - * for example "x = y + z;", where the assignment expression value is - * ignored. - * See: test-dev-assign-expr.js and test-bug-assign-mutate-gh381.js. - */ - - { - duk_small_uint_t args_op = args >> 8; - duk_small_uint_t args_rbp = args & 0xff; - duk_bool_t toplevel_assign; - - /* XXX: here we need to know if 'left' is left-hand-side compatible. - * That information is no longer available from current expr parsing - * state; it would need to be carried into the 'left' ivalue or by - * some other means. - */ - - /* A top-level assignment is e.g. "x = y;". For these it's safe - * to use the RHS as-is as the expression value, even if the RHS - * is a reg-bound identifier. The RHS ('res') is right associative - * so it has consumed all other assignment level operations; the - * only relevant lower binding power construct is comma operator - * which will ignore the expression value provided here. Usually - * the top level assignment expression value is ignored, but it - * is relevant for e.g. eval code. - */ - toplevel_assign = (comp_ctx->curr_func.nud_count == 1 && /* one token before */ - comp_ctx->curr_func.led_count == 1); /* one operator (= assign) */ - DUK_DDD(DUK_DDDPRINT("assignment: nud_count=%ld, led_count=%ld, toplevel_assign=%ld", - (long) comp_ctx->curr_func.nud_count, - (long) comp_ctx->curr_func.led_count, - (long) toplevel_assign)); - - if (left->t == DUK_IVAL_VAR) { - duk_hstring *h_varname; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - DUK_ASSERT(left->x1.t == DUK_ISPEC_VALUE); /* LHS is already side effect free */ - - h_varname = duk_known_hstring(thr, left->x1.valstack_idx); - if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { - /* E5 Section 11.13.1 (and others for other assignments), step 4. */ - goto syntax_error_lvalue; - } - duk_dup(thr, left->x1.valstack_idx); - (void) duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname); - - if (args_op == DUK_OP_NONE) { - duk__expr(comp_ctx, res, args_rbp /*rbp_flags*/); - if (toplevel_assign) { - /* Any 'res' will do. */ - DUK_DDD(DUK_DDDPRINT("plain assignment, toplevel assign, use as is")); - } else { - /* 'res' must be a plain ivalue, and not register-bound variable. */ - DUK_DDD(DUK_DDDPRINT("plain assignment, not toplevel assign, ensure not a reg-bound identifier")); - if (res->t != DUK_IVAL_PLAIN || (res->x1.t == DUK_ISPEC_REGCONST && - DUK__ISREG_NOTTEMP(comp_ctx, res->x1.regconst))) { - duk__ivalue_totempconst(comp_ctx, res); - } - } - } else { - /* For X = Y we need to evaluate the pre-op - * value of X before evaluating the RHS: the RHS - * can change X, but when we do we must use - * the pre-op value. - */ - duk_regconst_t reg_temp; - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - - if (reg_varbind >= 0) { - duk_regconst_t reg_res; - duk_regconst_t reg_src; - duk_int_t pc_temp_load; - duk_int_t pc_before_rhs; - duk_int_t pc_after_rhs; - - if (toplevel_assign) { - /* 'reg_varbind' is the operation result and can also - * become the expression value for top level assignments - * such as: "var x; x += y;". - */ - DUK_DD(DUK_DDPRINT("= expression is top level, write directly to reg_varbind")); - reg_res = reg_varbind; - } else { - /* Not safe to use 'reg_varbind' as assignment expression - * value, so go through a temp. - */ - DUK_DD(DUK_DDPRINT("= expression is not top level, write to reg_temp")); - reg_res = reg_temp; /* reg_res should be smallest possible */ - reg_temp = DUK__ALLOCTEMP(comp_ctx); - } - - /* Try to optimize X = Y for reg-bound - * variables. Detect side-effect free RHS - * narrowly by seeing whether it emits code. - * If not, rewind the code emitter and overwrite - * the unnecessary temp reg load. - */ - - pc_temp_load = duk__get_current_pc(comp_ctx); - duk__emit_a_bc(comp_ctx, - DUK_OP_LDREG, - reg_temp, - reg_varbind); - - pc_before_rhs = duk__get_current_pc(comp_ctx); - duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); - DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); - pc_after_rhs = duk__get_current_pc(comp_ctx); - - DUK_DD(DUK_DDPRINT("pc_temp_load=%ld, pc_before_rhs=%ld, pc_after_rhs=%ld", - (long) pc_temp_load, (long) pc_before_rhs, - (long) pc_after_rhs)); - - if (pc_after_rhs == pc_before_rhs) { - /* Note: if the reg_temp load generated shuffling - * instructions, we may need to rewind more than - * one instruction, so use explicit PC computation. - */ - DUK_DD(DUK_DDPRINT("rhs is side effect free, rewind and avoid unnecessary temp for reg-based =")); - DUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, (duk_size_t) (pc_temp_load - pc_before_rhs) * sizeof(duk_compiler_instr)); - reg_src = reg_varbind; - } else { - DUK_DD(DUK_DDPRINT("rhs evaluation emitted code, not sure if rhs is side effect free; use temp reg for LHS")); - reg_src = reg_temp; - } - - duk__emit_a_b_c(comp_ctx, - args_op | DUK__EMIT_FLAG_BC_REGCONST, - reg_res, - reg_src, - res->x1.regconst); - - res->x1.regconst = reg_res; - - /* Ensure compact use of temps. */ - if (DUK__ISREG_TEMP(comp_ctx, reg_res)) { - DUK__SETTEMP(comp_ctx, reg_res + 1); - } - } else { - /* When LHS is not register bound, always go through a - * temporary. No optimization for top level assignment. - */ - - duk__emit_a_bc(comp_ctx, - DUK_OP_GETVAR, - reg_temp, - rc_varname); - - duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); - DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); - - duk__emit_a_b_c(comp_ctx, - args_op | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp, - reg_temp, - res->x1.regconst); - res->x1.regconst = reg_temp; - } - - DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); - } - - /* At this point 'res' holds the potential expression value. - * It can be basically any ivalue here, including a reg-bound - * identifier (if code above deems it safe) or a unary/binary - * operation. Operations must be resolved to a side effect free - * plain value, and the side effects must happen exactly once. - */ - - if (reg_varbind >= 0) { - if (res->t != DUK_IVAL_PLAIN) { - /* Resolve 'res' directly into the LHS binding, and use - * that as the expression value if safe. If not safe, - * resolve to a temp/const and copy to LHS. - */ - if (toplevel_assign) { - duk__ivalue_toforcedreg(comp_ctx, res, (duk_int_t) reg_varbind); - } else { - duk__ivalue_totempconst(comp_ctx, res); - duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */ - duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind); - } - } else { - /* Use 'res' as the expression value (it's side effect - * free and may be a plain value, a register, or a - * constant) and write it to the LHS binding too. - */ - duk__copy_ivalue(comp_ctx, res, left); /* use 'left' as a temp */ - duk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind); - } - } else { - /* Only a reg fits into 'A' so coerce 'res' into a register - * for PUTVAR. - * - * XXX: here the current A/B/C split is suboptimal: we could - * just use 9 bits for reg_res (and support constants) and 17 - * instead of 18 bits for the varname const index. - */ - - duk__ivalue_toreg(comp_ctx, res); - duk__emit_a_bc(comp_ctx, - DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, - res->x1.regconst, - rc_varname); - } - - /* 'res' contains expression value */ - } else if (left->t == DUK_IVAL_PROP) { - /* E5 Section 11.13.1 (and others) step 4 never matches for prop writes -> no check */ - duk_regconst_t reg_obj; - duk_regconst_t rc_key; - duk_regconst_t rc_res; - duk_regconst_t reg_temp; - - /* Property access expressions ('a[b]') are critical to correct - * LHS evaluation ordering, see test-dev-assign-eval-order*.js. - * We must make sure that the LHS target slot (base object and - * key) don't change during RHS evaluation. The only concrete - * problem is a register reference to a variable-bound register - * (i.e., non-temp). Require temp regs for both key and base. - * - * Don't allow a constant for the object (even for a number - * etc), as it goes into the 'A' field of the opcode. - */ - - reg_obj = duk__ispec_toregconst_raw(comp_ctx, - &left->x1, - -1 /*forced_reg*/, - DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/); - - rc_key = duk__ispec_toregconst_raw(comp_ctx, - &left->x2, - -1 /*forced_reg*/, - DUK__IVAL_FLAG_REQUIRE_TEMP | DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - - /* Evaluate RHS only when LHS is safe. */ - - if (args_op == DUK_OP_NONE) { - duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); - DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); - rc_res = res->x1.regconst; - } else { - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_b_c(comp_ctx, - DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp, - reg_obj, - rc_key); - - duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); - DUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST); - - duk__emit_a_b_c(comp_ctx, - args_op | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp, - reg_temp, - res->x1.regconst); - rc_res = reg_temp; - } - - duk__emit_a_b_c(comp_ctx, - DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST, - reg_obj, - rc_key, - rc_res); - - duk__ivalue_regconst(res, rc_res); - } else { - /* No support for lvalues returned from new or function call expressions. - * However, these must NOT cause compile-time SyntaxErrors, but run-time - * ReferenceErrors. Both left and right sides of the assignment must be - * evaluated before throwing a ReferenceError. For instance: - * - * f() = g(); - * - * must result in f() being evaluated, then g() being evaluated, and - * finally, a ReferenceError being thrown. See E5 Section 11.13.1. - */ - - duk_regconst_t rc_res; - - /* First evaluate LHS fully to ensure all side effects are out. */ - duk__ivalue_toplain_ignore(comp_ctx, left); - - /* Then evaluate RHS fully (its value becomes the expression value too). - * Technically we'd need the side effect safety check here too, but because - * we always throw using INVLHS the result doesn't matter. - */ - rc_res = duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/); - - duk__emit_op_only(comp_ctx, DUK_OP_INVLHS); - - duk__ivalue_regconst(res, rc_res); - } - - return; - } - - postincdec: - { - /* - * Post-increment/decrement will return the original value as its - * result value. However, even that value will be coerced using - * ToNumber() which is quite awkward. Specific bytecode opcodes - * are used to handle these semantics. - * - * Note that post increment/decrement has a "no LineTerminator here" - * restriction. This is handled by duk__expr_lbp(), which forcibly terminates - * the previous expression if a LineTerminator occurs before '++'/'--'. - */ - - duk_regconst_t reg_res; - duk_small_uint_t args_op1 = (args >> 8) & 0xff; /* DUK_OP_POSTINCR/DUK_OP_POSTDECR */ - duk_small_uint_t args_op2 = args >> 16; /* DUK_OP_POSTINCP_RR/DUK_OP_POSTDECP_RR */ - - /* Specific assumptions for opcode numbering. */ - DUK_ASSERT(DUK_OP_POSTINCR + 4 == DUK_OP_POSTINCV); - DUK_ASSERT(DUK_OP_POSTDECR + 4 == DUK_OP_POSTDECV); - - reg_res = DUK__ALLOCTEMP(comp_ctx); - - if (left->t == DUK_IVAL_VAR) { - duk_hstring *h_varname; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - h_varname = duk_known_hstring(thr, left->x1.valstack_idx); - - if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { - goto syntax_error; - } - - duk_dup(thr, left->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - duk__emit_a_bc(comp_ctx, - args_op1, /* e.g. DUK_OP_POSTINCR */ - reg_res, - reg_varbind); - } else { - duk__emit_a_bc(comp_ctx, - args_op1 + 4, /* e.g. DUK_OP_POSTINCV */ - reg_res, - rc_varname); - } - - DUK_DDD(DUK_DDDPRINT("postincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld", - (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); - } else if (left->t == DUK_IVAL_PROP) { - duk_regconst_t reg_obj; /* allocate to reg only (not const) */ - duk_regconst_t rc_key; - - reg_obj = duk__ispec_toregconst_raw(comp_ctx, &left->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ - rc_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - duk__emit_a_b_c(comp_ctx, - args_op2 | DUK__EMIT_FLAG_BC_REGCONST, /* e.g. DUK_OP_POSTINCP */ - reg_res, - reg_obj, - rc_key); - } else { - /* Technically return value is not needed because INVLHS will - * unconditially throw a ReferenceError. Coercion is necessary - * for proper semantics (consider ToNumber() called for an object). - * Use DUK_OP_UNP with a dummy register to get ToNumber(). - */ - duk__ivalue_toforcedreg(comp_ctx, left, reg_res); - duk__emit_bc(comp_ctx, - DUK_OP_UNP, - reg_res); /* for side effects, result ignored */ - duk__emit_op_only(comp_ctx, - DUK_OP_INVLHS); - } - - DUK__SETTEMP(comp_ctx, reg_res + 1); - duk__ivalue_regconst(res, reg_res); - return; - } - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION); - return; - - syntax_error_lvalue: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LVALUE); - return; -} - -DUK_LOCAL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx) { - duk_small_uint_t tok = comp_ctx->curr_token.t; - - DUK_ASSERT_DISABLE(tok >= DUK_TOK_MINVAL); /* unsigned */ - DUK_ASSERT(tok <= DUK_TOK_MAXVAL); - DUK_ASSERT(sizeof(duk__token_lbp) == DUK_TOK_MAXVAL + 1); - - /* XXX: integrate support for this into led() instead? - * Similar issue as post-increment/post-decrement. - */ - - /* prevent duk__expr_led() by using a binding power less than anything valid */ - if (tok == DUK_TOK_IN && !comp_ctx->curr_func.allow_in) { - return 0; - } - - if ((tok == DUK_TOK_DECREMENT || tok == DUK_TOK_INCREMENT) && - (comp_ctx->curr_token.lineterm)) { - /* '++' or '--' in a post-increment/decrement position, - * and a LineTerminator occurs between the operator and - * the preceding expression. Force the previous expr - * to terminate, in effect treating e.g. "a,b\n++" as - * "a,b;++" (= SyntaxError). - */ - return 0; - } - - return DUK__TOKEN_LBP_GET_BP(duk__token_lbp[tok]); /* format is bit packed */ -} - -/* - * Expression parsing. - * - * Upon entry to 'expr' and its variants, 'curr_tok' is assumed to be the - * first token of the expression. Upon exit, 'curr_tok' will be the first - * token not part of the expression (e.g. semicolon terminating an expression - * statement). - */ - -#define DUK__EXPR_RBP_MASK 0xff -#define DUK__EXPR_FLAG_REJECT_IN (1 << 8) /* reject 'in' token (used for for-in) */ -#define DUK__EXPR_FLAG_ALLOW_EMPTY (1 << 9) /* allow empty expression */ -#define DUK__EXPR_FLAG_REQUIRE_INIT (1 << 10) /* require initializer for var/const */ - -/* main expression parser function */ -DUK_LOCAL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk_hthread *thr = comp_ctx->thr; - duk_ivalue tmp_alloc; /* 'res' is used for "left", and 'tmp' for "right" */ - duk_ivalue *tmp = &tmp_alloc; - duk_small_uint_t rbp; - - DUK__RECURSION_INCREASE(comp_ctx, thr); - - duk_require_stack(thr, DUK__PARSE_EXPR_SLOTS); - - /* filter out flags from exprtop rbp_flags here to save space */ - rbp = rbp_flags & DUK__EXPR_RBP_MASK; - - DUK_DDD(DUK_DDDPRINT("duk__expr(), rbp_flags=%ld, rbp=%ld, allow_in=%ld, paren_level=%ld", - (long) rbp_flags, (long) rbp, (long) comp_ctx->curr_func.allow_in, - (long) comp_ctx->curr_func.paren_level)); - - DUK_MEMZERO(&tmp_alloc, sizeof(tmp_alloc)); - tmp->x1.valstack_idx = duk_get_top(thr); - tmp->x2.valstack_idx = tmp->x1.valstack_idx + 1; - duk_push_undefined(thr); - duk_push_undefined(thr); - - /* XXX: where to release temp regs in intermediate expressions? - * e.g. 1+2+3 -> don't inflate temp register count when parsing this. - * that particular expression temp regs can be forced here. - */ - - /* XXX: increase ctx->expr_tokens here for every consumed token - * (this would be a nice statistic)? - */ - - if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || comp_ctx->curr_token.t == DUK_TOK_RPAREN) { - /* XXX: possibly incorrect handling of empty expression */ - DUK_DDD(DUK_DDDPRINT("empty expression")); - if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY)) { - DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED); - } - duk_push_undefined(thr); - duk__ivalue_plain_fromstack(comp_ctx, res); - goto cleanup; - } - - duk__advance(comp_ctx); - duk__expr_nud(comp_ctx, res); /* reuse 'res' as 'left' */ - while (rbp < duk__expr_lbp(comp_ctx)) { - duk__advance(comp_ctx); - duk__expr_led(comp_ctx, res, tmp); - duk__copy_ivalue(comp_ctx, tmp, res); /* tmp -> res */ - } - - cleanup: - /* final result is already in 'res' */ - - duk_pop_2(thr); - - DUK__RECURSION_DECREASE(comp_ctx, thr); -} - -DUK_LOCAL void duk__exprtop(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk_hthread *thr = comp_ctx->thr; - - /* Note: these variables must reside in 'curr_func' instead of the global - * context: when parsing function expressions, expression parsing is nested. - */ - comp_ctx->curr_func.nud_count = 0; - comp_ctx->curr_func.led_count = 0; - comp_ctx->curr_func.paren_level = 0; - comp_ctx->curr_func.expr_lhs = 1; - comp_ctx->curr_func.allow_in = (rbp_flags & DUK__EXPR_FLAG_REJECT_IN ? 0 : 1); - - duk__expr(comp_ctx, res, rbp_flags); - - if (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY) && duk__expr_is_empty(comp_ctx)) { - DUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED); - } -} - -/* A bunch of helpers (for size optimization) that combine duk__expr()/duk__exprtop() - * and result conversions. - * - * Each helper needs at least 2-3 calls to make it worth while to wrap. - */ - -#if 0 /* unused */ -DUK_LOCAL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - return duk__ivalue_toreg(comp_ctx, res); -} -#endif - -#if 0 /* unused */ -DUK_LOCAL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - return duk__ivalue_totemp(comp_ctx, res); -} -#endif - -DUK_LOCAL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) { - DUK_ASSERT(forced_reg >= 0); - duk__expr(comp_ctx, res, rbp_flags); - duk__ivalue_toforcedreg(comp_ctx, res, forced_reg); -} - -DUK_LOCAL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - return duk__ivalue_toregconst(comp_ctx, res); -} - -#if 0 /* unused */ -DUK_LOCAL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - return duk__ivalue_totempconst(comp_ctx, res); -} -#endif - -DUK_LOCAL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - duk__ivalue_toplain(comp_ctx, res); -} - -DUK_LOCAL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__expr(comp_ctx, res, rbp_flags); - duk__ivalue_toplain_ignore(comp_ctx, res); -} - -DUK_LOCAL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__exprtop(comp_ctx, res, rbp_flags); - return duk__ivalue_toreg(comp_ctx, res); -} - -#if 0 /* unused */ -DUK_LOCAL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__exprtop(comp_ctx, res, rbp_flags); - return duk__ivalue_totemp(comp_ctx, res); -} -#endif - -DUK_LOCAL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) { - DUK_ASSERT(forced_reg >= 0); - duk__exprtop(comp_ctx, res, rbp_flags); - duk__ivalue_toforcedreg(comp_ctx, res, forced_reg); -} - -DUK_LOCAL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) { - duk__exprtop(comp_ctx, res, rbp_flags); - return duk__ivalue_toregconst(comp_ctx, res); -} - -#if 0 /* unused */ -DUK_LOCAL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, int rbp_flags) { - duk__exprtop(comp_ctx, res, rbp_flags); - duk__ivalue_toplain_ignore(comp_ctx, res); -} -#endif - -/* - * Parse an individual source element (top level statement) or a statement. - * - * Handles labeled statements automatically (peeling away labels before - * parsing an expression that follows the label(s)). - * - * Upon entry, 'curr_tok' contains the first token of the statement (parsed - * in "allow regexp literal" mode). Upon exit, 'curr_tok' contains the first - * token following the statement (if the statement has a terminator, this is - * the token after the terminator). - */ - -#define DUK__HAS_VAL (1 << 0) /* stmt has non-empty value */ -#define DUK__HAS_TERM (1 << 1) /* stmt has explicit/implicit semicolon terminator */ -#define DUK__ALLOW_AUTO_SEMI_ALWAYS (1 << 2) /* allow automatic semicolon even without lineterm (compatibility) */ -#define DUK__STILL_PROLOGUE (1 << 3) /* statement does not terminate directive prologue */ -#define DUK__IS_TERMINAL (1 << 4) /* statement is guaranteed to be terminal (control doesn't flow to next statement) */ - -/* Parse a single variable declaration (e.g. "i" or "i=10"). A leading 'var' - * has already been eaten. These is no return value in 'res', it is used only - * as a temporary. - * - * When called from 'for-in' statement parser, the initializer expression must - * not allow the 'in' token. The caller supply additional expression parsing - * flags (like DUK__EXPR_FLAG_REJECT_IN) in 'expr_flags'. - * - * Finally, out_rc_varname and out_reg_varbind are updated to reflect where - * the identifier is bound: - * - * If register bound: out_reg_varbind >= 0, out_rc_varname == 0 (ignore) - * If not register bound: out_reg_varbind < 0, out_rc_varname >= 0 - * - * These allow the caller to use the variable for further assignment, e.g. - * as is done in 'for-in' parsing. - */ - -DUK_LOCAL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) { - duk_hthread *thr = comp_ctx->thr; - duk_hstring *h_varname; - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - /* assume 'var' has been eaten */ - - /* Note: Identifier rejects reserved words */ - if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { - goto syntax_error; - } - h_varname = comp_ctx->curr_token.str1; - - DUK_ASSERT(h_varname != NULL); - - /* strict mode restrictions (E5 Section 12.2.1) */ - if (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) { - goto syntax_error; - } - - /* register declarations in first pass */ - if (comp_ctx->curr_func.in_scanning) { - duk_uarridx_t n; - DUK_DDD(DUK_DDDPRINT("register variable declaration %!O in pass 1", - (duk_heaphdr *) h_varname)); - n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); - duk_push_hstring(thr, h_varname); - duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n); - duk_push_int(thr, DUK_DECL_TYPE_VAR + (0 << 8)); - duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1); - } - - duk_push_hstring(thr, h_varname); /* push before advancing to keep reachable */ - - /* register binding lookup is based on varmap (even in first pass) */ - duk_dup_top(thr); - (void) duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname); - - duk__advance(comp_ctx); /* eat identifier */ - - if (comp_ctx->curr_token.t == DUK_TOK_EQUALSIGN) { - duk__advance(comp_ctx); - - DUK_DDD(DUK_DDDPRINT("vardecl, assign to '%!O' -> reg_varbind=%ld, rc_varname=%ld", - (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname)); - - duk__exprtop(comp_ctx, res, DUK__BP_COMMA | expr_flags /*rbp_flags*/); /* AssignmentExpression */ - - if (reg_varbind >= 0) { - duk__ivalue_toforcedreg(comp_ctx, res, reg_varbind); - } else { - duk_regconst_t reg_val; - reg_val = duk__ivalue_toreg(comp_ctx, res); - duk__emit_a_bc(comp_ctx, - DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_val, - rc_varname); - } - } else { - if (expr_flags & DUK__EXPR_FLAG_REQUIRE_INIT) { - /* Used for minimal 'const': initializer required. */ - goto syntax_error; - } - } - - duk_pop(thr); /* pop varname */ - - *out_rc_varname = rc_varname; - *out_reg_varbind = reg_varbind; - - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_VAR_DECLARATION); -} - -DUK_LOCAL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags) { - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - duk__advance(comp_ctx); /* eat 'var' */ - - for (;;) { - /* rc_varname and reg_varbind are ignored here */ - duk__parse_var_decl(comp_ctx, res, 0 | expr_flags, ®_varbind, &rc_varname); - - if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { - break; - } - duk__advance(comp_ctx); - } -} - -DUK_LOCAL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { - duk_hthread *thr = comp_ctx->thr; - duk_int_t pc_v34_lhs; /* start variant 3/4 left-hand-side code (L1 in doc/compiler.rst example) */ - duk_regconst_t temp_reset; /* knock back "next temp" to this whenever possible */ - duk_regconst_t reg_temps; /* preallocated temporaries (2) for variants 3 and 4 */ - - DUK_DDD(DUK_DDDPRINT("start parsing a for/for-in statement")); - - /* Two temporaries are preallocated here for variants 3 and 4 which need - * registers which are never clobbered by expressions in the loop - * (concretely: for the enumerator object and the next enumerated value). - * Variants 1 and 2 "release" these temps. - */ - - reg_temps = DUK__ALLOCTEMPS(comp_ctx, 2); - - temp_reset = DUK__GETTEMP(comp_ctx); - - /* - * For/for-in main variants are: - * - * 1. for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement - * 2. for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement - * 3. for (LeftHandSideExpression in Expression) Statement - * 4. for (var VariableDeclarationNoIn in Expression) Statement - * - * Parsing these without arbitrary lookahead or backtracking is relatively - * tricky but we manage to do so for now. - * - * See doc/compiler.rst for a detailed discussion of control flow - * issues, evaluation order issues, etc. - */ - - duk__advance(comp_ctx); /* eat 'for' */ - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - DUK_DDD(DUK_DDDPRINT("detecting for/for-in loop variant, pc=%ld", (long) duk__get_current_pc(comp_ctx))); - - /* a label site has been emitted by duk__parse_stmt() automatically - * (it will also emit the ENDLABEL). - */ - - if (comp_ctx->curr_token.t == DUK_TOK_VAR) { - /* - * Variant 2 or 4 - */ - - duk_regconst_t reg_varbind; /* variable binding register if register-bound (otherwise < 0) */ - duk_regconst_t rc_varname; /* variable name reg/const, if variable not register-bound */ - - duk__advance(comp_ctx); /* eat 'var' */ - duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, ®_varbind, &rc_varname); - DUK__SETTEMP(comp_ctx, temp_reset); - - if (comp_ctx->curr_token.t == DUK_TOK_IN) { - /* - * Variant 4 - */ - - DUK_DDD(DUK_DDDPRINT("detected for variant 4: for (var VariableDeclarationNoIn in Expression) Statement")); - pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here */ - if (reg_varbind >= 0) { - duk__emit_a_bc(comp_ctx, - DUK_OP_LDREG, - reg_varbind, - reg_temps + 0); - } else { - duk__emit_a_bc(comp_ctx, - DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_temps + 0, - rc_varname); - } - goto parse_3_or_4; - } else { - /* - * Variant 2 - */ - - DUK_DDD(DUK_DDDPRINT("detected for variant 2: for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement")); - for (;;) { - /* more initializers */ - if (comp_ctx->curr_token.t != DUK_TOK_COMMA) { - break; - } - DUK_DDD(DUK_DDDPRINT("variant 2 has another variable initializer")); - - duk__advance(comp_ctx); /* eat comma */ - duk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, ®_varbind, &rc_varname); - } - goto parse_1_or_2; - } - } else { - /* - * Variant 1 or 3 - */ - - pc_v34_lhs = duk__get_current_pc(comp_ctx); /* jump is inserted here (variant 3) */ - - /* Note that duk__exprtop() here can clobber any reg above current temp_next, - * so any loop variables (e.g. enumerator) must be "preallocated". - */ - - /* don't coerce yet to a plain value (variant 3 needs special handling) */ - duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_REJECT_IN | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression */ - if (comp_ctx->curr_token.t == DUK_TOK_IN) { - /* - * Variant 3 - */ - - /* XXX: need to determine LHS type, and check that it is LHS compatible */ - DUK_DDD(DUK_DDDPRINT("detected for variant 3: for (LeftHandSideExpression in Expression) Statement")); - if (duk__expr_is_empty(comp_ctx)) { - goto syntax_error; /* LeftHandSideExpression does not allow empty expression */ - } - - if (res->t == DUK_IVAL_VAR) { - duk_regconst_t reg_varbind; - duk_regconst_t rc_varname; - - duk_dup(thr, res->x1.valstack_idx); - if (duk__lookup_lhs(comp_ctx, ®_varbind, &rc_varname)) { - duk__emit_a_bc(comp_ctx, - DUK_OP_LDREG, - reg_varbind, - reg_temps + 0); - } else { - duk__emit_a_bc(comp_ctx, - DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_temps + 0, - rc_varname); - } - } else if (res->t == DUK_IVAL_PROP) { - /* Don't allow a constant for the object (even for a number etc), as - * it goes into the 'A' field of the opcode. - */ - duk_regconst_t reg_obj; - duk_regconst_t rc_key; - reg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/); /* don't allow const */ - rc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/); - duk__emit_a_b_c(comp_ctx, - DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST, - reg_obj, - rc_key, - reg_temps + 0); - } else { - duk__ivalue_toplain_ignore(comp_ctx, res); /* just in case */ - duk__emit_op_only(comp_ctx, - DUK_OP_INVLHS); - } - goto parse_3_or_4; - } else { - /* - * Variant 1 - */ - - DUK_DDD(DUK_DDDPRINT("detected for variant 1: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement")); - duk__ivalue_toplain_ignore(comp_ctx, res); - goto parse_1_or_2; - } - } - - parse_1_or_2: - /* - * Parse variant 1 or 2. The first part expression (which differs - * in the variants) has already been parsed and its code emitted. - * - * reg_temps + 0: unused - * reg_temps + 1: unused - */ - { - duk_regconst_t rc_cond; - duk_int_t pc_l1, pc_l2, pc_l3, pc_l4; - duk_int_t pc_jumpto_l3, pc_jumpto_l4; - duk_bool_t expr_c_empty; - - DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 1 and 2")); - - /* "release" preallocated temps since we won't need them */ - temp_reset = reg_temps + 0; - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON); - - pc_l1 = duk__get_current_pc(comp_ctx); - duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */ - if (duk__expr_is_empty(comp_ctx)) { - /* no need to coerce */ - pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */ - pc_jumpto_l4 = -1; /* omitted */ - } else { - rc_cond = duk__ivalue_toregconst(comp_ctx, res); - duk__emit_if_false_skip(comp_ctx, rc_cond); - pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* to body */ - pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx); /* to exit */ - } - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON); - - pc_l2 = duk__get_current_pc(comp_ctx); - duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/); /* Expression_opt */ - if (duk__expr_is_empty(comp_ctx)) { - /* no need to coerce */ - expr_c_empty = 1; - /* JUMP L1 omitted */ - } else { - duk__ivalue_toplain_ignore(comp_ctx, res); - expr_c_empty = 0; - duk__emit_jump(comp_ctx, pc_l1); - } - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - pc_l3 = duk__get_current_pc(comp_ctx); - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - if (expr_c_empty) { - duk__emit_jump(comp_ctx, pc_l1); - } else { - duk__emit_jump(comp_ctx, pc_l2); - } - /* temp reset is not necessary after duk__parse_stmt(), which already does it */ - - pc_l4 = duk__get_current_pc(comp_ctx); - - DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l3: %ld->%ld, jumpto_l4: %ld->%ld, " - "break: %ld->%ld, continue: %ld->%ld", - (long) pc_jumpto_l3, (long) pc_l3, (long) pc_jumpto_l4, (long) pc_l4, - (long) (pc_label_site + 1), (long) pc_l4, (long) (pc_label_site + 2), (long) pc_l2)); - - duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3); - duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4); - duk__patch_jump(comp_ctx, - pc_label_site + 1, - pc_l4); /* break jump */ - duk__patch_jump(comp_ctx, - pc_label_site + 2, - expr_c_empty ? pc_l1 : pc_l2); /* continue jump */ - } - goto finished; - - parse_3_or_4: - /* - * Parse variant 3 or 4. - * - * For variant 3 (e.g. "for (A in C) D;") the code for A (except the - * final property/variable write) has already been emitted. The first - * instruction of that code is at pc_v34_lhs; a JUMP needs to be inserted - * there to satisfy control flow needs. - * - * For variant 4, if the variable declaration had an initializer - * (e.g. "for (var A = B in C) D;") the code for the assignment - * (B) has already been emitted. - * - * Variables set before entering here: - * - * pc_v34_lhs: insert a "JUMP L2" here (see doc/compiler.rst example). - * reg_temps + 0: iteration target value (written to LHS) - * reg_temps + 1: enumerator object - */ - { - duk_int_t pc_l1, pc_l2, pc_l3, pc_l4, pc_l5; - duk_int_t pc_jumpto_l2, pc_jumpto_l3, pc_jumpto_l4, pc_jumpto_l5; - duk_regconst_t reg_target; - - DUK_DDD(DUK_DDDPRINT("shared code for parsing variants 3 and 4, pc_v34_lhs=%ld", (long) pc_v34_lhs)); - - DUK__SETTEMP(comp_ctx, temp_reset); - - /* First we need to insert a jump in the middle of previously - * emitted code to get the control flow right. No jumps can - * cross the position where the jump is inserted. See doc/compiler.rst - * for discussion on the intricacies of control flow and side effects - * for variants 3 and 4. - */ - - duk__insert_jump_entry(comp_ctx, pc_v34_lhs); - pc_jumpto_l2 = pc_v34_lhs; /* inserted jump */ - pc_l1 = pc_v34_lhs + 1; /* +1, right after inserted jump */ - - /* The code for writing reg_temps + 0 to the left hand side has already - * been emitted. - */ - - pc_jumpto_l3 = duk__emit_jump_empty(comp_ctx); /* -> loop body */ - - duk__advance(comp_ctx); /* eat 'in' */ - - /* Parse enumeration target and initialize enumerator. For 'null' and 'undefined', - * INITENUM will creates a 'null' enumerator which works like an empty enumerator - * (E5 Section 12.6.4, step 3). Note that INITENUM requires the value to be in a - * register (constant not allowed). - */ - - pc_l2 = duk__get_current_pc(comp_ctx); - reg_target = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); /* Expression */ - duk__emit_b_c(comp_ctx, - DUK_OP_INITENUM | DUK__EMIT_FLAG_B_IS_TARGET, - reg_temps + 1, - reg_target); - pc_jumpto_l4 = duk__emit_jump_empty(comp_ctx); - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - pc_l3 = duk__get_current_pc(comp_ctx); - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - /* temp reset is not necessary after duk__parse_stmt(), which already does it */ - - /* NEXTENUM needs a jump slot right after the main opcode. - * We need the code emitter to reserve the slot: if there's - * target shuffling, the target shuffle opcodes must happen - * after the jump slot (for NEXTENUM the shuffle opcodes are - * not needed if the enum is finished). - */ - pc_l4 = duk__get_current_pc(comp_ctx); - duk__emit_b_c(comp_ctx, - DUK_OP_NEXTENUM | DUK__EMIT_FLAG_B_IS_TARGET | DUK__EMIT_FLAG_RESERVE_JUMPSLOT, - reg_temps + 0, - reg_temps + 1); - pc_jumpto_l5 = comp_ctx->emit_jumpslot_pc; /* NEXTENUM jump slot: executed when enum finished */ - duk__emit_jump(comp_ctx, pc_l1); /* jump to next loop, using reg_v34_iter as iterated value */ - - pc_l5 = duk__get_current_pc(comp_ctx); - - /* XXX: since the enumerator may be a memory expensive object, - * perhaps clear it explicitly here? If so, break jump must - * go through this clearing operation. - */ - - DUK_DDD(DUK_DDDPRINT("patching jumps: jumpto_l2: %ld->%ld, jumpto_l3: %ld->%ld, " - "jumpto_l4: %ld->%ld, jumpto_l5: %ld->%ld, " - "break: %ld->%ld, continue: %ld->%ld", - (long) pc_jumpto_l2, (long) pc_l2, (long) pc_jumpto_l3, (long) pc_l3, - (long) pc_jumpto_l4, (long) pc_l4, (long) pc_jumpto_l5, (long) pc_l5, - (long) (pc_label_site + 1), (long) pc_l5, (long) (pc_label_site + 2), (long) pc_l4)); - - duk__patch_jump(comp_ctx, pc_jumpto_l2, pc_l2); - duk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3); - duk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4); - duk__patch_jump(comp_ctx, pc_jumpto_l5, pc_l5); - duk__patch_jump(comp_ctx, pc_label_site + 1, pc_l5); /* break jump */ - duk__patch_jump(comp_ctx, pc_label_site + 2, pc_l4); /* continue jump */ - } - goto finished; - - finished: - DUK_DDD(DUK_DDDPRINT("end parsing a for/for-in statement")); - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FOR); -} - -DUK_LOCAL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t temp_at_loop; - duk_regconst_t rc_switch; /* reg/const for switch value */ - duk_regconst_t rc_case; /* reg/const for case value */ - duk_regconst_t reg_temp; /* general temp register */ - duk_int_t pc_prevcase = -1; - duk_int_t pc_prevstmt = -1; - duk_int_t pc_default = -1; /* -1 == not set, -2 == pending (next statement list) */ - - /* Note: negative pc values are ignored when patching jumps, so no explicit checks needed */ - - /* - * Switch is pretty complicated because of several conflicting concerns: - * - * - Want to generate code without an intermediate representation, - * i.e., in one go - * - * - Case selectors are expressions, not values, and may thus e.g. throw - * exceptions (which causes evaluation order concerns) - * - * - Evaluation semantics of case selectors and default clause need to be - * carefully implemented to provide correct behavior even with case value - * side effects - * - * - Fall through case and default clauses; avoiding dead JUMPs if case - * ends with an unconditional jump (a break or a continue) - * - * - The same case value may occur multiple times, but evaluation rules - * only process the first match before switching to a "propagation" mode - * where case values are no longer evaluated - * - * See E5 Section 12.11. Also see doc/compiler.rst for compilation - * discussion. - */ - - duk__advance(comp_ctx); - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - rc_switch = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); - - DUK_DDD(DUK_DDDPRINT("switch value in register %ld", (long) rc_switch)); - - temp_at_loop = DUK__GETTEMP(comp_ctx); - - for (;;) { - duk_int_t num_stmts; - duk_small_uint_t tok; - - /* sufficient for keeping temp reg numbers in check */ - DUK__SETTEMP(comp_ctx, temp_at_loop); - - if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { - break; - } - - /* - * Parse a case or default clause. - */ - - if (comp_ctx->curr_token.t == DUK_TOK_CASE) { - /* - * Case clause. - * - * Note: cannot use reg_case as a temp register (for SEQ target) - * because it may be a constant. - */ - - duk__patch_jump_here(comp_ctx, pc_prevcase); /* chain jumps for case - * evaluation and checking - */ - - duk__advance(comp_ctx); - rc_case = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__advance_expect(comp_ctx, DUK_TOK_COLON); - - reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_b_c(comp_ctx, - DUK_OP_SEQ | DUK__EMIT_FLAG_BC_REGCONST, - reg_temp, - rc_switch, - rc_case); - duk__emit_if_true_skip(comp_ctx, reg_temp); - - /* jump to next case clause */ - pc_prevcase = duk__emit_jump_empty(comp_ctx); /* no match, next case */ - - /* statements go here (if any) on next loop */ - } else if (comp_ctx->curr_token.t == DUK_TOK_DEFAULT) { - /* - * Default clause. - */ - - if (pc_default >= 0) { - goto syntax_error; - } - duk__advance(comp_ctx); - duk__advance_expect(comp_ctx, DUK_TOK_COLON); - - /* Fix for https://github.com/svaarala/duktape/issues/155: - * If 'default' is first clause (detected by pc_prevcase < 0) - * we need to ensure we stay in the matching chain. - */ - if (pc_prevcase < 0) { - DUK_DD(DUK_DDPRINT("default clause is first, emit prevcase jump")); - pc_prevcase = duk__emit_jump_empty(comp_ctx); - } - - /* default clause matches next statement list (if any) */ - pc_default = -2; - } else { - /* Code is not accepted before the first case/default clause */ - goto syntax_error; - } - - /* - * Parse code after the clause. Possible terminators are - * 'case', 'default', and '}'. - * - * Note that there may be no code at all, not even an empty statement, - * between case clauses. This must be handled just like an empty statement - * (omitting seemingly pointless JUMPs), to avoid situations like - * test-bug-case-fallthrough.js. - */ - - num_stmts = 0; - if (pc_default == -2) { - pc_default = duk__get_current_pc(comp_ctx); - } - - /* Note: this is correct even for default clause statements: - * they participate in 'fall-through' behavior even if the - * default clause is in the middle. - */ - duk__patch_jump_here(comp_ctx, pc_prevstmt); /* chain jumps for 'fall-through' - * after a case matches. - */ - - for (;;) { - tok = comp_ctx->curr_token.t; - if (tok == DUK_TOK_CASE || tok == DUK_TOK_DEFAULT || - tok == DUK_TOK_RCURLY) { - break; - } - num_stmts++; - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - } - - /* fall-through jump to next code of next case (backpatched) */ - pc_prevstmt = duk__emit_jump_empty(comp_ctx); - - /* XXX: would be nice to omit this jump when the jump is not - * reachable, at least in the obvious cases (such as the case - * ending with a 'break'. - * - * Perhaps duk__parse_stmt() could provide some info on whether - * the statement is a "dead end"? - * - * If implemented, just set pc_prevstmt to -1 when not needed. - */ - } - - DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY); - duk__advance(comp_ctx); - - /* default case control flow patchup; note that if pc_prevcase < 0 - * (i.e. no case clauses), control enters default case automatically. - */ - if (pc_default >= 0) { - /* default case exists: go there if no case matches */ - duk__patch_jump(comp_ctx, pc_prevcase, pc_default); - } else { - /* default case does not exist, or no statements present - * after default case: finish case evaluation - */ - duk__patch_jump_here(comp_ctx, pc_prevcase); - } - - /* fall-through control flow patchup; note that pc_prevstmt may be - * < 0 (i.e. no case clauses), in which case this is a no-op. - */ - duk__patch_jump_here(comp_ctx, pc_prevstmt); - - /* continue jump not patched, an INVALID opcode remains there */ - duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ - - /* Note: 'fast' breaks will jump to pc_label_site + 1, which will - * then jump here. The double jump will be eliminated by a - * peephole pass, resulting in an optimal jump here. The label - * site jumps will remain in bytecode and will waste code size. - */ - - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_SWITCH); -} - -DUK_LOCAL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_regconst_t temp_reset; - duk_regconst_t rc_cond; - duk_int_t pc_jump_false; - - DUK_DDD(DUK_DDDPRINT("begin parsing if statement")); - - temp_reset = DUK__GETTEMP(comp_ctx); - - duk__advance(comp_ctx); /* eat 'if' */ - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__emit_if_true_skip(comp_ctx, rc_cond); - pc_jump_false = duk__emit_jump_empty(comp_ctx); /* jump to end or else part */ - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - - /* The 'else' ambiguity is resolved by 'else' binding to the innermost - * construct, so greedy matching is correct here. - */ - - if (comp_ctx->curr_token.t == DUK_TOK_ELSE) { - duk_int_t pc_jump_end; - - DUK_DDD(DUK_DDDPRINT("if has else part")); - - duk__advance(comp_ctx); - - pc_jump_end = duk__emit_jump_empty(comp_ctx); /* jump from true part to end */ - duk__patch_jump_here(comp_ctx, pc_jump_false); - - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - - duk__patch_jump_here(comp_ctx, pc_jump_end); - } else { - DUK_DDD(DUK_DDDPRINT("if does not have else part")); - - duk__patch_jump_here(comp_ctx, pc_jump_false); - } - - DUK_DDD(DUK_DDDPRINT("end parsing if statement")); -} - -DUK_LOCAL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { - duk_regconst_t rc_cond; - duk_int_t pc_start; - - DUK_DDD(DUK_DDDPRINT("begin parsing do statement")); - - duk__advance(comp_ctx); /* eat 'do' */ - - pc_start = duk__get_current_pc(comp_ctx); - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */ - - duk__advance_expect(comp_ctx, DUK_TOK_WHILE); - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__emit_if_false_skip(comp_ctx, rc_cond); - duk__emit_jump(comp_ctx, pc_start); - /* no need to reset temps, as we're finished emitting code */ - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ - - DUK_DDD(DUK_DDDPRINT("end parsing do statement")); -} - -DUK_LOCAL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) { - duk_regconst_t temp_reset; - duk_regconst_t rc_cond; - duk_int_t pc_start; - duk_int_t pc_jump_false; - - DUK_DDD(DUK_DDDPRINT("begin parsing while statement")); - - temp_reset = DUK__GETTEMP(comp_ctx); - - duk__advance(comp_ctx); /* eat 'while' */ - - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - pc_start = duk__get_current_pc(comp_ctx); - duk__patch_jump_here(comp_ctx, pc_label_site + 2); /* continue jump */ - - rc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__emit_if_true_skip(comp_ctx, rc_cond); - pc_jump_false = duk__emit_jump_empty(comp_ctx); - DUK__SETTEMP(comp_ctx, temp_reset); - - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - duk__emit_jump(comp_ctx, pc_start); - - duk__patch_jump_here(comp_ctx, pc_jump_false); - duk__patch_jump_here(comp_ctx, pc_label_site + 1); /* break jump */ - - DUK_DDD(DUK_DDDPRINT("end parsing while statement")); -} - -DUK_LOCAL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_bool_t is_break = (comp_ctx->curr_token.t == DUK_TOK_BREAK); - duk_int_t label_id; - duk_int_t label_catch_depth; - duk_int_t label_pc; /* points to LABEL; pc+1 = jump site for break; pc+2 = jump site for continue */ - duk_bool_t label_is_closest; - - DUK_UNREF(res); - - duk__advance(comp_ctx); /* eat 'break' or 'continue' */ - - if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */ - comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */ - comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */ - /* break/continue without label */ - - duk__lookup_active_label(comp_ctx, DUK_HTHREAD_STRING_EMPTY_STRING(thr), is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest); - } else if (comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER) { - /* break/continue with label (label cannot be a reserved word, production is 'Identifier' */ - DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); - duk__lookup_active_label(comp_ctx, comp_ctx->curr_token.str1, is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest); - duk__advance(comp_ctx); - } else { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BREAK_CONT_LABEL); - } - - /* Use a fast break/continue when possible. A fast break/continue is - * just a jump to the LABEL break/continue jump slot, which then jumps - * to an appropriate place (for break, going through ENDLABEL correctly). - * The peephole optimizer will optimize the jump to a direct one. - */ - - if (label_catch_depth == comp_ctx->curr_func.catch_depth && - label_is_closest) { - DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, " - "label_catch_depth=%ld, catch_depth=%ld " - "-> use fast variant (direct jump)", - (long) is_break, (long) label_id, (long) label_is_closest, - (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth)); - - duk__emit_jump(comp_ctx, label_pc + (is_break ? 1 : 2)); - } else { - DUK_DDD(DUK_DDDPRINT("break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, " - "label_catch_depth=%ld, catch_depth=%ld " - "-> use slow variant (longjmp)", - (long) is_break, (long) label_id, (long) label_is_closest, - (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth)); - - duk__emit_bc(comp_ctx, - is_break ? DUK_OP_BREAK : DUK_OP_CONTINUE, - (duk_regconst_t) label_id); - } -} - -DUK_LOCAL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t rc_val; - - duk__advance(comp_ctx); /* eat 'return' */ - - /* A 'return' statement is only allowed inside an actual function body, - * not as part of eval or global code. - */ - if (!comp_ctx->curr_func.is_function) { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_RETURN); - } - - if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || /* explicit semi follows */ - comp_ctx->curr_token.lineterm || /* automatic semi will be inserted */ - comp_ctx->curr_token.allow_auto_semi) { /* automatic semi will be inserted */ - DUK_DDD(DUK_DDDPRINT("empty return value -> undefined")); - duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF); - } else { - duk_int_t pc_before_expr; - duk_int_t pc_after_expr; - - DUK_DDD(DUK_DDDPRINT("return with a value")); - - DUK_UNREF(pc_before_expr); - DUK_UNREF(pc_after_expr); - - pc_before_expr = duk__get_current_pc(comp_ctx); - rc_val = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - pc_after_expr = duk__get_current_pc(comp_ctx); - - /* Tail call check: if last opcode emitted was CALL, and - * the context allows it, add a tailcall flag to the CALL. - * This doesn't guarantee that a tail call will be allowed at - * runtime, so the RETURN must still be emitted. (Duktape - * 0.10.0 avoided this and simulated a RETURN if a tail call - * couldn't be used at runtime; but this didn't work - * correctly with a thread yield/resume, see - * test-bug-tailcall-thread-yield-resume.js for discussion.) - * - * In addition to the last opcode being CALL, we also need to - * be sure that 'rc_val' is the result register of the CALL. - * For instance, for the expression 'return 0, (function () - * { return 1; }), 2' the last opcode emitted is CALL (no - * bytecode is emitted for '2') but 'rc_val' indicates - * constant '2'. Similarly if '2' is replaced by a register - * bound variable, no opcodes are emitted but tail call would - * be incorrect. - * - * This is tricky and easy to get wrong. It would be best to - * track enough expression metadata to check that 'rc_val' came - * from that last CALL instruction. We don't have that metadata - * now, so we check that 'rc_val' is a temporary register result - * (not a constant or a register bound variable). There should - * be no way currently for 'rc_val' to be a temporary for an - * expression following the CALL instruction without emitting - * some opcodes following the CALL. This proxy check is used - * below. - * - * See: test-bug-comma-expr-gh131.js. - * - * The non-standard 'caller' property disables tail calls - * because they pose some special cases which haven't been - * fixed yet. - */ - -#if defined(DUK_USE_TAILCALL) - if (comp_ctx->curr_func.catch_depth == 0 && /* no catchers */ - pc_after_expr > pc_before_expr) { /* at least one opcode emitted */ - duk_compiler_instr *instr; - duk_instr_t ins; - duk_small_uint_t op; - - instr = duk__get_instr_ptr(comp_ctx, pc_after_expr - 1); - DUK_ASSERT(instr != NULL); - - ins = instr->ins; - op = (duk_small_uint_t) DUK_DEC_OP(ins); - if ((op & ~0x0fU) == DUK_OP_CALL0 && - DUK__ISREG_TEMP(comp_ctx, rc_val) /* see above */) { - DUK_DDD(DUK_DDDPRINT("return statement detected a tail call opportunity: " - "catch depth is 0, duk__exprtop() emitted >= 1 instructions, " - "and last instruction is a CALL " - "-> change to TAILCALL")); - ins |= DUK_ENC_OP(DUK_BC_CALL_FLAG_TAILCALL); - instr->ins = ins; - } - } -#endif /* DUK_USE_TAILCALL */ - - if (DUK__ISREG(rc_val)) { - duk__emit_bc(comp_ctx, DUK_OP_RETREG, rc_val); - } else { - rc_val = DUK__REMOVECONST(rc_val); - if (duk__const_needs_refcount(comp_ctx, rc_val)) { - duk__emit_bc(comp_ctx, DUK_OP_RETCONST, rc_val); - } else { - duk__emit_bc(comp_ctx, DUK_OP_RETCONSTN, rc_val); - } - } - } -} - -DUK_LOCAL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_regconst_t reg_val; - - duk__advance(comp_ctx); /* eat 'throw' */ - - /* Unlike break/continue, throw statement does not allow an empty value. */ - - if (comp_ctx->curr_token.lineterm) { - DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_INVALID_THROW); - } - - reg_val = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - duk__emit_bc(comp_ctx, - DUK_OP_THROW, - reg_val); -} - -DUK_LOCAL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_hthread *thr = comp_ctx->thr; - duk_regconst_t reg_catch; /* reg_catch+0 and reg_catch+1 are reserved for TRYCATCH */ - duk_regconst_t rc_varname = 0; - duk_small_uint_t trycatch_flags = 0; - duk_int_t pc_ldconst = -1; - duk_int_t pc_trycatch = -1; - duk_int_t pc_catch = -1; - duk_int_t pc_finally = -1; - - DUK_UNREF(res); - - /* - * See the following documentation for discussion: - * - * doc/execution.rst: control flow details - * - * Try, catch, and finally "parts" are Blocks, not Statements, so - * they must always be delimited by curly braces. This is unlike e.g. - * the if statement, which accepts any Statement. This eliminates any - * questions of matching parts of nested try statements. The Block - * parsing is implemented inline here (instead of calling out). - * - * Finally part has a 'let scoped' variable, which requires a few kinks - * here. - */ - - comp_ctx->curr_func.catch_depth++; - - duk__advance(comp_ctx); /* eat 'try' */ - - reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2); - - /* The target for this LDCONST may need output shuffling, but we assume - * that 'pc_ldconst' will be the LDCONST that we can patch later. This - * should be the case because there's no input shuffling. (If there's - * no catch clause, this LDCONST will be replaced with a NOP.) - */ - pc_ldconst = duk__get_current_pc(comp_ctx); - duk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, reg_catch, 0 /*patched later*/); - - pc_trycatch = duk__get_current_pc(comp_ctx); - duk__emit_invalid(comp_ctx); /* TRYCATCH, cannot emit now (not enough info) */ - duk__emit_invalid(comp_ctx); /* jump for 'catch' case */ - duk__emit_invalid(comp_ctx); /* jump for 'finally' case or end (if no finally) */ - - /* try part */ - duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); - duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); - /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ - duk__emit_op_only(comp_ctx, - DUK_OP_ENDTRY); - - if (comp_ctx->curr_token.t == DUK_TOK_CATCH) { - /* - * The catch variable must be updated to reflect the new allocated - * register for the duration of the catch clause. We need to store - * and restore the original value for the varmap entry (if any). - */ - - /* - * Note: currently register bindings must be fixed for the entire - * function. So, even though the catch variable is in a register - * we know, we must use an explicit environment record and slow path - * accesses to read/write the catch binding to make closures created - * within the catch clause work correctly. This restriction should - * be fixable (at least in common cases) later. - * - * See: test-bug-catch-binding-2.js. - * - * XXX: improve to get fast path access to most catch clauses. - */ - - duk_hstring *h_var; - duk_int_t varmap_value; /* for storing/restoring the varmap binding for catch variable */ - - DUK_DDD(DUK_DDDPRINT("stack top at start of catch clause: %ld", (long) duk_get_top(thr))); - - trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_CATCH; - - pc_catch = duk__get_current_pc(comp_ctx); - - duk__advance(comp_ctx); - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { - /* Identifier, i.e. don't allow reserved words */ - goto syntax_error; - } - h_var = comp_ctx->curr_token.str1; - DUK_ASSERT(h_var != NULL); - - duk_push_hstring(thr, h_var); /* keep in on valstack, use borrowed ref below */ - - if (comp_ctx->curr_func.is_strict && - ((h_var == DUK_HTHREAD_STRING_EVAL(thr)) || - (h_var == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)))) { - DUK_DDD(DUK_DDDPRINT("catch identifier 'eval' or 'arguments' in strict mode -> SyntaxError")); - goto syntax_error; - } - - duk_dup_top(thr); - rc_varname = duk__getconst(comp_ctx); - DUK_DDD(DUK_DDDPRINT("catch clause, rc_varname=0x%08lx (%ld)", - (unsigned long) rc_varname, (long) rc_varname)); - - duk__advance(comp_ctx); - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); - - DUK_DDD(DUK_DDDPRINT("varmap before modifying for catch clause: %!iT", - (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); - - duk_dup_top(thr); - duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); - if (duk_is_undefined(thr, -1)) { - varmap_value = -2; - } else if (duk_is_null(thr, -1)) { - varmap_value = -1; - } else { - DUK_ASSERT(duk_is_number(thr, -1)); - varmap_value = duk_get_int(thr, -1); - DUK_ASSERT(varmap_value >= 0); - } - duk_pop(thr); - -#if 0 - /* It'd be nice to do something like this - but it doesn't - * work for closures created inside the catch clause. - */ - duk_dup_top(thr); - duk_push_int(thr, (duk_int_t) (reg_catch + 0)); - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); -#endif - duk_dup_top(thr); - duk_push_null(thr); - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); - - duk__emit_a_bc(comp_ctx, - DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE, - reg_catch + 0 /*value*/, - rc_varname /*varname*/); - - DUK_DDD(DUK_DDDPRINT("varmap before parsing catch clause: %!iT", - (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); - - duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); - /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ - - if (varmap_value == -2) { - /* not present */ - duk_del_prop(thr, comp_ctx->curr_func.varmap_idx); - } else { - if (varmap_value == -1) { - duk_push_null(thr); - } else { - DUK_ASSERT(varmap_value >= 0); - duk_push_int(thr, varmap_value); - } - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); - } - /* varname is popped by above code */ - - DUK_DDD(DUK_DDDPRINT("varmap after restore catch clause: %!iT", - (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx))); - - duk__emit_op_only(comp_ctx, - DUK_OP_ENDCATCH); - - /* - * XXX: for now, indicate that an expensive catch binding - * declarative environment is always needed. If we don't - * need it, we don't need the const_varname either. - */ - - trycatch_flags |= DUK_BC_TRYCATCH_FLAG_CATCH_BINDING; - - DUK_DDD(DUK_DDDPRINT("stack top at end of catch clause: %ld", (long) duk_get_top(thr))); - } - - if (comp_ctx->curr_token.t == DUK_TOK_FINALLY) { - trycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY; - - pc_finally = duk__get_current_pc(comp_ctx); - - duk__advance(comp_ctx); - - duk__advance_expect(comp_ctx, DUK_TOK_LCURLY); - duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); - /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ - duk__emit_abc(comp_ctx, - DUK_OP_ENDFIN, - reg_catch); /* rethrow */ - } - - if (!(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) && - !(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY)) { - /* must have catch and/or finally */ - goto syntax_error; - } - - /* If there's no catch block, rc_varname will be 0 and duk__patch_trycatch() - * will replace the LDCONST with a NOP. For any actual constant (including - * constant 0) the DUK__CONST_MARKER flag will be set in rc_varname. - */ - - duk__patch_trycatch(comp_ctx, - pc_ldconst, - pc_trycatch, - reg_catch, - rc_varname, - trycatch_flags); - - if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) { - DUK_ASSERT(pc_catch >= 0); - duk__patch_jump(comp_ctx, pc_trycatch + 1, pc_catch); - } - - if (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) { - DUK_ASSERT(pc_finally >= 0); - duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finally); - } else { - /* without finally, the second jump slot is used to jump to end of stmt */ - duk__patch_jump_here(comp_ctx, pc_trycatch + 2); - } - - comp_ctx->curr_func.catch_depth--; - return; - - syntax_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_TRY); -} - -DUK_LOCAL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) { - duk_int_t pc_trycatch; - duk_int_t pc_finished; - duk_regconst_t reg_catch; - duk_small_uint_t trycatch_flags; - - if (comp_ctx->curr_func.is_strict) { - DUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_WITH_IN_STRICT_MODE); - } - - comp_ctx->curr_func.catch_depth++; - - duk__advance(comp_ctx); /* eat 'with' */ - - reg_catch = DUK__ALLOCTEMPS(comp_ctx, 2); - - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - duk__exprtop_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/, reg_catch); - duk__advance_expect(comp_ctx, DUK_TOK_RPAREN); - - pc_trycatch = duk__get_current_pc(comp_ctx); - trycatch_flags = DUK_BC_TRYCATCH_FLAG_WITH_BINDING; - duk__emit_a_bc(comp_ctx, - DUK_OP_TRYCATCH | DUK__EMIT_FLAG_NO_SHUFFLE_A, - (duk_regconst_t) trycatch_flags /*a*/, - reg_catch /*bc*/); - duk__emit_invalid(comp_ctx); /* catch jump */ - duk__emit_invalid(comp_ctx); /* finished jump */ - - duk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/); - duk__emit_op_only(comp_ctx, - DUK_OP_ENDTRY); - - pc_finished = duk__get_current_pc(comp_ctx); - - duk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finished); - - comp_ctx->curr_func.catch_depth--; -} - -DUK_LOCAL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id) { - /* if a site already exists, nop: max one label site per statement */ - if (label_id >= 0) { - return label_id; - } - - label_id = comp_ctx->curr_func.label_next++; - DUK_DDD(DUK_DDDPRINT("allocated new label id for label site: %ld", (long) label_id)); - - duk__emit_bc(comp_ctx, - DUK_OP_LABEL, - (duk_regconst_t) label_id); - duk__emit_invalid(comp_ctx); - duk__emit_invalid(comp_ctx); - - return label_id; -} - -/* Parse a single statement. - * - * Creates a label site (with an empty label) automatically for iteration - * statements. Also "peels off" any label statements for explicit labels. - */ -DUK_LOCAL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem) { - duk_hthread *thr = comp_ctx->thr; - duk_bool_t dir_prol_at_entry; /* directive prologue status at entry */ - duk_regconst_t temp_at_entry; - duk_size_t labels_len_at_entry; - duk_int_t pc_at_entry; /* assumed to also be PC of "LABEL" */ - duk_int_t stmt_id; - duk_small_uint_t stmt_flags = 0; - duk_int_t label_id = -1; - duk_small_uint_t tok; - duk_bool_t test_func_decl; - - DUK__RECURSION_INCREASE(comp_ctx, thr); - - temp_at_entry = DUK__GETTEMP(comp_ctx); - pc_at_entry = duk__get_current_pc(comp_ctx); - labels_len_at_entry = duk_get_length(thr, comp_ctx->curr_func.labelnames_idx); - stmt_id = comp_ctx->curr_func.stmt_next++; - dir_prol_at_entry = comp_ctx->curr_func.in_directive_prologue; - - DUK_UNREF(stmt_id); - - DUK_DDD(DUK_DDDPRINT("parsing a statement, stmt_id=%ld, temp_at_entry=%ld, labels_len_at_entry=%ld, " - "is_strict=%ld, in_directive_prologue=%ld, catch_depth=%ld", - (long) stmt_id, (long) temp_at_entry, (long) labels_len_at_entry, - (long) comp_ctx->curr_func.is_strict, (long) comp_ctx->curr_func.in_directive_prologue, - (long) comp_ctx->curr_func.catch_depth)); - - /* The directive prologue flag is cleared by default so that it is - * unset for any recursive statement parsing. It is only "revived" - * if a directive is detected. (We could also make directives only - * allowed if 'allow_source_elem' was true.) - */ - comp_ctx->curr_func.in_directive_prologue = 0; - - retry_parse: - - DUK_DDD(DUK_DDDPRINT("try stmt parse, stmt_id=%ld, label_id=%ld, allow_source_elem=%ld, catch_depth=%ld", - (long) stmt_id, (long) label_id, (long) allow_source_elem, - (long) comp_ctx->curr_func.catch_depth)); - - /* - * Detect iteration statements; if encountered, establish an - * empty label. - */ - - tok = comp_ctx->curr_token.t; - if (tok == DUK_TOK_FOR || tok == DUK_TOK_DO || tok == DUK_TOK_WHILE || - tok == DUK_TOK_SWITCH) { - DUK_DDD(DUK_DDDPRINT("iteration/switch statement -> add empty label")); - - label_id = duk__stmt_label_site(comp_ctx, label_id); - duk__add_label(comp_ctx, - DUK_HTHREAD_STRING_EMPTY_STRING(thr), - pc_at_entry /*pc_label*/, - label_id); - } - - /* - * Main switch for statement / source element type. - */ - - switch (comp_ctx->curr_token.t) { - case DUK_TOK_FUNCTION: { - /* - * Function declaration, function expression, or (non-standard) - * function statement. - * - * The E5 specification only allows function declarations at - * the top level (in "source elements"). An ExpressionStatement - * is explicitly not allowed to begin with a "function" keyword - * (E5 Section 12.4). Hence any non-error semantics for such - * non-top-level statements are non-standard. Duktape semantics - * for function statements are modelled after V8, see - * test-dev-func-decl-outside-top.js. - */ - test_func_decl = allow_source_elem; -#if defined(DUK_USE_NONSTD_FUNC_STMT) - /* Lenient: allow function declarations outside top level in - * non-strict mode but reject them in strict mode. - */ - test_func_decl = test_func_decl || !comp_ctx->curr_func.is_strict; -#endif /* DUK_USE_NONSTD_FUNC_STMT */ - /* Strict: never allow function declarations outside top level. */ - if (test_func_decl) { - /* FunctionDeclaration: not strictly a statement but handled as such. - * - * O(depth^2) parse count for inner functions is handled by recording a - * lexer offset on the first compilation pass, so that the function can - * be efficiently skipped on the second pass. This is encapsulated into - * duk__parse_func_like_fnum(). - */ - - duk_int_t fnum; -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t top_before; -#endif - - DUK_DDD(DUK_DDDPRINT("function declaration statement")); - -#if defined(DUK_USE_ASSERTIONS) - top_before = duk_get_top(thr); -#endif - - duk__advance(comp_ctx); /* eat 'function' */ - fnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_DECL | DUK__FUNC_FLAG_PUSHNAME_PASS1); - - /* The value stack convention here is a bit odd: the function - * name is only pushed on pass 1 (in_scanning), and is needed - * to process function declarations. - */ - if (comp_ctx->curr_func.in_scanning) { - duk_uarridx_t n; - -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(duk_get_top(thr) == top_before + 1); -#endif - DUK_DDD(DUK_DDDPRINT("register function declaration %!T in pass 1, fnum %ld", - duk_get_tval(thr, -1), (long) fnum)); - n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); - /* funcname is at index -1 */ - duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n); - duk_push_int(thr, (duk_int_t) (DUK_DECL_TYPE_FUNC + (fnum << 8))); - duk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1); - } else { -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(duk_get_top(thr) == top_before); -#endif - } - - /* no statement value (unlike function expression) */ - stmt_flags = 0; - break; - } else { - DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_STMT_NOT_ALLOWED); - } - break; - } - case DUK_TOK_LCURLY: { - DUK_DDD(DUK_DDDPRINT("block statement")); - duk__advance(comp_ctx); - duk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/); - /* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */ - if (label_id >= 0) { - duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ - } - stmt_flags = 0; - break; - } - case DUK_TOK_CONST: { - DUK_DDD(DUK_DDDPRINT("constant declaration statement")); - duk__parse_var_stmt(comp_ctx, res, DUK__EXPR_FLAG_REQUIRE_INIT /*expr_flags*/); - stmt_flags = DUK__HAS_TERM; - break; - } - case DUK_TOK_VAR: { - DUK_DDD(DUK_DDDPRINT("variable declaration statement")); - duk__parse_var_stmt(comp_ctx, res, 0 /*expr_flags*/); - stmt_flags = DUK__HAS_TERM; - break; - } - case DUK_TOK_SEMICOLON: { - /* empty statement with an explicit semicolon */ - DUK_DDD(DUK_DDDPRINT("empty statement")); - stmt_flags = DUK__HAS_TERM; - break; - } - case DUK_TOK_IF: { - DUK_DDD(DUK_DDDPRINT("if statement")); - duk__parse_if_stmt(comp_ctx, res); - if (label_id >= 0) { - duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ - } - stmt_flags = 0; - break; - } - case DUK_TOK_DO: { - /* - * Do-while statement is mostly trivial, but there is special - * handling for automatic semicolon handling (triggered by the - * DUK__ALLOW_AUTO_SEMI_ALWAYS) flag related to a bug filed at: - * - * https://bugs.ecmascript.org/show_bug.cgi?id=8 - * - * See doc/compiler.rst for details. - */ - DUK_DDD(DUK_DDDPRINT("do statement")); - DUK_ASSERT(label_id >= 0); - duk__update_label_flags(comp_ctx, - label_id, - DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); - duk__parse_do_stmt(comp_ctx, res, pc_at_entry); - stmt_flags = DUK__HAS_TERM | DUK__ALLOW_AUTO_SEMI_ALWAYS; /* DUK__ALLOW_AUTO_SEMI_ALWAYS workaround */ - break; - } - case DUK_TOK_WHILE: { - DUK_DDD(DUK_DDDPRINT("while statement")); - DUK_ASSERT(label_id >= 0); - duk__update_label_flags(comp_ctx, - label_id, - DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); - duk__parse_while_stmt(comp_ctx, res, pc_at_entry); - stmt_flags = 0; - break; - } - case DUK_TOK_FOR: { - /* - * For/for-in statement is complicated to parse because - * determining the statement type (three-part for vs. a - * for-in) requires potential backtracking. - * - * See the helper for the messy stuff. - */ - DUK_DDD(DUK_DDDPRINT("for/for-in statement")); - DUK_ASSERT(label_id >= 0); - duk__update_label_flags(comp_ctx, - label_id, - DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE); - duk__parse_for_stmt(comp_ctx, res, pc_at_entry); - stmt_flags = 0; - break; - } - case DUK_TOK_CONTINUE: - case DUK_TOK_BREAK: { - DUK_DDD(DUK_DDDPRINT("break/continue statement")); - duk__parse_break_or_continue_stmt(comp_ctx, res); - stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; - break; - } - case DUK_TOK_RETURN: { - DUK_DDD(DUK_DDDPRINT("return statement")); - duk__parse_return_stmt(comp_ctx, res); - stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; - break; - } - case DUK_TOK_WITH: { - DUK_DDD(DUK_DDDPRINT("with statement")); - comp_ctx->curr_func.with_depth++; - duk__parse_with_stmt(comp_ctx, res); - if (label_id >= 0) { - duk__patch_jump_here(comp_ctx, pc_at_entry + 1); /* break jump */ - } - comp_ctx->curr_func.with_depth--; - stmt_flags = 0; - break; - } - case DUK_TOK_SWITCH: { - /* - * The switch statement is pretty messy to compile. - * See the helper for details. - */ - DUK_DDD(DUK_DDDPRINT("switch statement")); - DUK_ASSERT(label_id >= 0); - duk__update_label_flags(comp_ctx, - label_id, - DUK_LABEL_FLAG_ALLOW_BREAK); /* don't allow continue */ - duk__parse_switch_stmt(comp_ctx, res, pc_at_entry); - stmt_flags = 0; - break; - } - case DUK_TOK_THROW: { - DUK_DDD(DUK_DDDPRINT("throw statement")); - duk__parse_throw_stmt(comp_ctx, res); - stmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL; - break; - } - case DUK_TOK_TRY: { - DUK_DDD(DUK_DDDPRINT("try statement")); - duk__parse_try_stmt(comp_ctx, res); - stmt_flags = 0; - break; - } - case DUK_TOK_DEBUGGER: { - duk__advance(comp_ctx); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - DUK_DDD(DUK_DDDPRINT("debugger statement: debugging enabled, emit debugger opcode")); - duk__emit_op_only(comp_ctx, DUK_OP_DEBUGGER); -#else - DUK_DDD(DUK_DDDPRINT("debugger statement: ignored")); -#endif - stmt_flags = DUK__HAS_TERM; - break; - } - default: { - /* - * Else, must be one of: - * - ExpressionStatement, possibly a directive (String) - * - LabelledStatement (Identifier followed by ':') - * - * Expressions beginning with 'function' keyword are covered by a case - * above (such expressions are not allowed in standard E5 anyway). - * Also expressions starting with '{' are interpreted as block - * statements. See E5 Section 12.4. - * - * Directive detection is tricky; see E5 Section 14.1 on directive - * prologue. A directive is an expression statement with a single - * string literal and an explicit or automatic semicolon. Escape - * characters are significant and no parens etc are allowed: - * - * 'use strict'; // valid 'use strict' directive - * 'use\u0020strict'; // valid directive, not a 'use strict' directive - * ('use strict'); // not a valid directive - * - * The expression is determined to consist of a single string literal - * based on duk__expr_nud() and duk__expr_led() call counts. The string literal - * of a 'use strict' directive is determined to lack any escapes based - * num_escapes count from the lexer. Note that other directives may be - * allowed to contain escapes, so a directive with escapes does not - * terminate a directive prologue. - * - * We rely on the fact that the expression parser will not emit any - * code for a single token expression. However, it will generate an - * intermediate value which we will then successfully ignore. - * - * A similar approach is used for labels. - */ - - duk_bool_t single_token; - - DUK_DDD(DUK_DDDPRINT("expression statement")); - duk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/); - - single_token = (comp_ctx->curr_func.nud_count == 1 && /* one token */ - comp_ctx->curr_func.led_count == 0); /* no operators */ - - if (single_token && - comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER && - comp_ctx->curr_token.t == DUK_TOK_COLON) { - /* - * Detected label - */ - - duk_hstring *h_lab; - - /* expected ival */ - DUK_ASSERT(res->t == DUK_IVAL_VAR); - DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE); - DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx))); - h_lab = comp_ctx->prev_token.str1; - DUK_ASSERT(h_lab != NULL); - - DUK_DDD(DUK_DDDPRINT("explicit label site for label '%!O'", - (duk_heaphdr *) h_lab)); - - duk__advance(comp_ctx); /* eat colon */ - - label_id = duk__stmt_label_site(comp_ctx, label_id); - - duk__add_label(comp_ctx, - h_lab, - pc_at_entry /*pc_label*/, - label_id); - - /* a statement following a label cannot be a source element - * (a function declaration). - */ - allow_source_elem = 0; - - DUK_DDD(DUK_DDDPRINT("label handled, retry statement parsing")); - goto retry_parse; - } - - stmt_flags = 0; - - if (dir_prol_at_entry && /* still in prologue */ - single_token && /* single string token */ - comp_ctx->prev_token.t == DUK_TOK_STRING) { - /* - * Detected a directive - */ - duk_hstring *h_dir; - - /* expected ival */ - DUK_ASSERT(res->t == DUK_IVAL_PLAIN); - DUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE); - DUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx))); - h_dir = comp_ctx->prev_token.str1; - DUK_ASSERT(h_dir != NULL); - - DUK_DDD(DUK_DDDPRINT("potential directive: %!O", h_dir)); - - stmt_flags |= DUK__STILL_PROLOGUE; - - /* Note: escaped characters differentiate directives */ - - if (comp_ctx->prev_token.num_escapes > 0) { - DUK_DDD(DUK_DDDPRINT("directive contains escapes: valid directive " - "but we ignore such directives")); - } else { - /* - * The length comparisons are present to handle - * strings like "use strict\u0000foo" as required. - */ - - if (DUK_HSTRING_GET_BYTELEN(h_dir) == 10 && - DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use strict", 10) == 0) { -#if defined(DUK_USE_STRICT_DECL) - DUK_DDD(DUK_DDDPRINT("use strict directive detected: strict flag %ld -> %ld", - (long) comp_ctx->curr_func.is_strict, (long) 1)); - comp_ctx->curr_func.is_strict = 1; -#else - DUK_DDD(DUK_DDDPRINT("use strict detected but strict declarations disabled, ignoring")); -#endif - } else if (DUK_HSTRING_GET_BYTELEN(h_dir) == 14 && - DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), "use duk notail", 14) == 0) { - DUK_DDD(DUK_DDDPRINT("use duk notail directive detected: notail flag %ld -> %ld", - (long) comp_ctx->curr_func.is_notail, (long) 1)); - comp_ctx->curr_func.is_notail = 1; - } else { - DUK_DD(DUK_DDPRINT("unknown directive: '%!O', ignoring but not terminating " - "directive prologue", (duk_hobject *) h_dir)); - } - } - } else { - DUK_DDD(DUK_DDDPRINT("non-directive expression statement or no longer in prologue; " - "prologue terminated if still active")); - } - - stmt_flags |= DUK__HAS_VAL | DUK__HAS_TERM; - } - } /* end switch (tok) */ - - /* - * Statement value handling. - * - * Global code and eval code has an implicit return value - * which comes from the last statement with a value - * (technically a non-"empty" continuation, which is - * different from an empty statement). - * - * Since we don't know whether a later statement will - * override the value of the current statement, we need - * to coerce the statement value to a register allocated - * for implicit return values. In other cases we need - * to coerce the statement value to a plain value to get - * any side effects out (consider e.g. "foo.bar;"). - */ - - /* XXX: what about statements which leave a half-cooked value in 'res' - * but have no stmt value? Any such statements? - */ - - if (stmt_flags & DUK__HAS_VAL) { - duk_regconst_t reg_stmt_value = comp_ctx->curr_func.reg_stmt_value; - if (reg_stmt_value >= 0) { - duk__ivalue_toforcedreg(comp_ctx, res, reg_stmt_value); - } else { - duk__ivalue_toplain_ignore(comp_ctx, res); - } - } else { - ; - } - - /* - * Statement terminator check, including automatic semicolon - * handling. After this step, 'curr_tok' should be the first - * token after a possible statement terminator. - */ - - if (stmt_flags & DUK__HAS_TERM) { - if (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON) { - DUK_DDD(DUK_DDDPRINT("explicit semicolon terminates statement")); - duk__advance(comp_ctx); - } else { - if (comp_ctx->curr_token.allow_auto_semi) { - DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement")); - } else if (stmt_flags & DUK__ALLOW_AUTO_SEMI_ALWAYS) { - /* XXX: make this lenience dependent on flags or strictness? */ - DUK_DDD(DUK_DDDPRINT("automatic semicolon terminates statement (allowed for compatibility " - "even though no lineterm present before next token)")); - } else { - DUK_ERROR_SYNTAX(thr, DUK_STR_UNTERMINATED_STMT); - } - } - } else { - DUK_DDD(DUK_DDDPRINT("statement has no terminator")); - } - - /* - * Directive prologue tracking. - */ - - if (stmt_flags & DUK__STILL_PROLOGUE) { - DUK_DDD(DUK_DDDPRINT("setting in_directive_prologue")); - comp_ctx->curr_func.in_directive_prologue = 1; - } - - /* - * Cleanups (all statement parsing flows through here). - * - * Pop label site and reset labels. Reset 'next temp' to value at - * entry to reuse temps. - */ - - if (label_id >= 0) { - duk__emit_bc(comp_ctx, - DUK_OP_ENDLABEL, - (duk_regconst_t) label_id); - } - - DUK__SETTEMP(comp_ctx, temp_at_entry); - - duk__reset_labels_to_length(comp_ctx, labels_len_at_entry); - - /* XXX: return indication of "terminalness" (e.g. a 'throw' is terminal) */ - - DUK__RECURSION_DECREASE(comp_ctx, thr); -} - -/* - * Parse a statement list. - * - * Handles automatic semicolon insertion and implicit return value. - * - * Upon entry, 'curr_tok' should contain the first token of the first - * statement (parsed in the "allow regexp literal" mode). Upon exit, - * 'curr_tok' contains the token following the statement list terminator - * (EOF or closing brace). - */ - -DUK_LOCAL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof) { - duk_hthread *thr = comp_ctx->thr; - duk_ivalue res_alloc; - duk_ivalue *res = &res_alloc; - - /* Setup state. Initial ivalue is 'undefined'. */ - - duk_require_stack(thr, DUK__PARSE_STATEMENTS_SLOTS); - - /* XXX: 'res' setup can be moved to function body level; in fact, two 'res' - * intermediate values suffice for parsing of each function. Nesting is needed - * for nested functions (which may occur inside expressions). - */ - - DUK_MEMZERO(&res_alloc, sizeof(res_alloc)); - res->t = DUK_IVAL_PLAIN; - res->x1.t = DUK_ISPEC_VALUE; - res->x1.valstack_idx = duk_get_top(thr); - res->x2.valstack_idx = res->x1.valstack_idx + 1; - duk_push_undefined(thr); - duk_push_undefined(thr); - - /* Parse statements until a closing token (EOF or '}') is found. */ - - for (;;) { - /* Check whether statement list ends. */ - - if (expect_eof) { - if (comp_ctx->curr_token.t == DUK_TOK_EOF) { - break; - } - } else { - if (comp_ctx->curr_token.t == DUK_TOK_RCURLY) { - break; - } - } - - /* Check statement type based on the first token type. - * - * Note: expression parsing helpers expect 'curr_tok' to - * contain the first token of the expression upon entry. - */ - - DUK_DDD(DUK_DDDPRINT("TOKEN %ld (non-whitespace, non-comment)", (long) comp_ctx->curr_token.t)); - - duk__parse_stmt(comp_ctx, res, allow_source_elem); - } - - duk__advance(comp_ctx); - - /* Tear down state. */ - - duk_pop_2(thr); -} - -/* - * Declaration binding instantiation conceptually happens when calling a - * function; for us it essentially means that function prologue. The - * conceptual process is described in E5 Section 10.5. - * - * We need to keep track of all encountered identifiers to (1) create an - * identifier-to-register map ("varmap"); and (2) detect duplicate - * declarations. Identifiers which are not bound to registers still need - * to be tracked for detecting duplicates. Currently such identifiers - * are put into the varmap with a 'null' value, which is later cleaned up. - * - * To support functions with a large number of variable and function - * declarations, registers are not allocated beyond a certain limit; - * after that limit, variables and functions need slow path access. - * Arguments are currently always register bound, which imposes a hard - * (and relatively small) argument count limit. - * - * Some bindings in E5 are not configurable (= deletable) and almost all - * are mutable (writable). Exceptions are: - * - * - The 'arguments' binding, established only if no shadowing argument - * or function declaration exists. We handle 'arguments' creation - * and binding through an explicit slow path environment record. - * - * - The "name" binding for a named function expression. This is also - * handled through an explicit slow path environment record. - */ - -/* XXX: add support for variables to not be register bound always, to - * handle cases with a very large number of variables? - */ - -DUK_LOCAL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg) { - duk_hthread *thr = comp_ctx->thr; - duk_hstring *h_name; - duk_bool_t configurable_bindings; - duk_uarridx_t num_args; - duk_uarridx_t num_decls; - duk_regconst_t rc_name; - duk_small_uint_t declvar_flags; - duk_uarridx_t i; -#if defined(DUK_USE_ASSERTIONS) - duk_idx_t entry_top; -#endif - -#if defined(DUK_USE_ASSERTIONS) - entry_top = duk_get_top(thr); -#endif - - /* - * Preliminaries - */ - - configurable_bindings = comp_ctx->curr_func.is_eval; - DUK_DDD(DUK_DDDPRINT("configurable_bindings=%ld", (long) configurable_bindings)); - - /* varmap is already in comp_ctx->curr_func.varmap_idx */ - - /* - * Function formal arguments, always bound to registers - * (there's no support for shuffling them now). - */ - - num_args = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx); - DUK_DDD(DUK_DDDPRINT("num_args=%ld", (long) num_args)); - /* XXX: check num_args */ - - for (i = 0; i < num_args; i++) { - duk_get_prop_index(thr, comp_ctx->curr_func.argnames_idx, i); - h_name = duk_known_hstring(thr, -1); - - if (comp_ctx->curr_func.is_strict) { - if (duk__hstring_is_eval_or_arguments(comp_ctx, h_name)) { - DUK_DDD(DUK_DDDPRINT("arg named 'eval' or 'arguments' in strict mode -> SyntaxError")); - goto error_argname; - } - duk_dup_top(thr); - if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { - DUK_DDD(DUK_DDDPRINT("duplicate arg name in strict mode -> SyntaxError")); - goto error_argname; - } - - /* Ensure argument name is not a reserved word in current - * (final) strictness. Formal argument parsing may not - * catch reserved names if strictness changes during - * parsing. - * - * We only need to do this in strict mode because non-strict - * keyword are always detected in formal argument parsing. - */ - - if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(h_name)) { - goto error_argname; - } - } - - /* overwrite any previous binding of the same name; the effect is - * that last argument of a certain name wins. - */ - - /* only functions can have arguments */ - DUK_ASSERT(comp_ctx->curr_func.is_function); - duk_push_uarridx(thr, i); /* -> [ ... name index ] */ - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* -> [ ... ] */ - - /* no code needs to be emitted, the regs already have values */ - } - - /* use temp_next for tracking register allocations */ - DUK__SETTEMP_CHECKMAX(comp_ctx, (duk_regconst_t) num_args); - - /* - * After arguments, allocate special registers (like shuffling temps) - */ - - if (out_stmt_value_reg) { - *out_stmt_value_reg = DUK__ALLOCTEMP(comp_ctx); - } - if (comp_ctx->curr_func.needs_shuffle) { - duk_regconst_t shuffle_base = DUK__ALLOCTEMPS(comp_ctx, 3); - comp_ctx->curr_func.shuffle1 = shuffle_base; - comp_ctx->curr_func.shuffle2 = shuffle_base + 1; - comp_ctx->curr_func.shuffle3 = shuffle_base + 2; - DUK_D(DUK_DPRINT("shuffle registers needed by function, allocated: %ld %ld %ld", - (long) comp_ctx->curr_func.shuffle1, - (long) comp_ctx->curr_func.shuffle2, - (long) comp_ctx->curr_func.shuffle3)); - } - if (comp_ctx->curr_func.temp_next > 0x100) { - DUK_D(DUK_DPRINT("not enough 8-bit regs: temp_next=%ld", (long) comp_ctx->curr_func.temp_next)); - goto error_outofregs; - } - - /* - * Function declarations - */ - - num_decls = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx); - DUK_DDD(DUK_DDDPRINT("num_decls=%ld -> %!T", - (long) num_decls, - (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.decls_idx))); - for (i = 0; i < num_decls; i += 2) { - duk_int_t decl_type; - duk_int_t fnum; - - duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */ - decl_type = duk_to_int(thr, -1); - fnum = decl_type >> 8; /* XXX: macros */ - decl_type = decl_type & 0xff; - duk_pop(thr); - - if (decl_type != DUK_DECL_TYPE_FUNC) { - continue; - } - - duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ - - /* XXX: spilling */ - if (comp_ctx->curr_func.is_function) { - duk_regconst_t reg_bind; - duk_dup_top(thr); - if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { - /* shadowed; update value */ - duk_dup_top(thr); - duk_get_prop(thr, comp_ctx->curr_func.varmap_idx); - reg_bind = duk_to_int(thr, -1); /* [ ... name reg_bind ] */ - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - reg_bind, - (duk_regconst_t) fnum); - } else { - /* function: always register bound */ - reg_bind = DUK__ALLOCTEMP(comp_ctx); - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - reg_bind, - (duk_regconst_t) fnum); - duk_push_int(thr, (duk_int_t) reg_bind); - } - } else { - /* Function declaration for global/eval code is emitted even - * for duplicates, because of E5 Section 10.5, step 5.e of - * E5.1 (special behavior for variable bound to global object). - * - * DECLVAR will not re-declare a variable as such, but will - * update the binding value. - */ - - duk_regconst_t reg_temp = DUK__ALLOCTEMP(comp_ctx); - duk_dup_top(thr); - rc_name = duk__getconst(comp_ctx); - duk_push_null(thr); - - duk__emit_a_bc(comp_ctx, - DUK_OP_CLOSURE, - reg_temp, - (duk_regconst_t) fnum); - - declvar_flags = DUK_PROPDESC_FLAG_WRITABLE | - DUK_PROPDESC_FLAG_ENUMERABLE | - DUK_BC_DECLVAR_FLAG_FUNC_DECL; - - if (configurable_bindings) { - declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; - } - - duk__emit_a_b_c(comp_ctx, - DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST, - (duk_regconst_t) declvar_flags /*flags*/, - rc_name /*name*/, - reg_temp /*value*/); - - DUK__SETTEMP(comp_ctx, reg_temp); /* forget temp */ - } - - DUK_DDD(DUK_DDDPRINT("function declaration to varmap: %!T -> %!T", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_NULL(duk_get_tval(thr, -1)) || DUK_TVAL_IS_FASTINT(duk_get_tval(thr, -1))); -#endif - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */ - } - - /* - * 'arguments' binding is special; if a shadowing argument or - * function declaration exists, an arguments object will - * definitely not be needed, regardless of whether the identifier - * 'arguments' is referenced inside the function body. - */ - - if (duk_has_prop_stridx(thr, comp_ctx->curr_func.varmap_idx, DUK_STRIDX_LC_ARGUMENTS)) { - DUK_DDD(DUK_DDDPRINT("'arguments' is shadowed by argument or function declaration " - "-> arguments object creation can be skipped")); - comp_ctx->curr_func.is_arguments_shadowed = 1; - } - - /* - * Variable declarations. - * - * Unlike function declarations, variable declaration values don't get - * assigned on entry. If a binding of the same name already exists, just - * ignore it silently. - */ - - for (i = 0; i < num_decls; i += 2) { - duk_int_t decl_type; - - duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1); /* decl type */ - decl_type = duk_to_int(thr, -1); - decl_type = decl_type & 0xff; - duk_pop(thr); - - if (decl_type != DUK_DECL_TYPE_VAR) { - continue; - } - - duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ - - if (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) { - /* shadowed, ignore */ - } else { - duk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i); /* decl name */ - h_name = duk_known_hstring(thr, -1); - - if (h_name == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) && - !comp_ctx->curr_func.is_arguments_shadowed) { - /* E5 Section steps 7-8 */ - DUK_DDD(DUK_DDDPRINT("'arguments' not shadowed by a function declaration, " - "but appears as a variable declaration -> treat as " - "a no-op for variable declaration purposes")); - duk_pop(thr); - continue; - } - - /* XXX: spilling */ - if (comp_ctx->curr_func.is_function) { - duk_regconst_t reg_bind = DUK__ALLOCTEMP(comp_ctx); - /* no need to init reg, it will be undefined on entry */ - duk_push_int(thr, (duk_int_t) reg_bind); - } else { - duk_dup_top(thr); - rc_name = duk__getconst(comp_ctx); - duk_push_null(thr); - - declvar_flags = DUK_PROPDESC_FLAG_WRITABLE | - DUK_PROPDESC_FLAG_ENUMERABLE; - if (configurable_bindings) { - declvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE; - } - - duk__emit_a_b_c(comp_ctx, - DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST, - (duk_regconst_t) declvar_flags /*flags*/, - rc_name /*name*/, - 0 /*value*/); - } - - duk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* [ ... name reg/null ] -> [ ... ] */ - } - } - - /* - * Wrap up - */ - - DUK_DDD(DUK_DDDPRINT("varmap: %!T, is_arguments_shadowed=%ld", - (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx), - (long) comp_ctx->curr_func.is_arguments_shadowed)); - - DUK_ASSERT_TOP(thr, entry_top); - return; - - error_outofregs: - DUK_ERROR_RANGE(thr, DUK_STR_REG_LIMIT); - DUK_UNREACHABLE(); - return; - - error_argname: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARG_NAME); - DUK_UNREACHABLE(); - return; -} - -/* - * Parse a function-body-like expression (FunctionBody or Program - * in E5 grammar) using a two-pass parse. The productions appear - * in the following contexts: - * - * - function expression - * - function statement - * - function declaration - * - getter in object literal - * - setter in object literal - * - global code - * - eval code - * - Function constructor body - * - * This function only parses the statement list of the body; the argument - * list and possible function name must be initialized by the caller. - * For instance, for Function constructor, the argument names are originally - * on the value stack. The parsing of statements ends either at an EOF or - * a closing brace; this is controlled by an input flag. - * - * Note that there are many differences affecting parsing and even code - * generation: - * - * - Global and eval code have an implicit return value generated - * by the last statement; function code does not - * - * - Global code, eval code, and Function constructor body end in - * an EOF, other bodies in a closing brace ('}') - * - * Upon entry, 'curr_tok' is ignored and the function will pull in the - * first token on its own. Upon exit, 'curr_tok' is the terminating - * token (EOF or closing brace). - */ - -DUK_LOCAL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token) { - duk_compiler_func *func; - duk_hthread *thr; - duk_regconst_t reg_stmt_value = -1; - duk_lexer_point lex_pt; - duk_regconst_t temp_first; - duk_small_int_t compile_round = 1; - - DUK_ASSERT(comp_ctx != NULL); - - thr = comp_ctx->thr; - DUK_ASSERT(thr != NULL); - - func = &comp_ctx->curr_func; - DUK_ASSERT(func != NULL); - - DUK__RECURSION_INCREASE(comp_ctx, thr); - - duk_require_stack(thr, DUK__FUNCTION_BODY_REQUIRE_SLOTS); - - /* - * Store lexer position for a later rewind - */ - - DUK_LEXER_GETPOINT(&comp_ctx->lex, &lex_pt); - - /* - * Program code (global and eval code) has an implicit return value - * from the last statement value (e.g. eval("1; 2+3;") returns 3). - * This is not the case with functions. If implicit statement return - * value is requested, all statements are coerced to a register - * allocated here, and used in the implicit return statement below. - */ - - /* XXX: this is pointless here because pass 1 is throw-away */ - if (implicit_return_value) { - reg_stmt_value = DUK__ALLOCTEMP(comp_ctx); - - /* If an implicit return value is needed by caller, it must be - * initialized to 'undefined' because we don't know whether any - * non-empty (where "empty" is a continuation type, and different - * from an empty statement) statements will be executed. - * - * However, since 1st pass is a throwaway one, no need to emit - * it here. - */ -#if 0 - duk__emit_bc(comp_ctx, - DUK_OP_LDUNDEF, - 0); -#endif - } - - /* - * First pass. - * - * Gather variable/function declarations needed for second pass. - * Code generated is dummy and discarded. - */ - - func->in_directive_prologue = 1; - func->in_scanning = 1; - func->may_direct_eval = 0; - func->id_access_arguments = 0; - func->id_access_slow = 0; - func->id_access_slow_own = 0; - func->reg_stmt_value = reg_stmt_value; -#if defined(DUK_USE_DEBUGGER_SUPPORT) - func->min_line = DUK_INT_MAX; - func->max_line = 0; -#endif - - /* duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp literal" mode with current strictness */ - if (expect_token >= 0) { - /* Eating a left curly; regexp mode is allowed by left curly - * based on duk__token_lbp[] automatically. - */ - DUK_ASSERT(expect_token == DUK_TOK_LCURLY); - duk__update_lineinfo_currtoken(comp_ctx); - duk__advance_expect(comp_ctx, expect_token); - } else { - /* Need to set curr_token.t because lexing regexp mode depends on current - * token type. Zero value causes "allow regexp" mode. - */ - comp_ctx->curr_token.t = 0; - duk__advance(comp_ctx); - } - - DUK_DDD(DUK_DDDPRINT("begin 1st pass")); - duk__parse_stmts(comp_ctx, - 1, /* allow source elements */ - expect_eof); /* expect EOF instead of } */ - DUK_DDD(DUK_DDDPRINT("end 1st pass")); - - /* - * Second (and possibly third) pass. - * - * Generate actual code. In most cases the need for shuffle - * registers is detected during pass 1, but in some corner cases - * we'll only detect it during pass 2 and a third pass is then - * needed (see GH-115). - */ - - for (;;) { - duk_bool_t needs_shuffle_before = comp_ctx->curr_func.needs_shuffle; - compile_round++; - - /* - * Rewind lexer. - * - * duk__parse_stmts() expects curr_tok to be set; parse in "allow regexp - * literal" mode with current strictness. - * - * curr_token line number info should be initialized for pass 2 before - * generating prologue, to ensure prologue bytecode gets nice line numbers. - */ - - DUK_DDD(DUK_DDDPRINT("rewind lexer")); - DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt); - comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */ - comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ - duk__advance(comp_ctx); - - /* - * Reset function state and perform register allocation, which creates - * 'varmap' for second pass. Function prologue for variable declarations, - * binding value initializations etc is emitted as a by-product. - * - * Strict mode restrictions for duplicate and invalid argument - * names are checked here now that we know whether the function - * is actually strict. See: test-dev-strict-mode-boundary.js. - * - * Inner functions are compiled during pass 1 and are not reset. - */ - - duk__reset_func_for_pass2(comp_ctx); - func->in_directive_prologue = 1; - func->in_scanning = 0; - - /* must be able to emit code, alloc consts, etc. */ - - duk__init_varmap_and_prologue_for_pass2(comp_ctx, - (implicit_return_value ? ®_stmt_value : NULL)); - func->reg_stmt_value = reg_stmt_value; - - temp_first = DUK__GETTEMP(comp_ctx); - - func->temp_first = temp_first; - func->temp_next = temp_first; - func->stmt_next = 0; - func->label_next = 0; - - /* XXX: init or assert catch depth etc -- all values */ - func->id_access_arguments = 0; - func->id_access_slow = 0; - func->id_access_slow_own = 0; - - /* - * Check function name validity now that we know strictness. - * This only applies to function declarations and expressions, - * not setter/getter name. - * - * See: test-dev-strict-mode-boundary.js - */ - - if (func->is_function && !func->is_setget && func->h_name != NULL) { - if (func->is_strict) { - if (duk__hstring_is_eval_or_arguments(comp_ctx, func->h_name)) { - DUK_DDD(DUK_DDDPRINT("func name is 'eval' or 'arguments' in strict mode")); - goto error_funcname; - } - if (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) { - DUK_DDD(DUK_DDDPRINT("func name is a reserved word in strict mode")); - goto error_funcname; - } - } else { - if (DUK_HSTRING_HAS_RESERVED_WORD(func->h_name) && - !DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) { - DUK_DDD(DUK_DDDPRINT("func name is a reserved word in non-strict mode")); - goto error_funcname; - } - } - } - - /* - * Second pass parsing. - */ - - if (implicit_return_value) { - /* Default implicit return value. */ - duk__emit_bc(comp_ctx, - DUK_OP_LDUNDEF, - 0); - } - - DUK_DDD(DUK_DDDPRINT("begin 2nd pass")); - duk__parse_stmts(comp_ctx, - 1, /* allow source elements */ - expect_eof); /* expect EOF instead of } */ - DUK_DDD(DUK_DDDPRINT("end 2nd pass")); - - duk__update_lineinfo_currtoken(comp_ctx); - - if (needs_shuffle_before == comp_ctx->curr_func.needs_shuffle) { - /* Shuffle decision not changed. */ - break; - } - if (compile_round >= 3) { - /* Should never happen but avoid infinite loop just in case. */ - DUK_D(DUK_DPRINT("more than 3 compile passes needed, should never happen")); - DUK_ERROR_INTERNAL(thr); - } - DUK_D(DUK_DPRINT("need additional round to compile function, round now %d", (int) compile_round)); - } - - /* - * Emit a final RETURN. - * - * It would be nice to avoid emitting an unnecessary "return" opcode - * if the current PC is not reachable. However, this cannot be reliably - * detected; even if the previous instruction is an unconditional jump, - * there may be a previous jump which jumps to current PC (which is the - * case for iteration and conditional statements, for instance). - */ - - /* XXX: request a "last statement is terminal" from duk__parse_stmt() and duk__parse_stmts(); - * we could avoid the last RETURN if we could ensure there is no way to get here - * (directly or via a jump) - */ - - DUK_ASSERT(comp_ctx->curr_func.catch_depth == 0); - if (reg_stmt_value >= 0) { - DUK_ASSERT(DUK__ISREG(reg_stmt_value)); - duk__emit_bc(comp_ctx, DUK_OP_RETREG, reg_stmt_value /*reg*/); - } else { - duk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF); - } - - /* - * Peephole optimize JUMP chains. - */ - - duk__peephole_optimize_bytecode(comp_ctx); - - /* - * comp_ctx->curr_func is now ready to be converted into an actual - * function template. - */ - - DUK__RECURSION_DECREASE(comp_ctx, thr); - return; - - error_funcname: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FUNC_NAME); -} - -/* - * Parse a function-like expression: - * - * - function expression - * - function declaration - * - function statement (non-standard) - * - setter/getter - * - * Adds the function to comp_ctx->curr_func function table and returns the - * function number. - * - * On entry, curr_token points to: - * - * - the token after 'function' for function expression/declaration/statement - * - the token after 'set' or 'get' for setter/getter - */ - -/* Parse formals. */ -DUK_LOCAL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx) { - duk_hthread *thr = comp_ctx->thr; - duk_bool_t first = 1; - duk_uarridx_t n; - - for (;;) { - if (comp_ctx->curr_token.t == DUK_TOK_RPAREN) { - break; - } - - if (first) { - /* no comma */ - first = 0; - } else { - duk__advance_expect(comp_ctx, DUK_TOK_COMMA); - } - - /* Note: when parsing a formal list in non-strict context, e.g. - * "implements" is parsed as an identifier. When the function is - * later detected to be strict, the argument list must be rechecked - * against a larger set of reserved words (that of strict mode). - * This is handled by duk__parse_func_body(). Here we recognize - * whatever tokens are considered reserved in current strictness - * (which is not always enough). - */ - - if (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) { - DUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER); - } - DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER); - DUK_ASSERT(comp_ctx->curr_token.str1 != NULL); - DUK_DDD(DUK_DDDPRINT("formal argument: %!O", - (duk_heaphdr *) comp_ctx->curr_token.str1)); - - /* XXX: append primitive */ - duk_push_hstring(thr, comp_ctx->curr_token.str1); - n = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx); - duk_put_prop_index(thr, comp_ctx->curr_func.argnames_idx, n); - - duk__advance(comp_ctx); /* eat identifier */ - } -} - -/* Parse a function-like expression, assuming that 'comp_ctx->curr_func' is - * correctly set up. Assumes that curr_token is just after 'function' (or - * 'set'/'get' etc). - */ -DUK_LOCAL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) { - duk_hthread *thr = comp_ctx->thr; - duk_token *tok; - duk_bool_t no_advance; - - DUK_ASSERT(comp_ctx->curr_func.num_formals == 0); - DUK_ASSERT(comp_ctx->curr_func.is_function == 1); - DUK_ASSERT(comp_ctx->curr_func.is_eval == 0); - DUK_ASSERT(comp_ctx->curr_func.is_global == 0); - DUK_ASSERT(comp_ctx->curr_func.is_setget == ((flags & DUK__FUNC_FLAG_GETSET) != 0)); - - duk__update_lineinfo_currtoken(comp_ctx); - - /* - * Function name (if any) - * - * We don't check for prohibited names here, because we don't - * yet know whether the function will be strict. Function body - * parsing handles this retroactively. - * - * For function expressions and declarations function name must - * be an Identifer (excludes reserved words). For setter/getter - * it is a PropertyName which allows reserved words and also - * strings and numbers (e.g. "{ get 1() { ... } }"). - * - * Function parsing may start either from prev_token or curr_token - * (object literal method definition uses prev_token for example). - * This is dealt with for the initial token. - */ - - no_advance = (flags & DUK__FUNC_FLAG_USE_PREVTOKEN); - if (no_advance) { - tok = &comp_ctx->prev_token; - } else { - tok = &comp_ctx->curr_token; - } - - if (flags & DUK__FUNC_FLAG_GETSET) { - /* PropertyName -> IdentifierName | StringLiteral | NumericLiteral */ - if (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t == DUK_TOK_STRING) { - duk_push_hstring(thr, tok->str1); /* keep in valstack */ - } else if (tok->t == DUK_TOK_NUMBER) { - duk_push_number(thr, tok->num); - duk_to_string(thr, -1); - } else { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_GETSET_NAME); - } - comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */ - } else { - /* Function name is an Identifier (not IdentifierName), but we get - * the raw name (not recognizing keywords) here and perform the name - * checks only after pass 1. - */ - if (tok->t_nores == DUK_TOK_IDENTIFIER) { - duk_push_hstring(thr, tok->str1); /* keep in valstack */ - comp_ctx->curr_func.h_name = duk_known_hstring(thr, -1); /* borrowed reference */ - } else { - /* valstack will be unbalanced, which is OK */ - DUK_ASSERT((flags & DUK__FUNC_FLAG_GETSET) == 0); - DUK_ASSERT(comp_ctx->curr_func.h_name == NULL); - no_advance = 1; - if (flags & DUK__FUNC_FLAG_DECL) { - DUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_NAME_REQUIRED); - } - } - } - - DUK_DD(DUK_DDPRINT("function name: %!O", - (duk_heaphdr *) comp_ctx->curr_func.h_name)); - - if (!no_advance) { - duk__advance(comp_ctx); - } - - /* - * Formal argument list - * - * We don't check for prohibited names or for duplicate argument - * names here, becase we don't yet know whether the function will - * be strict. Function body parsing handles this retroactively. - */ - - duk__advance_expect(comp_ctx, DUK_TOK_LPAREN); - - duk__parse_func_formals(comp_ctx); - - DUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RPAREN); - duk__advance(comp_ctx); - - /* - * Parse function body - */ - - duk__parse_func_body(comp_ctx, - 0, /* expect_eof */ - 0, /* implicit_return_value */ - DUK_TOK_LCURLY); /* expect_token */ - - /* - * Convert duk_compiler_func to a function template and add it - * to the parent function table. - */ - - duk__convert_to_func_template(comp_ctx); /* -> [ ... func ] */ -} - -/* Parse an inner function, adding the function template to the current function's - * function table. Return a function number to be used by the outer function. - * - * Avoiding O(depth^2) inner function parsing is handled here. On the first pass, - * compile and register the function normally into the 'funcs' array, also recording - * a lexer point (offset/line) to the closing brace of the function. On the second - * pass, skip the function and return the same 'fnum' as on the first pass by using - * a running counter. - * - * An unfortunate side effect of this is that when parsing the inner function, almost - * nothing is known of the outer function, i.e. the inner function's scope. We don't - * need that information at the moment, but it would allow some optimizations if it - * were used. - */ -DUK_LOCAL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) { - duk_hthread *thr = comp_ctx->thr; - duk_compiler_func old_func; - duk_idx_t entry_top; - duk_int_t fnum; - - /* - * On second pass, skip the function. - */ - - if (!comp_ctx->curr_func.in_scanning) { - duk_lexer_point lex_pt; - - fnum = comp_ctx->curr_func.fnum_next++; - duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1)); - lex_pt.offset = (duk_size_t) duk_to_uint(thr, -1); - duk_pop(thr); - duk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2)); - lex_pt.line = duk_to_int(thr, -1); - duk_pop(thr); - - DUK_DDD(DUK_DDDPRINT("second pass of an inner func, skip the function, reparse closing brace; lex offset=%ld, line=%ld", - (long) lex_pt.offset, (long) lex_pt.line)); - - DUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt); - comp_ctx->curr_token.t = 0; /* this is needed for regexp mode */ - comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ - duk__advance(comp_ctx); - duk__advance_expect(comp_ctx, DUK_TOK_RCURLY); - - return fnum; - } - - /* - * On first pass, perform actual parsing. Remember valstack top on entry - * to restore it later, and switch to using a new function in comp_ctx. - */ - - entry_top = duk_get_top(thr); - DUK_DDD(DUK_DDDPRINT("before func: entry_top=%ld, curr_tok.start_offset=%ld", - (long) entry_top, (long) comp_ctx->curr_token.start_offset)); - - DUK_MEMCPY(&old_func, &comp_ctx->curr_func, sizeof(duk_compiler_func)); - - DUK_MEMZERO(&comp_ctx->curr_func, sizeof(duk_compiler_func)); - duk__init_func_valstack_slots(comp_ctx); - DUK_ASSERT(comp_ctx->curr_func.num_formals == 0); - - /* inherit initial strictness from parent */ - comp_ctx->curr_func.is_strict = old_func.is_strict; - - /* XXX: It might be better to just store the flags into the curr_func - * struct and use them as is without this flag interpretation step - * here. - */ - DUK_ASSERT(comp_ctx->curr_func.is_notail == 0); - comp_ctx->curr_func.is_function = 1; - DUK_ASSERT(comp_ctx->curr_func.is_eval == 0); - DUK_ASSERT(comp_ctx->curr_func.is_global == 0); - comp_ctx->curr_func.is_setget = ((flags & DUK__FUNC_FLAG_GETSET) != 0); - comp_ctx->curr_func.is_namebinding = !(flags & (DUK__FUNC_FLAG_GETSET | - DUK__FUNC_FLAG_METDEF | - DUK__FUNC_FLAG_DECL)); /* no name binding for: declarations, objlit getset, objlit method def */ - comp_ctx->curr_func.is_constructable = !(flags & (DUK__FUNC_FLAG_GETSET | - DUK__FUNC_FLAG_METDEF)); /* not constructable: objlit getset, objlit method def */ - - /* - * Parse inner function - */ - - duk__parse_func_like_raw(comp_ctx, flags); /* pushes function template */ - - /* prev_token.start_offset points to the closing brace here; when skipping - * we're going to reparse the closing brace to ensure semicolon insertion - * etc work as expected. - */ - DUK_DDD(DUK_DDDPRINT("after func: prev_tok.start_offset=%ld, curr_tok.start_offset=%ld", - (long) comp_ctx->prev_token.start_offset, (long) comp_ctx->curr_token.start_offset)); - DUK_ASSERT(comp_ctx->lex.input[comp_ctx->prev_token.start_offset] == (duk_uint8_t) DUK_ASC_RCURLY); - - /* XXX: append primitive */ - DUK_ASSERT(duk_get_length(thr, old_func.funcs_idx) == (duk_size_t) (old_func.fnum_next * 3)); - fnum = old_func.fnum_next++; - - if (fnum > DUK__MAX_FUNCS) { - DUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_FUNC_LIMIT); - } - - /* array writes autoincrement length */ - (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3)); - duk_push_size_t(thr, comp_ctx->prev_token.start_offset); - (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1)); - duk_push_int(thr, comp_ctx->prev_token.start_line); - (void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2)); - - /* - * Cleanup: restore original function, restore valstack state. - * - * Function declaration handling needs the function name to be pushed - * on the value stack. - */ - - if (flags & DUK__FUNC_FLAG_PUSHNAME_PASS1) { - DUK_ASSERT(comp_ctx->curr_func.h_name != NULL); - duk_push_hstring(thr, comp_ctx->curr_func.h_name); - duk_replace(thr, entry_top); - duk_set_top(thr, entry_top + 1); - } else { - duk_set_top(thr, entry_top); - } - DUK_MEMCPY((void *) &comp_ctx->curr_func, (void *) &old_func, sizeof(duk_compiler_func)); - - return fnum; -} - -/* - * Compile input string into an executable function template without - * arguments. - * - * The string is parsed as the "Program" production of Ecmascript E5. - * Compilation context can be either global code or eval code (see E5 - * Sections 14 and 15.1.2.1). - * - * Input stack: [ ... filename ] - * Output stack: [ ... func_template ] - */ - -/* XXX: source code property */ - -DUK_LOCAL duk_ret_t duk__js_compile_raw(duk_hthread *thr, void *udata) { - duk_hstring *h_filename; - duk__compiler_stkstate *comp_stk; - duk_compiler_ctx *comp_ctx; - duk_lexer_point *lex_pt; - duk_compiler_func *func; - duk_idx_t entry_top; - duk_bool_t is_strict; - duk_bool_t is_eval; - duk_bool_t is_funcexpr; - duk_small_uint_t flags; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(udata != NULL); - - /* - * Arguments check - */ - - entry_top = duk_get_top(thr); - DUK_ASSERT(entry_top >= 1); - - comp_stk = (duk__compiler_stkstate *) udata; - comp_ctx = &comp_stk->comp_ctx_alloc; - lex_pt = &comp_stk->lex_pt_alloc; - DUK_ASSERT(comp_ctx != NULL); - DUK_ASSERT(lex_pt != NULL); - - flags = comp_stk->flags; - is_eval = (flags & DUK_COMPILE_EVAL ? 1 : 0); - is_strict = (flags & DUK_COMPILE_STRICT ? 1 : 0); - is_funcexpr = (flags & DUK_COMPILE_FUNCEXPR ? 1 : 0); - - h_filename = duk_get_hstring(thr, -1); /* may be undefined */ - - /* - * Init compiler and lexer contexts - */ - - func = &comp_ctx->curr_func; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - comp_ctx->thr = NULL; - comp_ctx->h_filename = NULL; - comp_ctx->prev_token.str1 = NULL; - comp_ctx->prev_token.str2 = NULL; - comp_ctx->curr_token.str1 = NULL; - comp_ctx->curr_token.str2 = NULL; -#endif - - duk_require_stack(thr, DUK__COMPILE_ENTRY_SLOTS); - - duk_push_dynamic_buffer(thr, 0); /* entry_top + 0 */ - duk_push_undefined(thr); /* entry_top + 1 */ - duk_push_undefined(thr); /* entry_top + 2 */ - duk_push_undefined(thr); /* entry_top + 3 */ - duk_push_undefined(thr); /* entry_top + 4 */ - - comp_ctx->thr = thr; - comp_ctx->h_filename = h_filename; - comp_ctx->tok11_idx = entry_top + 1; - comp_ctx->tok12_idx = entry_top + 2; - comp_ctx->tok21_idx = entry_top + 3; - comp_ctx->tok22_idx = entry_top + 4; - comp_ctx->recursion_limit = DUK_USE_COMPILER_RECLIMIT; - - /* comp_ctx->lex has been pre-initialized by caller: it has been - * zeroed and input/input_length has been set. - */ - comp_ctx->lex.thr = thr; - /* comp_ctx->lex.input and comp_ctx->lex.input_length filled by caller */ - comp_ctx->lex.slot1_idx = comp_ctx->tok11_idx; - comp_ctx->lex.slot2_idx = comp_ctx->tok12_idx; - comp_ctx->lex.buf_idx = entry_top + 0; - comp_ctx->lex.buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 0); - DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(comp_ctx->lex.buf) && !DUK_HBUFFER_HAS_EXTERNAL(comp_ctx->lex.buf)); - comp_ctx->lex.token_limit = DUK_COMPILER_TOKEN_LIMIT; - - lex_pt->offset = 0; - lex_pt->line = 1; - DUK_LEXER_SETPOINT(&comp_ctx->lex, lex_pt); /* fills window */ - comp_ctx->curr_token.start_line = 0; /* needed for line number tracking (becomes prev_token.start_line) */ - - /* - * Initialize function state for a zero-argument function - */ - - duk__init_func_valstack_slots(comp_ctx); - DUK_ASSERT(func->num_formals == 0); - - if (is_funcexpr) { - /* Name will be filled from function expression, not by caller. - * This case is used by Function constructor and duk_compile() - * API with the DUK_COMPILE_FUNCTION option. - */ - DUK_ASSERT(func->h_name == NULL); - } else { - duk_push_hstring_stridx(thr, (is_eval ? DUK_STRIDX_EVAL : - DUK_STRIDX_GLOBAL)); - func->h_name = duk_get_hstring(thr, -1); - } - - /* - * Parse a function body or a function-like expression, depending - * on flags. - */ - - DUK_ASSERT(func->is_setget == 0); - func->is_strict = (duk_uint8_t) is_strict; - DUK_ASSERT(func->is_notail == 0); - - if (is_funcexpr) { - func->is_function = 1; - DUK_ASSERT(func->is_eval == 0); - DUK_ASSERT(func->is_global == 0); - func->is_namebinding = 1; - func->is_constructable = 1; - - duk__advance(comp_ctx); /* init 'curr_token' */ - duk__advance_expect(comp_ctx, DUK_TOK_FUNCTION); - (void) duk__parse_func_like_raw(comp_ctx, 0 /*flags*/); - } else { - DUK_ASSERT(func->is_function == 0); - DUK_ASSERT(is_eval == 0 || is_eval == 1); - func->is_eval = (duk_uint8_t) is_eval; - func->is_global = (duk_uint8_t) !is_eval; - DUK_ASSERT(func->is_namebinding == 0); - DUK_ASSERT(func->is_constructable == 0); - - duk__parse_func_body(comp_ctx, - 1, /* expect_eof */ - 1, /* implicit_return_value */ - -1); /* expect_token */ - } - - /* - * Convert duk_compiler_func to a function template - */ - - duk__convert_to_func_template(comp_ctx); - - /* - * Wrapping duk_safe_call() will mangle the stack, just return stack top - */ - - /* [ ... filename (temps) func ] */ - - return 1; -} - -DUK_INTERNAL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags) { - duk__compiler_stkstate comp_stk; - duk_compiler_ctx *prev_ctx; - duk_ret_t safe_rc; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(src_buffer != NULL); - - /* preinitialize lexer state partially */ - DUK_MEMZERO(&comp_stk, sizeof(comp_stk)); - comp_stk.flags = flags; - DUK_LEXER_INITCTX(&comp_stk.comp_ctx_alloc.lex); - comp_stk.comp_ctx_alloc.lex.input = src_buffer; - comp_stk.comp_ctx_alloc.lex.input_length = src_length; - comp_stk.comp_ctx_alloc.lex.flags = flags; /* Forward flags directly for now. */ - - /* [ ... filename ] */ - - prev_ctx = thr->compile_ctx; - thr->compile_ctx = &comp_stk.comp_ctx_alloc; /* for duk_error_augment.c */ - safe_rc = duk_safe_call(thr, duk__js_compile_raw, (void *) &comp_stk /*udata*/, 1 /*nargs*/, 1 /*nrets*/); - thr->compile_ctx = prev_ctx; /* must restore reliably before returning */ - - if (safe_rc != DUK_EXEC_SUCCESS) { - DUK_D(DUK_DPRINT("compilation failed: %!T", duk_get_tval(thr, -1))); - (void) duk_throw(thr); - } - - /* [ ... template ] */ -} - -/* automatic undefs */ -#undef DUK__ALLOCTEMP -#undef DUK__ALLOCTEMPS -#undef DUK__ALLOW_AUTO_SEMI_ALWAYS -#undef DUK__BC_INITIAL_INSTS -#undef DUK__BP_ADDITIVE -#undef DUK__BP_ASSIGNMENT -#undef DUK__BP_BAND -#undef DUK__BP_BOR -#undef DUK__BP_BXOR -#undef DUK__BP_CALL -#undef DUK__BP_CLOSING -#undef DUK__BP_COMMA -#undef DUK__BP_CONDITIONAL -#undef DUK__BP_EOF -#undef DUK__BP_EQUALITY -#undef DUK__BP_EXPONENTIATION -#undef DUK__BP_FOR_EXPR -#undef DUK__BP_INVALID -#undef DUK__BP_LAND -#undef DUK__BP_LOR -#undef DUK__BP_MEMBER -#undef DUK__BP_MULTIPLICATIVE -#undef DUK__BP_POSTFIX -#undef DUK__BP_RELATIONAL -#undef DUK__BP_SHIFT -#undef DUK__COMPILE_ENTRY_SLOTS -#undef DUK__CONST_MARKER -#undef DUK__DUMP_ISPEC -#undef DUK__DUMP_IVALUE -#undef DUK__EMIT_FLAG_A_IS_SOURCE -#undef DUK__EMIT_FLAG_BC_REGCONST -#undef DUK__EMIT_FLAG_B_IS_TARGET -#undef DUK__EMIT_FLAG_C_IS_TARGET -#undef DUK__EMIT_FLAG_NO_SHUFFLE_A -#undef DUK__EMIT_FLAG_NO_SHUFFLE_B -#undef DUK__EMIT_FLAG_NO_SHUFFLE_C -#undef DUK__EMIT_FLAG_RESERVE_JUMPSLOT -#undef DUK__EXPR_FLAG_ALLOW_EMPTY -#undef DUK__EXPR_FLAG_REJECT_IN -#undef DUK__EXPR_FLAG_REQUIRE_INIT -#undef DUK__EXPR_RBP_MASK -#undef DUK__FUNCTION_BODY_REQUIRE_SLOTS -#undef DUK__FUNCTION_INIT_REQUIRE_SLOTS -#undef DUK__FUNC_FLAG_DECL -#undef DUK__FUNC_FLAG_GETSET -#undef DUK__FUNC_FLAG_METDEF -#undef DUK__FUNC_FLAG_PUSHNAME_PASS1 -#undef DUK__FUNC_FLAG_USE_PREVTOKEN -#undef DUK__GETCONST_MAX_CONSTS_CHECK -#undef DUK__GETTEMP -#undef DUK__HAS_TERM -#undef DUK__HAS_VAL -#undef DUK__ISCONST -#undef DUK__ISREG -#undef DUK__ISREG_NOTTEMP -#undef DUK__ISREG_TEMP -#undef DUK__IS_TERMINAL -#undef DUK__IVAL_FLAG_ALLOW_CONST -#undef DUK__IVAL_FLAG_REQUIRE_SHORT -#undef DUK__IVAL_FLAG_REQUIRE_TEMP -#undef DUK__MAX_ARRAY_INIT_VALUES -#undef DUK__MAX_CONSTS -#undef DUK__MAX_FUNCS -#undef DUK__MAX_OBJECT_INIT_PAIRS -#undef DUK__MAX_TEMPS -#undef DUK__MK_LBP -#undef DUK__MK_LBP_FLAGS -#undef DUK__OBJ_LIT_KEY_GET -#undef DUK__OBJ_LIT_KEY_PLAIN -#undef DUK__OBJ_LIT_KEY_SET -#undef DUK__PARSE_EXPR_SLOTS -#undef DUK__PARSE_STATEMENTS_SLOTS -#undef DUK__RECURSION_DECREASE -#undef DUK__RECURSION_INCREASE -#undef DUK__REMOVECONST -#undef DUK__SETTEMP -#undef DUK__SETTEMP_CHECKMAX -#undef DUK__STILL_PROLOGUE -#undef DUK__TOKEN_LBP_BP_MASK -#undef DUK__TOKEN_LBP_FLAG_NO_REGEXP -#undef DUK__TOKEN_LBP_FLAG_TERMINATES -#undef DUK__TOKEN_LBP_FLAG_UNUSED -#undef DUK__TOKEN_LBP_GET_BP -#line 1 "duk_js_executor.c" -/* - * Ecmascript bytecode executor. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Local declarations. - */ - -DUK_LOCAL_DECL void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act); - -/* - * Misc helpers. - */ - -/* Forced inline declaration, only applied for performance oriented build. */ -#if defined(DUK_USE_EXEC_PREFER_SIZE) -#define DUK__INLINE_PERF -#define DUK__NOINLINE_PERF -#else -#define DUK__INLINE_PERF DUK_ALWAYS_INLINE -#define DUK__NOINLINE_PERF DUK_NOINLINE -#endif - -/* Replace value stack top to value at 'tv_ptr'. Optimize for - * performance by only applying the net refcount change. - */ -#define DUK__REPLACE_TO_TVPTR(thr,tv_ptr) do { \ - duk_hthread *duk__thr; \ - duk_tval *duk__tvsrc; \ - duk_tval *duk__tvdst; \ - duk_tval duk__tvtmp; \ - duk__thr = (thr); \ - duk__tvsrc = DUK_GET_TVAL_NEGIDX(duk__thr, -1); \ - duk__tvdst = (tv_ptr); \ - DUK_TVAL_SET_TVAL(&duk__tvtmp, duk__tvdst); \ - DUK_TVAL_SET_TVAL(duk__tvdst, duk__tvsrc); \ - DUK_TVAL_SET_UNDEFINED(duk__tvsrc); /* value stack init policy */ \ - duk__thr->valstack_top = duk__tvsrc; \ - DUK_TVAL_DECREF(duk__thr, &duk__tvtmp); \ - } while (0) - -/* XXX: candidate of being an internal shared API call */ -#if 0 /* unused */ -DUK_LOCAL void duk__push_tvals_incref_only(duk_hthread *thr, duk_tval *tv_src, duk_small_uint_fast_t count) { - duk_tval *tv_dst; - duk_size_t copy_size; - duk_size_t i; - - tv_dst = thr->valstack_top; - copy_size = sizeof(duk_tval) * count; - DUK_MEMCPY((void *) tv_dst, (const void *) tv_src, copy_size); - for (i = 0; i < count; i++) { - DUK_TVAL_INCREF(thr, tv_dst); - tv_dst++; - } - thr->valstack_top = tv_dst; -} -#endif - -/* - * Arithmetic, binary, and logical helpers. - * - * Note: there is no opcode for logical AND or logical OR; this is on - * purpose, because the evalution order semantics for them make such - * opcodes pretty pointless: short circuiting means they are most - * comfortably implemented as jumps. However, a logical NOT opcode - * is useful. - * - * Note: careful with duk_tval pointers here: they are potentially - * invalidated by any DECREF and almost any API call. It's still - * preferable to work without making a copy but that's not always - * possible. - */ - -DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_mod(duk_double_t d1, duk_double_t d2) { - return (duk_double_t) duk_js_arith_mod((double) d1, (double) d2); -} - -#if defined(DUK_USE_ES7_EXP_OPERATOR) -DUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_exp(duk_double_t d1, duk_double_t d2) { - return (duk_double_t) duk_js_arith_pow((double) d1, (double) d2); -} -#endif - -DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_add(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z) { - /* - * Addition operator is different from other arithmetic - * operations in that it also provides string concatenation. - * Hence it is implemented separately. - * - * There is a fast path for number addition. Other cases go - * through potentially multiple coercions as described in the - * E5 specification. It may be possible to reduce the number - * of coercions, but this must be done carefully to preserve - * the exact semantics. - * - * E5 Section 11.6.1. - * - * Custom types also have special behavior implemented here. - */ - - duk_double_union du; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_x != NULL); /* may be reg or const */ - DUK_ASSERT(tv_y != NULL); /* may be reg or const */ - DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ - DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); - - /* - * Fast paths - */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { - duk_int64_t v1, v2, v3; - duk_int32_t v3_hi; - duk_tval *tv_z; - - /* Input values are signed 48-bit so we can detect overflow - * reliably from high bits or just a comparison. - */ - - v1 = DUK_TVAL_GET_FASTINT(tv_x); - v2 = DUK_TVAL_GET_FASTINT(tv_y); - v3 = v1 + v2; - v3_hi = (duk_int32_t) (v3 >> 32); - if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) { - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */ - return; - } else { - /* overflow, fall through */ - ; - } - } -#endif /* DUK_USE_FASTINT */ - - if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { -#if !defined(DUK_USE_EXEC_PREFER_SIZE) - duk_tval *tv_z; -#endif - - du.d = DUK_TVAL_GET_NUMBER(tv_x) + DUK_TVAL_GET_NUMBER(tv_y); -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_push_number(thr, du.d); /* will NaN normalize result */ - duk_replace(thr, (duk_idx_t) idx_z); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */ -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - return; - } - - /* - * Slow path: potentially requires function calls for coercion - */ - - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - duk_to_primitive(thr, -2, DUK_HINT_NONE); /* side effects -> don't use tv_x, tv_y after */ - duk_to_primitive(thr, -1, DUK_HINT_NONE); - - /* Since Duktape 2.x plain buffers are treated like ArrayBuffer. */ - if (duk_is_string(thr, -2) || duk_is_string(thr, -1)) { - /* Symbols shouldn't technically be handled here, but should - * go into the default ToNumber() coercion path instead and - * fail there with a TypeError. However, there's a ToString() - * in duk_concat_2() which also fails with TypeError so no - * explicit check is needed. - */ - duk_concat_2(thr); /* [... s1 s2] -> [... s1+s2] */ - } else { - duk_double_t d1, d2; - - d1 = duk_to_number_m2(thr); - d2 = duk_to_number_m1(thr); - DUK_ASSERT(duk_is_number(thr, -2)); - DUK_ASSERT(duk_is_number(thr, -1)); - DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1); - DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2); - - du.d = d1 + d2; - duk_pop_2_unsafe(thr); - duk_push_number(thr, du.d); /* will NaN normalize result */ - } - duk_replace(thr, (duk_idx_t) idx_z); /* side effects */ -} - -DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_uint_fast_t idx_z, duk_small_uint_fast_t opcode) { - /* - * Arithmetic operations other than '+' have number-only semantics - * and are implemented here. The separate switch-case here means a - * "double dispatch" of the arithmetic opcode, but saves code space. - * - * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3. - */ - - duk_double_t d1, d2; - duk_double_union du; - duk_small_uint_fast_t opcode_shifted; -#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE) - duk_tval *tv_z; -#endif - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_x != NULL); /* may be reg or const */ - DUK_ASSERT(tv_y != NULL); /* may be reg or const */ - DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ - DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); - - opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { - duk_int64_t v1, v2, v3; - duk_int32_t v3_hi; - - v1 = DUK_TVAL_GET_FASTINT(tv_x); - v2 = DUK_TVAL_GET_FASTINT(tv_y); - - switch (opcode_shifted) { - case DUK_OP_SUB >> 2: { - v3 = v1 - v2; - break; - } - case DUK_OP_MUL >> 2: { - /* Must ensure result is 64-bit (no overflow); a - * simple and sufficient fast path is to allow only - * 32-bit inputs. Avoid zero inputs to avoid - * negative zero issues (-1 * 0 = -0, for instance). - */ - if (v1 >= DUK_I64_CONSTANT(-0x80000000) && v1 <= DUK_I64_CONSTANT(0x7fffffff) && v1 != 0 && - v2 >= DUK_I64_CONSTANT(-0x80000000) && v2 <= DUK_I64_CONSTANT(0x7fffffff) && v2 != 0) { - v3 = v1 * v2; - } else { - goto skip_fastint; - } - break; - } - case DUK_OP_DIV >> 2: { - /* Don't allow a zero divisor. Fast path check by - * "verifying" with multiplication. Also avoid zero - * dividend to avoid negative zero issues (0 / -1 = -0 - * for instance). - */ - if (v1 == 0 || v2 == 0) { - goto skip_fastint; - } - v3 = v1 / v2; - if (v3 * v2 != v1) { - goto skip_fastint; - } - break; - } - case DUK_OP_MOD >> 2: { - /* Don't allow a zero divisor. Restrict both v1 and - * v2 to positive values to avoid compiler specific - * behavior. - */ - if (v1 < 1 || v2 < 1) { - goto skip_fastint; - } - v3 = v1 % v2; - DUK_ASSERT(v3 >= 0); - DUK_ASSERT(v3 < v2); - DUK_ASSERT(v1 - (v1 / v2) * v2 == v3); - break; - } - default: { - /* Possible with DUK_OP_EXP. */ - goto skip_fastint; - } - } - - v3_hi = (duk_int32_t) (v3 >> 32); - if (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) { - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3); /* side effects */ - return; - } - /* fall through if overflow etc */ - } - skip_fastint: -#endif /* DUK_USE_FASTINT */ - - if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { - /* fast path */ - d1 = DUK_TVAL_GET_NUMBER(tv_x); - d2 = DUK_TVAL_GET_NUMBER(tv_y); - } else { - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - d1 = duk_to_number_m2(thr); /* side effects */ - d2 = duk_to_number_m1(thr); - DUK_ASSERT(duk_is_number(thr, -2)); - DUK_ASSERT(duk_is_number(thr, -1)); - DUK_ASSERT_DOUBLE_IS_NORMALIZED(d1); - DUK_ASSERT_DOUBLE_IS_NORMALIZED(d2); - duk_pop_2_unsafe(thr); - } - - switch (opcode_shifted) { - case DUK_OP_SUB >> 2: { - du.d = d1 - d2; - break; - } - case DUK_OP_MUL >> 2: { - du.d = d1 * d2; - break; - } - case DUK_OP_DIV >> 2: { - du.d = d1 / d2; - break; - } - case DUK_OP_MOD >> 2: { - du.d = duk__compute_mod(d1, d2); - break; - } -#if defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_OP_EXP >> 2: { - du.d = duk__compute_exp(d1, d2); - break; - } -#endif - default: { - DUK_UNREACHABLE(); - du.d = DUK_DOUBLE_NAN; /* should not happen */ - break; - } - } - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_push_number(thr, du.d); /* will NaN normalize result */ - duk_replace(thr, (duk_idx_t) idx_z); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - /* important to use normalized NaN with 8-byte tagged types */ - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d); /* side effects */ -#endif /* DUK_USE_EXEC_PREFER_SIZE */ -} - -DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z, duk_small_uint_fast_t opcode) { - /* - * Binary bitwise operations use different coercions (ToInt32, ToUint32) - * depending on the operation. We coerce the arguments first using - * ToInt32(), and then cast to an 32-bit value if necessary. Note that - * such casts must be correct even if there is no native 32-bit type - * (e.g., duk_int32_t and duk_uint32_t are 64-bit). - * - * E5 Sections 11.10, 11.7.1, 11.7.2, 11.7.3 - */ - - duk_int32_t i1, i2, i3; - duk_uint32_t u1, u2, u3; -#if defined(DUK_USE_FASTINT) - duk_int64_t fi3; -#else - duk_double_t d3; -#endif - duk_small_uint_fast_t opcode_shifted; -#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE) - duk_tval *tv_z; -#endif - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_x != NULL); /* may be reg or const */ - DUK_ASSERT(tv_y != NULL); /* may be reg or const */ - DUK_ASSERT_DISABLE(idx_z >= 0); /* unsigned */ - DUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr)); - - opcode_shifted = opcode >> 2; /* Get base opcode without reg/const modifiers. */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { - i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_x); - i2 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_y); - } - else -#endif /* DUK_USE_FASTINT */ - { - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - i1 = duk_to_int32(thr, -2); - i2 = duk_to_int32(thr, -1); - duk_pop_2_unsafe(thr); - } - - switch (opcode_shifted) { - case DUK_OP_BAND >> 2: { - i3 = i1 & i2; - break; - } - case DUK_OP_BOR >> 2: { - i3 = i1 | i2; - break; - } - case DUK_OP_BXOR >> 2: { - i3 = i1 ^ i2; - break; - } - case DUK_OP_BASL >> 2: { - /* Signed shift, named "arithmetic" (asl) because the result - * is signed, e.g. 4294967295 << 1 -> -2. Note that result - * must be masked. - */ - - u2 = ((duk_uint32_t) i2) & 0xffffffffUL; - i3 = (duk_int32_t) (((duk_uint32_t) i1) << (u2 & 0x1fUL)); /* E5 Section 11.7.1, steps 7 and 8 */ - i3 = i3 & ((duk_int32_t) 0xffffffffUL); /* Note: left shift, should mask */ - break; - } - case DUK_OP_BASR >> 2: { - /* signed shift */ - - u2 = ((duk_uint32_t) i2) & 0xffffffffUL; - i3 = i1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */ - break; - } - case DUK_OP_BLSR >> 2: { - /* unsigned shift */ - - u1 = ((duk_uint32_t) i1) & 0xffffffffUL; - u2 = ((duk_uint32_t) i2) & 0xffffffffUL; - - /* special result value handling */ - u3 = u1 >> (u2 & 0x1fUL); /* E5 Section 11.7.2, steps 7 and 8 */ -#if defined(DUK_USE_FASTINT) - fi3 = (duk_int64_t) u3; - goto fastint_result_set; -#else - d3 = (duk_double_t) u3; - goto result_set; -#endif - } - default: { - DUK_UNREACHABLE(); - i3 = 0; /* should not happen */ - break; - } - } - -#if defined(DUK_USE_FASTINT) - /* Result is always fastint compatible. */ - /* XXX: Set 32-bit result (but must then handle signed and - * unsigned results separately). - */ - fi3 = (duk_int64_t) i3; - - fastint_result_set: - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, fi3); /* side effects */ -#else /* DUK_USE_FASTINT */ - d3 = (duk_double_t) i3; - - result_set: - DUK_ASSERT(!DUK_ISNAN(d3)); /* 'd3' is never NaN, so no need to normalize */ - DUK_ASSERT_DOUBLE_IS_NORMALIZED(d3); /* always normalized */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_push_number(thr, d3); /* would NaN normalize result, but unnecessary */ - duk_replace(thr, (duk_idx_t) idx_z); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - tv_z = thr->valstack_bottom + idx_z; - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, d3); /* side effects */ -#endif /* DUK_USE_EXEC_PREFER_SIZE */ -#endif /* DUK_USE_FASTINT */ -} - -/* In-place unary operation. */ -DUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_unary_op(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst, duk_small_uint_fast_t opcode) { - /* - * Arithmetic operations other than '+' have number-only semantics - * and are implemented here. The separate switch-case here means a - * "double dispatch" of the arithmetic opcode, but saves code space. - * - * E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3. - */ - - duk_tval *tv; - duk_double_t d1; - duk_double_union du; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(opcode == DUK_OP_UNM || opcode == DUK_OP_UNP); - DUK_ASSERT_DISABLE(idx_src >= 0); - DUK_ASSERT_DISABLE(idx_dst >= 0); - - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - duk_int64_t v1, v2; - - v1 = DUK_TVAL_GET_FASTINT(tv); - if (opcode == DUK_OP_UNM) { - /* The smallest fastint is no longer 48-bit when - * negated. Positive zero becames negative zero - * (cannot be represented) when negated. - */ - if (DUK_LIKELY(v1 != DUK_FASTINT_MIN && v1 != 0)) { - v2 = -v1; - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2); - return; - } - } else { - /* ToNumber() for a fastint is a no-op. */ - DUK_ASSERT(opcode == DUK_OP_UNP); - v2 = v1; - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2); - return; - } - /* fall through if overflow etc */ - } -#endif /* DUK_USE_FASTINT */ - - if (DUK_TVAL_IS_NUMBER(tv)) { - d1 = DUK_TVAL_GET_NUMBER(tv); - } else { - d1 = duk_to_number_tval(thr, tv); /* side effects */ - } - - if (opcode == DUK_OP_UNP) { - /* ToNumber() for a double is a no-op, but unary plus is - * used to force a fastint check so do that here. - */ - du.d = d1; - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); -#if defined(DUK_USE_FASTINT) - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF(thr, tv, du.d); /* always 'fast', i.e. inlined */ - return; -#endif - } else { - DUK_ASSERT(opcode == DUK_OP_UNM); - du.d = -d1; - DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); /* mandatory if du.d is a NaN */ - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - } - - /* XXX: size optimize: push+replace? */ - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv, du.d); -} - -DUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) { - /* - * E5 Section 11.4.8 - */ - - duk_tval *tv; - duk_int32_t i1, i2; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT_DISABLE(idx_src >= 0); - DUK_ASSERT_DISABLE(idx_dst >= 0); - DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr)); - DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr)); - - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - i1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv); - } - else -#endif /* DUK_USE_FASTINT */ - { - duk_push_tval(thr, tv); - i1 = duk_to_int32(thr, -1); /* side effects */ - duk_pop_unsafe(thr); - } - - /* Result is always fastint compatible. */ - i2 = ~i1; - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - DUK_TVAL_SET_I32_UPDREF(thr, tv, i2); /* side effects */ -} - -DUK_LOCAL DUK__INLINE_PERF void duk__vm_logical_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) { - /* - * E5 Section 11.4.9 - */ - - duk_tval *tv; - duk_bool_t res; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT_DISABLE(idx_src >= 0); - DUK_ASSERT_DISABLE(idx_dst >= 0); - DUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr)); - DUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr)); - - /* ToBoolean() does not require any operations with side effects so - * we can do it efficiently. For footprint it would be better to use - * duk_js_toboolean() and then push+replace to the result slot. - */ - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src); - res = duk_js_toboolean(tv); /* does not modify 'tv' */ - DUK_ASSERT(res == 0 || res == 1); - res ^= 1; - tv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst); - /* XXX: size optimize: push+replace? */ - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, res); /* side effects */ -} - -/* XXX: size optimized variant */ -DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_reg_helper(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_small_uint_t op) { - duk_double_t x, y, z; - - /* Two lowest bits of opcode are used to distinguish - * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCR & 0x03) == 0x00); - DUK_ASSERT((DUK_OP_PREDECR & 0x03) == 0x01); - DUK_ASSERT((DUK_OP_POSTINCR & 0x03) == 0x02); - DUK_ASSERT((DUK_OP_POSTDECR & 0x03) == 0x03); - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_src)) { - duk_int64_t x_fi, y_fi, z_fi; - x_fi = DUK_TVAL_GET_FASTINT(tv_src); - if (op & 0x01) { - if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MIN)) { - goto skip_fastint; - } - y_fi = x_fi - 1; - } else { - if (DUK_UNLIKELY(x_fi == DUK_FASTINT_MAX)) { - goto skip_fastint; - } - y_fi = x_fi + 1; - } - - DUK_TVAL_SET_FASTINT(tv_src, y_fi); /* no need for refcount update */ - - z_fi = (op & 0x02) ? x_fi : y_fi; - DUK_TVAL_SET_FASTINT_UPDREF(thr, tv_dst, z_fi); /* side effects */ - return; - } - skip_fastint: -#endif - if (DUK_TVAL_IS_NUMBER(tv_src)) { - /* Fast path for the case where the register - * is a number (e.g. loop counter). - */ - - x = DUK_TVAL_GET_NUMBER(tv_src); - if (op & 0x01) { - y = x - 1.0; - } else { - y = x + 1.0; - } - - DUK_TVAL_SET_NUMBER(tv_src, y); /* no need for refcount update */ - } else { - /* Preserve duk_tval pointer(s) across a potential valstack - * resize by converting them into offsets temporarily. - */ - duk_idx_t bc; - duk_size_t off_dst; - - off_dst = (duk_size_t) ((duk_uint8_t *) tv_dst - (duk_uint8_t *) thr->valstack_bottom); - bc = (duk_idx_t) (tv_src - thr->valstack_bottom); /* XXX: pass index explicitly? */ - tv_src = NULL; /* no longer referenced */ - - x = duk_to_number(thr, bc); - if (op & 0x01) { - y = x - 1.0; - } else { - y = x + 1.0; - } - - duk_push_number(thr, y); - duk_replace(thr, bc); - - tv_dst = (duk_tval *) (void *) (((duk_uint8_t *) thr->valstack_bottom) + off_dst); - } - - z = (op & 0x02) ? x : y; - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); /* side effects */ -} - -DUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_var_helper(duk_hthread *thr, duk_small_uint_t idx_dst, duk_tval *tv_id, duk_small_uint_t op, duk_small_uint_t is_strict) { - duk_activation *act; - duk_double_t x, y; - duk_hstring *name; - - /* XXX: The pre/post inc/dec for an identifier lookup is - * missing the important fast path where the identifier - * has a storage location e.g. in a scope object so that - * it can be updated in-place. In particular, the case - * where the identifier has a storage location AND the - * previous value is a number should be optimized because - * it's side effect free. - */ - - /* Two lowest bits of opcode are used to distinguish - * variants. Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCV & 0x03) == 0x00); - DUK_ASSERT((DUK_OP_PREDECV & 0x03) == 0x01); - DUK_ASSERT((DUK_OP_POSTINCV & 0x03) == 0x02); - DUK_ASSERT((DUK_OP_POSTDECV & 0x03) == 0x03); - - DUK_ASSERT(DUK_TVAL_IS_STRING(tv_id)); - name = DUK_TVAL_GET_STRING(tv_id); - DUK_ASSERT(name != NULL); - act = thr->callstack_curr; - (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [ ... val this ] */ - - /* XXX: Fastint fast path would be useful here. Also fastints - * now lose their fastint status in current handling which is - * not intuitive. - */ - - x = duk_to_number_m2(thr); - if (op & 0x01) { - y = x - 1.0; - } else { - y = x + 1.0; - } - - /* [... x this] */ - - if (op & 0x02) { - duk_push_number(thr, y); /* -> [ ... x this y ] */ - DUK_ASSERT(act == thr->callstack_curr); - duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict); - duk_pop_2_unsafe(thr); /* -> [ ... x ] */ - } else { - duk_pop_2_unsafe(thr); /* -> [ ... ] */ - duk_push_number(thr, y); /* -> [ ... y ] */ - DUK_ASSERT(act == thr->callstack_curr); - duk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict); - } - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_replace(thr, (duk_idx_t) idx_dst); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - DUK__REPLACE_TO_TVPTR(thr, DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst)); -#endif /* DUK_USE_EXEC_PREFER_SIZE */ -} - -/* - * Longjmp and other control flow transfer for the bytecode executor. - * - * The longjmp handler can handle all longjmp types: error, yield, and - * resume (pseudotypes are never actually thrown). - * - * Error policy for longjmp: should not ordinarily throw errors; if errors - * occur (e.g. due to out-of-memory) they bubble outwards rather than being - * handled recursively. - */ - -#define DUK__LONGJMP_RESTART 0 /* state updated, restart bytecode execution */ -#define DUK__LONGJMP_RETHROW 1 /* exit bytecode executor by rethrowing an error to caller */ - -#define DUK__RETHAND_RESTART 0 /* state updated, restart bytecode execution */ -#define DUK__RETHAND_FINISHED 1 /* exit bytecode execution with return value */ - -/* XXX: optimize reconfig valstack operations so that resize, clamp, and setting - * top are combined into one pass. - */ - -/* Reconfigure value stack for return to an Ecmascript function at - * callstack top (caller unwinds). - */ -DUK_LOCAL void duk__reconfig_valstack_ecma_return(duk_hthread *thr) { - duk_activation *act; - duk_hcompfunc *h_func; - duk_idx_t clamp_top; - - DUK_ASSERT(thr != NULL); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act))); - - /* Clamp so that values at 'clamp_top' and above are wiped and won't - * retain reachable garbage. Then extend to 'nregs' because we're - * returning to an Ecmascript function. - */ - - h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - - thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); - DUK_ASSERT(act->retval_byteoff >= act->bottom_byteoff); - clamp_top = (duk_idx_t) ((act->retval_byteoff - act->bottom_byteoff + sizeof(duk_tval)) / sizeof(duk_tval)); /* +1 = one retval */ - duk_set_top_and_wipe(thr, h_func->nregs, clamp_top); - - DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff); - thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff); - - /* XXX: a best effort shrink check would be OK here */ -} - -/* Reconfigure value stack for an Ecmascript catcher. Use topmost catcher - * in 'act'. - */ -DUK_LOCAL void duk__reconfig_valstack_ecma_catcher(duk_hthread *thr, duk_activation *act) { - duk_catcher *cat; - duk_hcompfunc *h_func; - duk_size_t idx_bottom; - duk_idx_t clamp_top; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act))); - cat = act->cat; - DUK_ASSERT(cat != NULL); - - h_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - - thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); - idx_bottom = (duk_size_t) (thr->valstack_bottom - thr->valstack); - DUK_ASSERT(cat->idx_base >= idx_bottom); - clamp_top = (duk_idx_t) (cat->idx_base - idx_bottom + 2); /* +2 = catcher value, catcher lj_type */ - duk_set_top_and_wipe(thr, h_func->nregs, clamp_top); - - DUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff); - thr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff); - - /* XXX: a best effort shrink check would be OK here */ -} - -/* Set catcher regs: idx_base+0 = value, idx_base+1 = lj_type. - * No side effects. - */ -DUK_LOCAL void duk__set_catcher_regs_norz(duk_hthread *thr, duk_catcher *cat, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { - duk_tval *tv1; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_val_unstable != NULL); - - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(tv1 < thr->valstack_top); - DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr, tv1, tv_val_unstable); - - tv1++; - DUK_ASSERT(tv1 == thr->valstack + cat->idx_base + 1); - DUK_ASSERT(tv1 < thr->valstack_top); - DUK_TVAL_SET_U32_UPDREF_NORZ(thr, tv1, (duk_uint32_t) lj_type); -} - -DUK_LOCAL void duk__handle_catch(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { - duk_activation *act; - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_val_unstable != NULL); - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - DUK_ASSERT(act->cat != NULL); - DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); - - duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - duk__reconfig_valstack_ecma_catcher(thr, act); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - cat = act->cat; - DUK_ASSERT(cat != NULL); - - act->curr_pc = cat->pc_base + 0; /* +0 = catch */ - - /* - * If entering a 'catch' block which requires an automatic - * catch variable binding, create the lexical environment. - * - * The binding is mutable (= writable) but not deletable. - * Step 4 for the catch production in E5 Section 12.14; - * no value is given for CreateMutableBinding 'D' argument, - * which implies the binding is not deletable. - */ - - if (DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)) { - duk_hdecenv *new_env; - - DUK_DDD(DUK_DDDPRINT("catcher has an automatic catch binding")); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - - if (act->lex_env == NULL) { - DUK_ASSERT(act->var_env == NULL); - DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); - - duk_js_init_activation_environment_records_delayed(thr, act); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - } - DUK_ASSERT(act->lex_env != NULL); - DUK_ASSERT(act->var_env != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); - - /* XXX: If an out-of-memory happens here, longjmp state asserts - * will be triggered at present and a try-catch fails to catch. - * That's not sandboxing fatal (C API protected calls are what - * matters), and script catch code can immediately throw anyway - * for almost any operation. - */ - new_env = duk_hdecenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); - DUK_ASSERT(new_env != NULL); - duk_push_hobject(thr, (duk_hobject *) new_env); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); - DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", (duk_heaphdr *) new_env)); - - /* Note: currently the catch binding is handled without a register - * binding because we don't support dynamic register bindings (they - * must be fixed for an entire function). So, there is no need to - * record regbases etc. - */ - - /* XXX: duk_xdef_prop() may cause an out-of-memory, see above. */ - DUK_ASSERT(cat->h_varname != NULL); - duk_push_hstring(thr, cat->h_varname); - duk_push_tval(thr, thr->valstack + cat->idx_base); - duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_W); /* writable, not configurable */ - - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act->lex_env); - act->lex_env = (duk_hobject *) new_env; - DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); /* reachable through activation */ - /* Net refcount change to act->lex_env is 0: incref for new_env's - * prototype, decref for act->lex_env overwrite. - */ - - DUK_CAT_SET_LEXENV_ACTIVE(cat); - - duk_pop_unsafe(thr); - - DUK_DDD(DUK_DDDPRINT("new_env finished: %!iO", (duk_heaphdr *) new_env)); - } - - DUK_CAT_CLEAR_CATCH_ENABLED(cat); -} - -DUK_LOCAL void duk__handle_finally(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) { - duk_activation *act; - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv_val_unstable != NULL); - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - DUK_ASSERT(act->cat != NULL); - DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); - - duk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - duk__reconfig_valstack_ecma_catcher(thr, act); - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - cat = act->cat; - DUK_ASSERT(cat != NULL); - - act->curr_pc = cat->pc_base + 1; /* +1 = finally */ - - DUK_CAT_CLEAR_FINALLY_ENABLED(cat); -} - -DUK_LOCAL void duk__handle_label(duk_hthread *thr, duk_small_uint_t lj_type) { - duk_activation *act; - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - - DUK_ASSERT(thr->callstack_top >= 1); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(DUK_ACT_GET_FUNC(act))); - - /* +0 = break, +1 = continue */ - cat = act->cat; - DUK_ASSERT(cat != NULL); - DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL); - - act->curr_pc = cat->pc_base + (lj_type == DUK_LJ_TYPE_CONTINUE ? 1 : 0); - - /* valstack should not need changes */ -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) == - (duk_size_t) ((duk_hcompfunc *) DUK_ACT_GET_FUNC(act))->nregs); -#endif -} - -/* Called for handling both a longjmp() with type DUK_LJ_TYPE_YIELD and - * when a RETURN opcode terminates a thread and yields to the resumer. - * Caller unwinds so that top of callstack is the activation we return to. - */ -#if defined(DUK_USE_COROUTINE_SUPPORT) -DUK_LOCAL void duk__handle_yield(duk_hthread *thr, duk_hthread *resumer, duk_tval *tv_val_unstable) { - duk_activation *act_resumer; - duk_tval *tv1; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(resumer != NULL); - DUK_ASSERT(tv_val_unstable != NULL); - act_resumer = resumer->callstack_curr; - DUK_ASSERT(act_resumer != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(act_resumer) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act_resumer))); /* resume caller must be an ecmascript func */ - - tv1 = (duk_tval *) (void *) ((duk_uint8_t *) resumer->valstack + act_resumer->retval_byteoff); /* return value from Duktape.Thread.resume() */ - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv_val_unstable); /* side effects */ /* XXX: avoid side effects */ - - duk__reconfig_valstack_ecma_return(resumer); - - /* caller must change active thread, and set thr->resumer to NULL */ -} -#endif /* DUK_USE_COROUTINE_SUPPORT */ - -DUK_LOCAL duk_small_uint_t duk__handle_longjmp(duk_hthread *thr, duk_activation *entry_act) { - duk_small_uint_t retval = DUK__LONGJMP_RESTART; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(entry_act != NULL); - - /* 'thr' is the current thread, as no-one resumes except us and we - * switch 'thr' in that case. - */ - DUK_ASSERT(thr == thr->heap->curr_thread); - - /* - * (Re)try handling the longjmp. - * - * A longjmp handler may convert the longjmp to a different type and - * "virtually" rethrow by goto'ing to 'check_longjmp'. Before the goto, - * the following must be updated: - * - the heap 'lj' state - * - 'thr' must reflect the "throwing" thread - */ - - check_longjmp: - - DUK_DD(DUK_DDPRINT("handling longjmp: type=%ld, value1=%!T, value2=%!T, iserror=%ld", - (long) thr->heap->lj.type, - (duk_tval *) &thr->heap->lj.value1, - (duk_tval *) &thr->heap->lj.value2, - (long) thr->heap->lj.iserror)); - - switch (thr->heap->lj.type) { - -#if defined(DUK_USE_COROUTINE_SUPPORT) - case DUK_LJ_TYPE_RESUME: { - /* - * Note: lj.value1 is 'value', lj.value2 is 'resumee'. - * This differs from YIELD. - */ - - duk_tval *tv; - duk_tval *tv2; - duk_hthread *resumee; - - /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */ - - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged by Duktape.Thread.resume() */ - DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL && - DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) && - ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_resume); - - tv = &thr->heap->lj.value2; /* resumee */ - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - DUK_ASSERT(DUK_TVAL_GET_OBJECT(tv) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_THREAD(DUK_TVAL_GET_OBJECT(tv))); - resumee = (duk_hthread *) DUK_TVAL_GET_OBJECT(tv); - - DUK_ASSERT(resumee != NULL); - DUK_ASSERT(resumee->resumer == NULL); - DUK_ASSERT(resumee->state == DUK_HTHREAD_STATE_INACTIVE || - resumee->state == DUK_HTHREAD_STATE_YIELDED); /* checked by Duktape.Thread.resume() */ - DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED || - resumee->callstack_top >= 2); /* YIELDED: Ecmascript activation + Duktape.Thread.yield() activation */ - DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED || - (DUK_ACT_GET_FUNC(resumee->callstack_curr) != NULL && - DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumee->callstack_curr)) && - ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumee->callstack_curr))->func == duk_bi_thread_yield)); - DUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_INACTIVE || - resumee->callstack_top == 0); /* INACTIVE: no activation, single function value on valstack */ - - if (thr->heap->lj.iserror) { - /* - * Throw the error in the resumed thread's context; the - * error value is pushed onto the resumee valstack. - * - * Note: the callstack of the target may empty in this case - * too (i.e. the target thread has never been resumed). The - * value stack will contain the initial function in that case, - * which we simply ignore. - */ - - DUK_ASSERT(resumee->resumer == NULL); - resumee->resumer = thr; - DUK_HTHREAD_INCREF(thr, thr); - resumee->state = DUK_HTHREAD_STATE_RUNNING; - thr->state = DUK_HTHREAD_STATE_RESUMED; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); - thr = resumee; - - thr->heap->lj.type = DUK_LJ_TYPE_THROW; - - /* thr->heap->lj.value1 is already the value to throw */ - /* thr->heap->lj.value2 is 'thread', will be wiped out at the end */ - - DUK_ASSERT(thr->heap->lj.iserror); /* already set */ - - DUK_DD(DUK_DDPRINT("-> resume with an error, converted to a throw in the resumee, propagate")); - goto check_longjmp; - } else if (resumee->state == DUK_HTHREAD_STATE_YIELDED) { - /* Unwind previous Duktape.Thread.yield() call. The - * activation remaining must always be an Ecmascript - * call now (yield() accepts calls from Ecmascript - * only). - */ - duk_activation *act_resumee; - - DUK_ASSERT(resumee->callstack_top >= 2); - act_resumee = resumee->callstack_curr; /* Duktape.Thread.yield() */ - DUK_ASSERT(act_resumee != NULL); - act_resumee = act_resumee->parent; /* Ecmascript call site for yield() */ - DUK_ASSERT(act_resumee != NULL); - - tv = (duk_tval *) (void *) ((duk_uint8_t *) resumee->valstack + act_resumee->retval_byteoff); /* return value from Duktape.Thread.yield() */ - DUK_ASSERT(tv >= resumee->valstack && tv < resumee->valstack_top); - tv2 = &thr->heap->lj.value1; - DUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv2); /* side effects */ /* XXX: avoid side effects */ - - duk_hthread_activation_unwind_norz(resumee); /* unwind to 'yield' caller */ - /* no need to unwind catch stack */ - - duk__reconfig_valstack_ecma_return(resumee); - - DUK_ASSERT(resumee->resumer == NULL); - resumee->resumer = thr; - DUK_HTHREAD_INCREF(thr, thr); - resumee->state = DUK_HTHREAD_STATE_RUNNING; - thr->state = DUK_HTHREAD_STATE_RESUMED; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); -#if 0 - thr = resumee; /* not needed, as we exit right away */ -#endif - DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee")); - retval = DUK__LONGJMP_RESTART; - goto wipe_and_return; - } else { - /* Initial resume call. */ - duk_small_uint_t call_flags; - duk_int_t setup_rc; - - /* resumee: [... initial_func] (currently actually: [initial_func]) */ - - duk_push_undefined(resumee); - tv = &thr->heap->lj.value1; - duk_push_tval(resumee, tv); - - /* resumee: [... initial_func undefined(= this) resume_value ] */ - - call_flags = DUK_CALL_FLAG_ALLOW_ECMATOECMA; /* not tailcall, ecma-to-ecma (assumed to succeed) */ - - setup_rc = duk_handle_call_unprotected_nargs(resumee, 1 /*nargs*/, call_flags); - if (setup_rc == 0) { - /* This shouldn't happen; Duktape.Thread.resume() - * should make sure of that. If it does happen - * this internal error will propagate out of the - * executor which can be quite misleading. - */ - DUK_ERROR_INTERNAL(thr); - } - - DUK_ASSERT(resumee->resumer == NULL); - resumee->resumer = thr; - DUK_HTHREAD_INCREF(thr, thr); - resumee->state = DUK_HTHREAD_STATE_RUNNING; - thr->state = DUK_HTHREAD_STATE_RESUMED; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumee); -#if 0 - thr = resumee; /* not needed, as we exit right away */ -#endif - DUK_DD(DUK_DDPRINT("-> resume with a value, restart execution in resumee")); - retval = DUK__LONGJMP_RESTART; - goto wipe_and_return; - } - DUK_UNREACHABLE(); - break; /* never here */ - } - - case DUK_LJ_TYPE_YIELD: { - /* - * Currently only allowed only if yielding thread has only - * Ecmascript activations (except for the Duktape.Thread.yield() - * call at the callstack top) and none of them constructor - * calls. - * - * This excludes the 'entry' thread which will always have - * a preventcount > 0. - */ - - duk_hthread *resumer; - - /* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */ - -#if 0 /* entry_thread not available for assert */ - DUK_ASSERT(thr != entry_thread); /* Duktape.Thread.yield() should prevent */ -#endif - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); /* unchanged from Duktape.Thread.yield() */ - DUK_ASSERT(thr->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.yield() activation */ - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL && - DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) && - ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_yield); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL && - DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* an Ecmascript function */ - - resumer = thr->resumer; - - DUK_ASSERT(resumer != NULL); - DUK_ASSERT(resumer->state == DUK_HTHREAD_STATE_RESUMED); /* written by a previous RESUME handling */ - DUK_ASSERT(resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ - DUK_ASSERT(resumer->callstack_curr != NULL); - DUK_ASSERT(resumer->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr) != NULL && - DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr)) && - ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumer->callstack_curr))->func == duk_bi_thread_resume); - DUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent) != NULL && - DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent))); /* an Ecmascript function */ - - if (thr->heap->lj.iserror) { - thr->state = DUK_HTHREAD_STATE_YIELDED; - thr->resumer = NULL; - DUK_HTHREAD_DECREF_NORZ(thr, resumer); - resumer->state = DUK_HTHREAD_STATE_RUNNING; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); - thr = resumer; - - thr->heap->lj.type = DUK_LJ_TYPE_THROW; - /* lj.value1 is already set */ - DUK_ASSERT(thr->heap->lj.iserror); /* already set */ - - DUK_DD(DUK_DDPRINT("-> yield an error, converted to a throw in the resumer, propagate")); - goto check_longjmp; - } else { - duk_hthread_activation_unwind_norz(resumer); - duk__handle_yield(thr, resumer, &thr->heap->lj.value1); - - thr->state = DUK_HTHREAD_STATE_YIELDED; - thr->resumer = NULL; - DUK_HTHREAD_DECREF_NORZ(thr, resumer); - resumer->state = DUK_HTHREAD_STATE_RUNNING; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); -#if 0 - thr = resumer; /* not needed, as we exit right away */ -#endif - - DUK_DD(DUK_DDPRINT("-> yield a value, restart execution in resumer")); - retval = DUK__LONGJMP_RESTART; - goto wipe_and_return; - } - DUK_UNREACHABLE(); - break; /* never here */ - } -#endif /* DUK_USE_COROUTINE_SUPPORT */ - - case DUK_LJ_TYPE_THROW: { - /* - * Three possible outcomes: - * * A try or finally catcher is found => resume there. - * (or) - * * The error propagates to the bytecode executor entry - * level (and we're in the entry thread) => rethrow - * with a new longjmp(), after restoring the previous - * catchpoint. - * * The error is not caught in the current thread, so - * the thread finishes with an error. This works like - * a yielded error, except that the thread is finished - * and can no longer be resumed. (There is always a - * resumer in this case.) - * - * Note: until we hit the entry level, there can only be - * Ecmascript activations. - */ - - duk_activation *act; - duk_catcher *cat; - duk_hthread *resumer; - - for (;;) { - act = thr->callstack_curr; - if (act == NULL) { - break; - } - - for (;;) { - cat = act->cat; - if (cat == NULL) { - break; - } - - if (DUK_CAT_HAS_CATCH_ENABLED(cat)) { - DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF); - - duk__handle_catch(thr, - &thr->heap->lj.value1, - DUK_LJ_TYPE_THROW); - - DUK_DD(DUK_DDPRINT("-> throw caught by a 'catch' clause, restart execution")); - retval = DUK__LONGJMP_RESTART; - goto wipe_and_return; - } - - if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF); - DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); - - duk__handle_finally(thr, - &thr->heap->lj.value1, - DUK_LJ_TYPE_THROW); - - DUK_DD(DUK_DDPRINT("-> throw caught by a 'finally' clause, restart execution")); - retval = DUK__LONGJMP_RESTART; - goto wipe_and_return; - } - - duk_hthread_catcher_unwind_norz(thr, act); - } - - if (act == entry_act) { - /* Not caught by anything before entry level; rethrow and let the - * final catcher finish unwinding (esp. value stack). - */ - DUK_D(DUK_DPRINT("-> throw propagated up to entry level, rethrow and exit bytecode executor")); - retval = DUK__LONGJMP_RETHROW; - goto just_return; - } - - duk_hthread_activation_unwind_norz(thr); - } - - DUK_DD(DUK_DDPRINT("-> throw not caught by current thread, yield error to resumer and recheck longjmp")); - - /* Not caught by current thread, thread terminates (yield error to resumer); - * note that this may cause a cascade if the resumer terminates with an uncaught - * exception etc (this is OK, but needs careful testing). - */ - - DUK_ASSERT(thr->resumer != NULL); - DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ - DUK_ASSERT(thr->resumer->callstack_curr != NULL); - DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL && - DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */ - - resumer = thr->resumer; - - /* reset longjmp */ - - DUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW); /* already set */ - /* lj.value1 already set */ - - duk_hthread_terminate(thr); /* updates thread state, minimizes its allocations */ - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED); - - thr->resumer = NULL; - DUK_HTHREAD_DECREF_NORZ(thr, resumer); - resumer->state = DUK_HTHREAD_STATE_RUNNING; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); - thr = resumer; - goto check_longjmp; - } - - case DUK_LJ_TYPE_BREAK: /* pseudotypes, not used in actual longjmps */ - case DUK_LJ_TYPE_CONTINUE: - case DUK_LJ_TYPE_RETURN: - case DUK_LJ_TYPE_NORMAL: - default: { - /* should never happen, but be robust */ - DUK_D(DUK_DPRINT("caught unknown longjmp type %ld, treat as internal error", (long) thr->heap->lj.type)); - goto convert_to_internal_error; - } - - } /* end switch */ - - DUK_UNREACHABLE(); - - wipe_and_return: - /* this is not strictly necessary, but helps debugging */ - thr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN; - thr->heap->lj.iserror = 0; - - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value1); /* side effects */ - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value2); /* side effects */ - - DUK_GC_TORTURE(thr->heap); - - just_return: - return retval; - - convert_to_internal_error: - /* This could also be thrown internally (set the error, goto check_longjmp), - * but it's better for internal errors to bubble outwards so that we won't - * infinite loop in this catchpoint. - */ - DUK_ERROR_INTERNAL(thr); - DUK_UNREACHABLE(); - return retval; -} - -/* Handle a BREAK/CONTINUE opcode. Avoid using longjmp() for BREAK/CONTINUE - * handling because it has a measurable performance impact in ordinary - * environments and an extreme impact in Emscripten (GH-342). - */ -DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_break_or_continue(duk_hthread *thr, - duk_uint_t label_id, - duk_small_uint_t lj_type) { - duk_activation *act; - duk_catcher *cat; - - DUK_ASSERT(thr != NULL); - - /* Find a matching label catcher or 'finally' catcher in - * the same function, unwinding catchers as we go. - * - * A label catcher must always exist and will match unless - * a 'finally' captures the break/continue first. It is the - * compiler's responsibility to ensure that labels are used - * correctly. - */ - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - - for (;;) { - cat = act->cat; - if (cat == NULL) { - break; - } - - DUK_DDD(DUK_DDDPRINT("considering catcher %p: type=%ld label=%ld", - (void *) cat, - (long) DUK_CAT_GET_TYPE(cat), - (long) DUK_CAT_GET_LABEL(cat))); - - /* XXX: bit mask test; FINALLY <-> TCF, single bit mask would suffice? */ - - if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF && - DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - duk_tval tv_tmp; - - DUK_TVAL_SET_U32(&tv_tmp, (duk_uint32_t) label_id); - duk__handle_finally(thr, &tv_tmp, lj_type); - - DUK_DD(DUK_DDPRINT("-> break/continue caught by 'finally', restart execution")); - return; - } - if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL && - (duk_uint_t) DUK_CAT_GET_LABEL(cat) == label_id) { - duk__handle_label(thr, lj_type); - - DUK_DD(DUK_DDPRINT("-> break/continue caught by a label catcher (in the same function), restart execution")); - return; - } - - duk_hthread_catcher_unwind_norz(thr, act); - } - - /* Should never happen, but be robust. */ - DUK_D(DUK_DPRINT("-> break/continue not caught by anything in the current function (should never happen), throw internal error")); - DUK_ERROR_INTERNAL(thr); - return; -} - -/* Handle a RETURN opcode. Avoid using longjmp() for return handling because - * it has a measurable performance impact in ordinary environments and an extreme - * impact in Emscripten (GH-342). Return value is on value stack top. - */ -DUK_LOCAL duk_small_uint_t duk__handle_return(duk_hthread *thr, duk_activation *entry_act) { - duk_tval *tv1; - duk_tval *tv2; -#if defined(DUK_USE_COROUTINE_SUPPORT) - duk_hthread *resumer; -#endif - duk_activation *act; - duk_catcher *cat; - - /* We can directly access value stack here. */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(entry_act != NULL); - DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); - tv1 = thr->valstack_top - 1; - DUK_TVAL_CHKFAST_INPLACE_FAST(tv1); /* fastint downgrade check for return values */ - - /* - * Four possible outcomes: - * - * 1. A 'finally' in the same function catches the 'return'. - * It may continue to propagate when 'finally' is finished, - * or it may be neutralized by 'finally' (both handled by - * ENDFIN). - * - * 2. The return happens at the entry level of the bytecode - * executor, so return from the executor (in C stack). - * - * 3. There is a calling (Ecmascript) activation in the call - * stack => return to it, in the same executor instance. - * - * 4. There is no calling activation, and the thread is - * terminated. There is always a resumer in this case, - * which gets the return value similarly to a 'yield' - * (except that the current thread can no longer be - * resumed). - */ - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->callstack_top >= 1); - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - - for (;;) { - cat = act->cat; - if (cat == NULL) { - break; - } - - if (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF && - DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); - duk__handle_finally(thr, thr->valstack_top - 1, DUK_LJ_TYPE_RETURN); - - DUK_DD(DUK_DDPRINT("-> return caught by 'finally', restart execution")); - return DUK__RETHAND_RESTART; - } - - duk_hthread_catcher_unwind_norz(thr, act); - } - - if (act == entry_act) { - /* Return to the bytecode executor caller who will unwind stacks - * and handle constructor post-processing. - * Return value is already on the stack top: [ ... retval ]. - */ - - DUK_DDD(DUK_DDDPRINT("-> return propagated up to entry level, exit bytecode executor")); - return DUK__RETHAND_FINISHED; - } - - if (thr->callstack_top >= 2) { - /* There is a caller; it MUST be an Ecmascript caller (otherwise it would - * match entry_act check). - */ - DUK_DDD(DUK_DDDPRINT("return to Ecmascript caller, retval_byteoff=%ld, lj_value1=%!T", - (long) (thr->callstack_curr->parent->retval_byteoff), - (duk_tval *) &thr->heap->lj.value1)); - - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(thr->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent))); /* must be ecmascript */ - -#if defined(DUK_USE_ES6_PROXY) - if (thr->callstack_curr->flags & (DUK_ACT_FLAG_CONSTRUCT | DUK_ACT_FLAG_CONSTRUCT_PROXY)) { - duk_call_construct_postprocess(thr, thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY); /* side effects */ - } -#else - if (thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT) { - duk_call_construct_postprocess(thr, 0); /* side effects */ - } -#endif - - tv1 = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + thr->callstack_curr->parent->retval_byteoff); - DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); - tv2 = thr->valstack_top - 1; - DUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2); /* side effects */ - - /* Catch stack unwind happens inline in callstack unwind. */ - duk_hthread_activation_unwind_norz(thr); - - duk__reconfig_valstack_ecma_return(thr); - - DUK_DD(DUK_DDPRINT("-> return not intercepted, restart execution in caller")); - return DUK__RETHAND_RESTART; - } - -#if defined(DUK_USE_COROUTINE_SUPPORT) - DUK_DD(DUK_DDPRINT("no calling activation, thread finishes (similar to yield)")); - - DUK_ASSERT(thr->resumer != NULL); - DUK_ASSERT(thr->resumer->callstack_top >= 2); /* Ecmascript activation + Duktape.Thread.resume() activation */ - DUK_ASSERT(thr->resumer->callstack_curr != NULL); - DUK_ASSERT(thr->resumer->callstack_curr->parent != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr) != NULL && - DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr)) && - ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->resumer->callstack_curr))->func == duk_bi_thread_resume); /* Duktape.Thread.resume() */ - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL && - DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent))); /* an Ecmascript function */ - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING); - DUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED); - - resumer = thr->resumer; - - /* Share yield longjmp handler. - * - * This sequence of steps is a bit fragile (see GH-1845): - * - We need the return value from 'thr' (resumed thread) value stack. - * The termination unwinds its value stack, losing the value. - * - We need a refcounted reference for 'thr', which may only exist - * in the caller value stack. We can't unwind or reconfigure the - * caller's value stack without potentially freeing 'thr'. - * - * Current approach is to capture the 'thr' return value and store - * a reference to 'thr' in the caller value stack temporarily. This - * keeps 'thr' reachable until final yield/return handling which - * removes the references atomatically. - */ - - DUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom); - duk_hthread_activation_unwind_norz(resumer); /* May remove last reference to 'thr', but is NORZ. */ - duk_push_tval(resumer, thr->valstack_top - 1); /* Capture return value, side effect free. */ - duk_push_hthread(resumer, thr); /* Make 'thr' reachable again, before side effects. */ - - duk_hthread_terminate(thr); /* Updates thread state, minimizes its allocations. */ - thr->resumer = NULL; - DUK_HTHREAD_DECREF(thr, resumer); - DUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED); - - resumer->state = DUK_HTHREAD_STATE_RUNNING; - DUK_HEAP_SWITCH_THREAD(thr->heap, resumer); - - DUK_ASSERT(resumer->valstack_top - 2 >= resumer->valstack_bottom); - duk__handle_yield(thr, resumer, resumer->valstack_top - 2); - thr = NULL; /* 'thr' invalidated by call */ - -#if 0 - thr = resumer; /* not needed */ -#endif - - DUK_DD(DUK_DDPRINT("-> return not caught, thread terminated; handle like yield, restart execution in resumer")); - return DUK__RETHAND_RESTART; -#else - /* Without coroutine support this case should never happen. */ - DUK_ERROR_INTERNAL(thr); - return DUK__RETHAND_FINISHED; /* not executed */ -#endif -} - -/* - * Executor interrupt handling - * - * The handler is called whenever the interrupt countdown reaches zero - * (or below). The handler must perform whatever checks are activated, - * e.g. check for cumulative step count to impose an execution step - * limit or check for breakpoints or other debugger interaction. - * - * When the actions are done, the handler must reinit the interrupt - * init and counter values. The 'init' value must indicate how many - * bytecode instructions are executed before the next interrupt. The - * counter must interface with the bytecode executor loop. Concretely, - * the new init value is normally one higher than the new counter value. - * For instance, to execute exactly one bytecode instruction the init - * value is set to 1 and the counter to 0. If an error is thrown by the - * interrupt handler, the counters are set to the same value (e.g. both - * to 0 to cause an interrupt when the next bytecode instruction is about - * to be executed after error handling). - * - * Maintaining the init/counter value properly is important for accurate - * behavior. For instance, executor step limit needs a cumulative step - * count which is simply computed as a sum of 'init' values. This must - * work accurately even when single stepping. - */ - -#if defined(DUK_USE_INTERRUPT_COUNTER) - -#define DUK__INT_NOACTION 0 /* no specific action, resume normal execution */ -#define DUK__INT_RESTART 1 /* must "goto restart_execution", e.g. breakpoints changed */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_immediate, duk_small_uint_t *out_interrupt_retval) { - duk_activation *act; - duk_breakpoint *bp; - duk_breakpoint **bp_active; - duk_uint_fast32_t line = 0; - duk_bool_t process_messages; - duk_bool_t processed_messages = 0; - - DUK_ASSERT(thr->heap->dbg_processing == 0); /* don't re-enter e.g. during Eval */ - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - - /* It might seem that replacing 'thr->heap' with just 'heap' below - * might be a good idea, but it increases code size slightly - * (probably due to unnecessary spilling) at least on x64. - */ - - /* - * Single opcode step check - */ - - if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by one opcode step")); - duk_debug_set_paused(thr->heap); - } - - /* - * Breakpoint and step state checks - */ - - if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE || - (thr->heap->dbg_pause_act == thr->callstack_curr)) { - line = duk_debug_curr_line(thr); - - if (act->prev_line != line) { - /* Stepped? Step out is handled by callstack unwind. */ - if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && - (thr->heap->dbg_pause_act == thr->callstack_curr) && - (line != thr->heap->dbg_pause_startline)) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by line change, at line %ld", - (long) line)); - duk_debug_set_paused(thr->heap); - } - - /* Check for breakpoints only on line transition. - * Breakpoint is triggered when we enter the target - * line from a different line, and the previous line - * was within the same function. - * - * This condition is tricky: the condition used to be - * that transition to -or across- the breakpoint line - * triggered the breakpoint. This seems intuitively - * better because it handles breakpoints on lines with - * no emitted opcodes; but this leads to the issue - * described in: https://github.com/svaarala/duktape/issues/263. - */ - bp_active = thr->heap->dbg_breakpoints_active; - for (;;) { - bp = *bp_active++; - if (bp == NULL) { - break; - } - - DUK_ASSERT(bp->filename != NULL); - if (act->prev_line != bp->line && line == bp->line) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by breakpoint at %!O:%ld", - (duk_heaphdr *) bp->filename, (long) bp->line)); - duk_debug_set_paused(thr->heap); - } - } - } else { - ; - } - - act->prev_line = (duk_uint32_t) line; - } - - /* - * Rate limit check for sending status update or peeking into - * the debug transport. Both can be expensive operations that - * we don't want to do on every opcode. - * - * Making sure the interval remains reasonable on a wide variety - * of targets and bytecode is difficult without a timestamp, so - * we use a Date-provided timestamp for the rate limit check. - * But since it's also expensive to get a timestamp, a bytecode - * counter is used to rate limit getting timestamps. - */ - - process_messages = 0; - if (thr->heap->dbg_state_dirty || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->dbg_detaching) { - /* Enter message processing loop for sending Status notifys and - * to finish a pending detach. - */ - process_messages = 1; - } - - /* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */ - DUK_ASSERT(thr->interrupt_init >= 0); - thr->heap->dbg_exec_counter += (duk_uint_t) thr->interrupt_init; - if (thr->heap->dbg_exec_counter - thr->heap->dbg_last_counter >= DUK_HEAP_DBG_RATELIMIT_OPCODES) { - /* Overflow of the execution counter is fine and doesn't break - * anything here. - */ - - duk_double_t now, diff_last; - - thr->heap->dbg_last_counter = thr->heap->dbg_exec_counter; - now = duk_time_get_monotonic_time(thr); - - diff_last = now - thr->heap->dbg_last_time; - if (diff_last < 0.0 || diff_last >= (duk_double_t) DUK_HEAP_DBG_RATELIMIT_MILLISECS) { - /* Monotonic time should not experience time jumps, - * but the provider may be missing and we're actually - * using Ecmascript time. So, tolerate negative values - * so that a time jump works reasonably. - * - * Same interval is now used for status sending and - * peeking. - */ - - thr->heap->dbg_last_time = now; - thr->heap->dbg_state_dirty = 1; - process_messages = 1; - } - } - - /* - * Process messages and send status if necessary. - * - * If we're paused, we'll block for new messages. If we're not - * paused, we'll process anything we can peek but won't block - * for more. Detach (and re-attach) handling is all localized - * to duk_debug_process_messages() too. - * - * Debugger writes outside the message loop may cause debugger - * detach1 phase to run, after which dbg_read_cb == NULL and - * dbg_detaching != 0. The message loop will finish the detach - * by running detach2 phase, so enter the message loop also when - * detaching. - */ - - if (process_messages) { - DUK_ASSERT(thr->heap->dbg_processing == 0); - processed_messages = duk_debug_process_messages(thr, 0 /*no_block*/); - DUK_ASSERT(thr->heap->dbg_processing == 0); - } - - /* Continue checked execution if there are breakpoints or we're stepping. - * Also use checked execution if paused flag is active - it shouldn't be - * because the debug message loop shouldn't terminate if it was. Step out - * is handled by callstack unwind and doesn't need checked execution. - * Note that debugger may have detached due to error or explicit request - * above, so we must recheck attach status. - */ - - if (duk_debug_is_attached(thr->heap)) { - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - if (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE || - (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) || - ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && - thr->heap->dbg_pause_act == thr->callstack_curr) || - DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) { - *out_immediate = 1; - } - - /* If we processed any debug messages breakpoints may have - * changed; restart execution to re-check active breakpoints. - */ - if (processed_messages) { - DUK_D(DUK_DPRINT("processed debug messages, restart execution to recheck possibly changed breakpoints")); - *out_interrupt_retval = DUK__INT_RESTART; - } else { - if (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) { - /* Set 'pause after one opcode' active only when we're - * actually just about to execute code. - */ - thr->heap->dbg_pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE; - } - } - } else { - DUK_D(DUK_DPRINT("debugger became detached, resume normal execution")); - } -} -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -DUK_LOCAL DUK__NOINLINE_PERF DUK_COLD duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) { - duk_int_t ctr; - duk_activation *act; - duk_hcompfunc *fun; - duk_bool_t immediate = 0; - duk_small_uint_t retval; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->heap != NULL); - DUK_ASSERT(thr->callstack_top > 0); - -#if defined(DUK_USE_DEBUG) - thr->heap->inst_count_interrupt += thr->interrupt_init; - DUK_DD(DUK_DDPRINT("execution interrupt, counter=%ld, init=%ld, " - "instruction counts: executor=%ld, interrupt=%ld", - (long) thr->interrupt_counter, (long) thr->interrupt_init, - (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt)); -#endif - - retval = DUK__INT_NOACTION; - ctr = DUK_HTHREAD_INTCTR_DEFAULT; - - /* - * Avoid nested calls. Concretely this happens during debugging, e.g. - * when we eval() an expression. - * - * Also don't interrupt if we're currently doing debug processing - * (which can be initiated outside the bytecode executor) as this - * may cause the debugger to be called recursively. Check required - * for correct operation of throw intercept and other "exotic" halting - * scenarios. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap) || thr->heap->dbg_processing) { -#else - if (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap)) { -#endif - DUK_DD(DUK_DDPRINT("nested executor interrupt, ignoring")); - - /* Set a high interrupt counter; the original executor - * interrupt invocation will rewrite before exiting. - */ - thr->interrupt_init = ctr; - thr->interrupt_counter = ctr - 1; - return DUK__INT_NOACTION; - } - DUK_HEAP_SET_INTERRUPT_RUNNING(thr->heap); - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - - fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC((duk_hobject *) fun)); - - DUK_UNREF(fun); - -#if defined(DUK_USE_EXEC_TIMEOUT_CHECK) - /* - * Execution timeout check - */ - - if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->heap->heap_udata)) { - /* Keep throwing an error whenever we get here. The unusual values - * are set this way because no instruction is ever executed, we just - * throw an error until all try/catch/finally and other catchpoints - * have been exhausted. Duktape/C code gets control at each protected - * call but whenever it enters back into Duktape the RangeError gets - * raised. User exec timeout check must consistently indicate a timeout - * until we've fully bubbled out of Duktape. - */ - DUK_D(DUK_DPRINT("execution timeout, throwing a RangeError")); - thr->interrupt_init = 0; - thr->interrupt_counter = 0; - DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap); - DUK_ERROR_RANGE(thr, "execution timeout"); - } -#endif /* DUK_USE_EXEC_TIMEOUT_CHECK */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (!thr->heap->dbg_processing && - (thr->heap->dbg_read_cb != NULL || thr->heap->dbg_detaching)) { - /* Avoid recursive re-entry; enter when we're attached or - * detaching (to finish off the pending detach). - */ - duk__interrupt_handle_debugger(thr, &immediate, &retval); - DUK_ASSERT(act == thr->callstack_curr); - } -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - - /* - * Update the interrupt counter - */ - - if (immediate) { - /* Cause an interrupt after executing one instruction. */ - ctr = 1; - } - - /* The counter value is one less than the init value: init value should - * indicate how many instructions are executed before interrupt. To - * execute 1 instruction (after interrupt handler return), counter must - * be 0. - */ - DUK_ASSERT(ctr >= 1); - thr->interrupt_init = ctr; - thr->interrupt_counter = ctr - 1; - DUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap); - - return retval; -} -#endif /* DUK_USE_INTERRUPT_COUNTER */ - -/* - * Debugger handling for executor restart - * - * Check for breakpoints, stepping, etc, and figure out if we should execute - * in checked or normal mode. Note that we can't do this when an activation - * is created, because breakpoint status (and stepping status) may change - * later, so we must recheck every time we're executing an activation. - * This primitive should be side effect free to avoid changes during check. - */ - -#if defined(DUK_USE_DEBUGGER_SUPPORT) -DUK_LOCAL void duk__executor_recheck_debugger(duk_hthread *thr, duk_activation *act, duk_hcompfunc *fun) { - duk_heap *heap; - duk_tval *tv_tmp; - duk_hstring *filename; - duk_small_uint_t bp_idx; - duk_breakpoint **bp_active; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(fun != NULL); - - heap = thr->heap; - bp_active = heap->dbg_breakpoints_active; - act->flags &= ~DUK_ACT_FLAG_BREAKPOINT_ACTIVE; - - tv_tmp = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) fun, DUK_HTHREAD_STRING_FILE_NAME(thr)); - if (tv_tmp && DUK_TVAL_IS_STRING(tv_tmp)) { - filename = DUK_TVAL_GET_STRING(tv_tmp); - - /* Figure out all active breakpoints. A breakpoint is - * considered active if the current function's fileName - * matches the breakpoint's fileName, AND there is no - * inner function that has matching line numbers - * (otherwise a breakpoint would be triggered both - * inside and outside of the inner function which would - * be confusing). Example: - * - * function foo() { - * print('foo'); - * function bar() { <-. breakpoints in these - * print('bar'); | lines should not affect - * } <-' foo() execution - * bar(); - * } - * - * We need a few things that are only available when - * debugger support is enabled: (1) a line range for - * each function, and (2) access to the function - * template to access the inner functions (and their - * line ranges). - * - * It's important to have a narrow match for active - * breakpoints so that we don't enter checked execution - * when that's not necessary. For instance, if we're - * running inside a certain function and there's - * breakpoint outside in (after the call site), we - * don't want to slow down execution of the function. - */ - - for (bp_idx = 0; bp_idx < heap->dbg_breakpoint_count; bp_idx++) { - duk_breakpoint *bp = heap->dbg_breakpoints + bp_idx; - duk_hobject **funcs, **funcs_end; - duk_hcompfunc *inner_fun; - duk_bool_t bp_match; - - if (bp->filename == filename && - bp->line >= fun->start_line && bp->line <= fun->end_line) { - bp_match = 1; - DUK_DD(DUK_DDPRINT("breakpoint filename and line match: " - "%s:%ld vs. %s (line %ld vs. %ld-%ld)", - DUK_HSTRING_GET_DATA(bp->filename), - (long) bp->line, - DUK_HSTRING_GET_DATA(filename), - (long) bp->line, - (long) fun->start_line, - (long) fun->end_line)); - - funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun); - funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, fun); - while (funcs != funcs_end) { - inner_fun = (duk_hcompfunc *) *funcs; - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) inner_fun)); - if (bp->line >= inner_fun->start_line && bp->line <= inner_fun->end_line) { - DUK_DD(DUK_DDPRINT("inner function masks ('captures') breakpoint")); - bp_match = 0; - break; - } - funcs++; - } - - if (bp_match) { - /* No need to check for size of bp_active list, - * it's always larger than maximum number of - * breakpoints. - */ - act->flags |= DUK_ACT_FLAG_BREAKPOINT_ACTIVE; - *bp_active = heap->dbg_breakpoints + bp_idx; - bp_active++; - } - } - } - } - - *bp_active = NULL; /* terminate */ - - DUK_DD(DUK_DDPRINT("ACTIVE BREAKPOINTS: %ld", (long) (bp_active - thr->heap->dbg_breakpoints_active))); - - /* Force pause if we were doing "step into" in another activation. */ - if ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) && - thr->heap->dbg_pause_act != thr->callstack_curr) { - DUK_D(DUK_DPRINT("PAUSE TRIGGERED by function entry")); - duk_debug_set_paused(thr->heap); - } - - /* Force interrupt right away if we're paused or in "checked mode". - * Step out is handled by callstack unwind. - */ - if ((act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE) || - DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || - ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) && - thr->heap->dbg_pause_act == thr->callstack_curr)) { - /* We'll need to interrupt early so recompute the init - * counter to reflect the number of bytecode instructions - * executed so that step counts for e.g. debugger rate - * limiting are accurate. - */ - DUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init); - thr->interrupt_init = thr->interrupt_init - thr->interrupt_counter; - thr->interrupt_counter = 0; - } -} -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -/* - * Opcode handlers for opcodes with a lot of code and which are relatively - * rare; NOINLINE to reduce amount of code in main bytecode dispatcher. - */ - -DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initset_initget(duk_hthread *thr, duk_uint_fast32_t ins) { - duk_bool_t is_set = (DUK_DEC_OP(ins) == DUK_OP_INITSET); - duk_uint_fast_t idx; - duk_uint_t defprop_flags; - - /* A -> object register (acts as a source) - * BC -> BC+0 contains key, BC+1 closure (value) - */ - - /* INITSET/INITGET are only used to initialize object literal keys. - * There may be a previous propery in ES2015 because duplicate property - * names are allowed. - */ - - /* This could be made more optimal by accessing internals directly. */ - - idx = (duk_uint_fast_t) DUK_DEC_BC(ins); - duk_dup(thr, (duk_idx_t) (idx + 0)); /* key */ - duk_dup(thr, (duk_idx_t) (idx + 1)); /* getter/setter */ - if (is_set) { - defprop_flags = DUK_DEFPROP_HAVE_SETTER | - DUK_DEFPROP_FORCE | - DUK_DEFPROP_SET_ENUMERABLE | - DUK_DEFPROP_SET_CONFIGURABLE; - } else { - defprop_flags = DUK_DEFPROP_HAVE_GETTER | - DUK_DEFPROP_FORCE | - DUK_DEFPROP_SET_ENUMERABLE | - DUK_DEFPROP_SET_CONFIGURABLE; - } - duk_def_prop(thr, (duk_idx_t) DUK_DEC_A(ins), defprop_flags); -} - -DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_trycatch(duk_hthread *thr, duk_uint_fast32_t ins, duk_instr_t *curr_pc) { - duk_activation *act; - duk_catcher *cat; - duk_tval *tv1; - duk_small_uint_fast_t a; - duk_small_uint_fast_t bc; - - /* A -> flags - * BC -> reg_catch; base register for two registers used both during - * trycatch setup and when catch is triggered - * - * If DUK_BC_TRYCATCH_FLAG_CATCH_BINDING set: - * reg_catch + 0: catch binding variable name (string). - * Automatic declarative environment is established for - * the duration of the 'catch' clause. - * - * If DUK_BC_TRYCATCH_FLAG_WITH_BINDING set: - * reg_catch + 0: with 'target value', which is coerced to - * an object and then used as a bindind object for an - * environment record. The binding is initialized here, for - * the 'try' clause. - * - * Note that a TRYCATCH generated for a 'with' statement has no - * catch or finally parts. - */ - - /* XXX: TRYCATCH handling should be reworked to avoid creating - * an explicit scope unless it is actually needed (e.g. function - * instances or eval is executed inside the catch block). This - * rework is not trivial because the compiler doesn't have an - * intermediate representation. When the rework is done, the - * opcode format can also be made more straightforward. - */ - - /* XXX: side effect handling is quite awkward here */ - - DUK_DDD(DUK_DDDPRINT("TRYCATCH: reg_catch=%ld, have_catch=%ld, " - "have_finally=%ld, catch_binding=%ld, with_binding=%ld (flags=0x%02lx)", - (long) DUK_DEC_BC(ins), - (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH ? 1 : 0), - (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY ? 1 : 0), - (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING ? 1 : 0), - (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_WITH_BINDING ? 1 : 0), - (unsigned long) DUK_DEC_A(ins))); - - a = DUK_DEC_A(ins); - bc = DUK_DEC_BC(ins); - - /* Registers 'bc' and 'bc + 1' are written in longjmp handling - * and if their previous values (which are temporaries) become - * unreachable -and- have a finalizer, there'll be a function - * call during error handling which is not supported now (GH-287). - * Ensure that both 'bc' and 'bc + 1' have primitive values to - * guarantee no finalizer calls in error handling. Scrubbing also - * ensures finalizers for the previous values run here rather than - * later. Error handling related values are also written to 'bc' - * and 'bc + 1' but those values never become unreachable during - * error handling, so there's no side effect problem even if the - * error value has a finalizer. - */ - duk_dup(thr, (duk_idx_t) bc); /* Stabilize value. */ - duk_to_undefined(thr, (duk_idx_t) bc); - duk_to_undefined(thr, (duk_idx_t) (bc + 1)); - - /* Allocate catcher and populate it. Doesn't have to - * be fully atomic, but the catcher must be in a - * consistent state if side effects (such as finalizer - * calls) occur. - */ - - cat = duk_hthread_catcher_alloc(thr); - DUK_ASSERT(cat != NULL); - - cat->flags = DUK_CAT_TYPE_TCF; - cat->h_varname = NULL; - cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ - cat->idx_base = (duk_size_t) (thr->valstack_bottom - thr->valstack) + bc; - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - cat->parent = act->cat; - act->cat = cat; - - if (a & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) { - cat->flags |= DUK_CAT_FLAG_CATCH_ENABLED; - } - if (a & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) { - cat->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; - } - if (a & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING) { - DUK_DDD(DUK_DDDPRINT("catch binding flag set to catcher")); - cat->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; - tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - - /* borrowed reference; although 'tv1' comes from a register, - * its value was loaded using LDCONST so the constant will - * also exist and be reachable. - */ - cat->h_varname = DUK_TVAL_GET_STRING(tv1); - } else if (a & DUK_BC_TRYCATCH_FLAG_WITH_BINDING) { - duk_hobjenv *env; - duk_hobject *target; - - /* Delayed env initialization for activation (if needed). */ - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - if (act->lex_env == NULL) { - DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); - DUK_ASSERT(act->var_env == NULL); - - duk_js_init_activation_environment_records_delayed(thr, act); - DUK_ASSERT(act == thr->callstack_curr); - DUK_UNREF(act); /* 'act' is no longer accessed, scanbuild fix */ - } - DUK_ASSERT(act->lex_env != NULL); - DUK_ASSERT(act->var_env != NULL); - - /* Coerce 'with' target. */ - target = duk_to_hobject(thr, -1); - DUK_ASSERT(target != NULL); - - /* Create an object environment; it is not pushed - * so avoid side effects very carefully until it is - * referenced. - */ - env = duk_hobjenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV)); - DUK_ASSERT(env != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); - env->target = target; /* always provideThis=true */ - DUK_HOBJECT_INCREF(thr, target); - env->has_this = 1; - DUK_ASSERT_HOBJENV_VALID(env); - DUK_DDD(DUK_DDDPRINT("environment for with binding: %!iO", env)); - - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); - DUK_ASSERT(act->lex_env != NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, act->lex_env); - act->lex_env = (duk_hobject *) env; /* Now reachable. */ - DUK_HOBJECT_INCREF(thr, (duk_hobject *) env); - /* Net refcount change to act->lex_env is 0: incref for env's - * prototype, decref for act->lex_env overwrite. - */ - - /* Set catcher lex_env active (affects unwind) - * only when the whole setup is complete. - */ - cat = act->cat; /* XXX: better to relookup? not mandatory because 'cat' is stable */ - cat->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; - } else { - ; - } - - DUK_DDD(DUK_DDDPRINT("TRYCATCH catcher: flags=0x%08lx, pc_base=%ld, " - "idx_base=%ld, h_varname=%!O", - (unsigned long) cat->flags, - (long) cat->pc_base, (long) cat->idx_base, (duk_heaphdr *) cat->h_varname)); - - duk_pop_unsafe(thr); -} - -DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endtry(duk_hthread *thr, duk_uint_fast32_t ins) { - duk_activation *act; - duk_catcher *cat; - duk_tval *tv1; - duk_instr_t *pc_base; - - DUK_UNREF(ins); - - DUK_ASSERT(thr->callstack_top >= 1); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - cat = act->cat; - DUK_ASSERT(cat != NULL); - DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF); - - DUK_DDD(DUK_DDDPRINT("ENDTRY: clearing catch active flag (regardless of whether it was set or not)")); - DUK_CAT_CLEAR_CATCH_ENABLED(cat); - - pc_base = cat->pc_base; - - if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_DDD(DUK_DDDPRINT("ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'")); - - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - tv1 = NULL; - - tv1 = thr->valstack + cat->idx_base + 1; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ - tv1 = NULL; - - DUK_CAT_CLEAR_FINALLY_ENABLED(cat); - } else { - DUK_DDD(DUK_DDDPRINT("ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); - - duk_hthread_catcher_unwind_norz(thr, act); /* lexenv may be set for 'with' binding */ - /* no need to unwind callstack */ - } - - return pc_base + 1; /* new curr_pc value */ -} - -DUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endcatch(duk_hthread *thr, duk_uint_fast32_t ins) { - duk_activation *act; - duk_catcher *cat; - duk_tval *tv1; - duk_instr_t *pc_base; - - DUK_UNREF(ins); - - DUK_ASSERT(thr->callstack_top >= 1); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - cat = act->cat; - DUK_ASSERT(cat != NULL); - DUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat)); /* cleared before entering catch part */ - - if (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) { - duk_hobject *prev_env; - - /* 'with' binding has no catch clause, so can't be here unless a normal try-catch */ - DUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)); - DUK_ASSERT(act->lex_env != NULL); - - DUK_DDD(DUK_DDDPRINT("ENDCATCH: popping catcher part lexical environment")); - - prev_env = act->lex_env; - DUK_ASSERT(prev_env != NULL); - act->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env); - DUK_CAT_CLEAR_LEXENV_ACTIVE(cat); - DUK_HOBJECT_INCREF(thr, act->lex_env); - DUK_HOBJECT_DECREF(thr, prev_env); /* side effects */ - - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - } - - pc_base = cat->pc_base; - - if (DUK_CAT_HAS_FINALLY_ENABLED(cat)) { - DUK_DDD(DUK_DDDPRINT("ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'")); - - tv1 = thr->valstack + cat->idx_base; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - tv1 = NULL; - - tv1 = thr->valstack + cat->idx_base + 1; - DUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top); - DUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL); /* side effects */ - tv1 = NULL; - - DUK_CAT_CLEAR_FINALLY_ENABLED(cat); - } else { - DUK_DDD(DUK_DDDPRINT("ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)")); - - duk_hthread_catcher_unwind_norz(thr, act); - /* no need to unwind callstack */ - } - - return pc_base + 1; /* new curr_pc value */ -} - -DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_endfin(duk_hthread *thr, duk_uint_fast32_t ins, duk_activation *entry_act) { - duk_activation *act; - duk_tval *tv1; - duk_uint_t reg_catch; - duk_small_uint_t cont_type; - duk_small_uint_t ret_result; - - DUK_ASSERT(thr->ptr_curr_pc == NULL); - DUK_ASSERT(thr->callstack_top >= 1); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - reg_catch = DUK_DEC_ABC(ins); - - /* CATCH flag may be enabled or disabled here; it may be enabled if - * the statement has a catch block but the try block does not throw - * an error. - */ - - DUK_DDD(DUK_DDDPRINT("ENDFIN: completion value=%!T, type=%!T", - (duk_tval *) (thr->valstack_bottom + reg_catch + 0), - (duk_tval *) (thr->valstack_bottom + reg_catch + 1))); - - tv1 = thr->valstack_bottom + reg_catch + 1; /* type */ - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - cont_type = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); -#else - cont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - - tv1--; /* value */ - - switch (cont_type) { - case DUK_LJ_TYPE_NORMAL: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> " - "dismantle catcher, resume execution after ENDFIN")); - - duk_hthread_catcher_unwind_norz(thr, act); - /* no need to unwind callstack */ - return 0; /* restart execution */ - } - case DUK_LJ_TYPE_RETURN: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with 'return' complation -> dismantle " - "catcher, handle return, lj.value1=%!T", tv1)); - - /* Not necessary to unwind catch stack: return handling will - * do it. The finally flag of 'cat' is no longer set. The - * catch flag may be set, but it's not checked by return handling. - */ - - duk_push_tval(thr, tv1); - ret_result = duk__handle_return(thr, entry_act); - if (ret_result == DUK__RETHAND_RESTART) { - return 0; /* restart execution */ - } - DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); - - DUK_DDD(DUK_DDDPRINT("exiting executor after ENDFIN and RETURN (pseudo) longjmp type")); - return 1; /* exit executor */ - } - case DUK_LJ_TYPE_BREAK: - case DUK_LJ_TYPE_CONTINUE: { - duk_uint_t label_id; - duk_small_uint_t lj_type; - - /* Not necessary to unwind catch stack: break/continue - * handling will do it. The finally flag of 'cat' is - * no longer set. The catch flag may be set, but it's - * not checked by break/continue handling. - */ - - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - label_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1); -#else - label_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - lj_type = cont_type; - duk__handle_break_or_continue(thr, label_id, lj_type); - return 0; /* restart execution */ - } - default: { - DUK_DDD(DUK_DDDPRINT("ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> " - "dismantle catcher, re-throw error", - (long) cont_type)); - - duk_err_setup_ljstate1(thr, (duk_small_uint_t) cont_type, tv1); - /* No debugger Throw notify check on purpose (rethrow). */ - - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ - duk_err_longjmp(thr); - DUK_UNREACHABLE(); - } - } - - DUK_UNREACHABLE(); - return 0; -} - -DUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initenum(duk_hthread *thr, duk_uint_fast32_t ins) { - duk_small_uint_t b; - duk_small_uint_t c; - - /* - * Enumeration semantics come from for-in statement, E5 Section 12.6.4. - * If called with 'null' or 'undefined', this opcode returns 'null' as - * the enumerator, which is special cased in NEXTENUM. This simplifies - * the compiler part - */ - - /* B -> register for writing enumerator object - * C -> value to be enumerated (register) - */ - b = DUK_DEC_B(ins); - c = DUK_DEC_C(ins); - - if (duk_is_null_or_undefined(thr, (duk_idx_t) c)) { - duk_push_null(thr); - duk_replace(thr, (duk_idx_t) b); - } else { - duk_dup(thr, (duk_idx_t) c); - duk_to_object(thr, -1); - duk_hobject_enumerator_create(thr, 0 /*enum_flags*/); /* [ ... val ] --> [ ... enum ] */ - duk_replace(thr, (duk_idx_t) b); - } -} - -DUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_nextenum(duk_hthread *thr, duk_uint_fast32_t ins) { - duk_small_uint_t b; - duk_small_uint_t c; - duk_small_uint_t pc_skip = 0; - - /* - * NEXTENUM checks whether the enumerator still has unenumerated - * keys. If so, the next key is loaded to the target register - * and the next instruction is skipped. Otherwise the next instruction - * will be executed, jumping out of the enumeration loop. - */ - - /* B -> target register for next key - * C -> enum register - */ - b = DUK_DEC_B(ins); - c = DUK_DEC_C(ins); - - DUK_DDD(DUK_DDDPRINT("NEXTENUM: b->%!T, c->%!T", - (duk_tval *) duk_get_tval(thr, (duk_idx_t) b), - (duk_tval *) duk_get_tval(thr, (duk_idx_t) c))); - - if (duk_is_object(thr, (duk_idx_t) c)) { - /* XXX: assert 'c' is an enumerator */ - duk_dup(thr, (duk_idx_t) c); - if (duk_hobject_enumerator_next(thr, 0 /*get_value*/)) { - /* [ ... enum ] -> [ ... next_key ] */ - DUK_DDD(DUK_DDDPRINT("enum active, next key is %!T, skip jump slot ", - (duk_tval *) duk_get_tval(thr, -1))); - pc_skip = 1; - } else { - /* [ ... enum ] -> [ ... ] */ - DUK_DDD(DUK_DDDPRINT("enum finished, execute jump slot")); - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ - thr->valstack_top++; - } - duk_replace(thr, (duk_idx_t) b); - } else { - /* 'null' enumerator case -> behave as with an empty enumerator */ - DUK_ASSERT(duk_is_null(thr, (duk_idx_t) c)); - DUK_DDD(DUK_DDDPRINT("enum is null, execute jump slot")); - } - - return pc_skip; -} - -/* - * Call handling helpers. - */ - -DUK_LOCAL duk_bool_t duk__executor_handle_call(duk_hthread *thr, duk_idx_t idx, duk_idx_t nargs, duk_small_uint_t call_flags) { - duk_bool_t rc; - - duk_set_top_unsafe(thr, (duk_idx_t) (idx + nargs + 2)); /* [ ... func this arg1 ... argN ] */ - - /* Attempt an Ecma-to-Ecma call setup. If the call - * target is (directly or indirectly) Reflect.construct(), - * the call may change into a constructor call on the fly. - */ - rc = (duk_bool_t) duk_handle_call_unprotected(thr, idx, call_flags); - if (rc != 0) { - /* Ecma-to-ecma call possible, may or may not - * be a tail call. Avoid C recursion by - * reusing current executor instance. - */ - DUK_DDD(DUK_DDDPRINT("ecma-to-ecma call setup possible, restart execution")); - /* curr_pc synced by duk_handle_call_unprotected() */ - DUK_ASSERT(thr->ptr_curr_pc == NULL); - return rc; - } else { - /* Call was handled inline. */ - } - DUK_ASSERT(thr->ptr_curr_pc != NULL); - return rc; -} - -/* - * Ecmascript bytecode executor. - * - * Resume execution for the current thread from its current activation. - * Returns when execution would return from the entry level activation, - * leaving a single return value on top of the stack. Function calls - * and thread resumptions are handled internally. If an error occurs, - * a longjmp() with type DUK_LJ_TYPE_THROW is called on the entry level - * setjmp() jmpbuf. - * - * Ecmascript function calls and coroutine resumptions are handled - * internally (by the outer executor function) without recursive C calls. - * Other function calls are handled using duk_handle_call(), increasing - * C recursion depth. - * - * Abrupt completions (= long control tranfers) are handled either - * directly by reconfiguring relevant stacks and restarting execution, - * or via a longjmp. Longjmp-free handling is preferable for performance - * (especially Emscripten performance), and is used for: break, continue, - * and return. - * - * For more detailed notes, see doc/execution.rst. - * - * Also see doc/code-issues.rst for discussion of setjmp(), longjmp(), - * and volatile. - */ - -/* Presence of 'fun' is config based, there's a marginal performance - * difference and the best option is architecture dependent. - */ -#if defined(DUK_USE_EXEC_FUN_LOCAL) -#define DUK__FUN() fun -#else -#define DUK__FUN() ((duk_hcompfunc *) DUK_ACT_GET_FUNC((thr)->callstack_curr)) -#endif - -/* Strict flag. */ -#define DUK__STRICT() ((duk_small_uint_t) DUK_HOBJECT_HAS_STRICT((duk_hobject *) DUK__FUN())) - -/* Reg/const access macros: these are very footprint and performance sensitive - * so modify with care. Arguments are sometimes evaluated multiple times which - * is not ideal. - */ -#define DUK__REG(x) (*(thr->valstack_bottom + (x))) -#define DUK__REGP(x) (thr->valstack_bottom + (x)) -#define DUK__CONST(x) (*(consts + (x))) -#define DUK__CONSTP(x) (consts + (x)) - -/* Reg/const access macros which take the 32-bit instruction and avoid an - * explicit field decoding step by using shifts and masks. These must be - * kept in sync with duk_js_bytecode.h. The shift/mask values are chosen - * so that 'ins' can be shifted and masked and used as a -byte- offset - * instead of a duk_tval offset which needs further shifting (which is an - * issue on some, but not all, CPUs). - */ -#define DUK__RCBIT_B DUK_BC_REGCONST_B -#define DUK__RCBIT_C DUK_BC_REGCONST_C -#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE) -#if defined(DUK_USE_PACKED_TVAL) -#define DUK__TVAL_SHIFT 3 /* sizeof(duk_tval) == 8 */ -#else -#define DUK__TVAL_SHIFT 4 /* sizeof(duk_tval) == 16; not always the case so also asserted for */ -#endif -#define DUK__SHIFT_A (DUK_BC_SHIFT_A - DUK__TVAL_SHIFT) -#define DUK__SHIFT_B (DUK_BC_SHIFT_B - DUK__TVAL_SHIFT) -#define DUK__SHIFT_C (DUK_BC_SHIFT_C - DUK__TVAL_SHIFT) -#define DUK__SHIFT_BC (DUK_BC_SHIFT_BC - DUK__TVAL_SHIFT) -#define DUK__MASK_A (DUK_BC_UNSHIFTED_MASK_A << DUK__TVAL_SHIFT) -#define DUK__MASK_B (DUK_BC_UNSHIFTED_MASK_B << DUK__TVAL_SHIFT) -#define DUK__MASK_C (DUK_BC_UNSHIFTED_MASK_C << DUK__TVAL_SHIFT) -#define DUK__MASK_BC (DUK_BC_UNSHIFTED_MASK_BC << DUK__TVAL_SHIFT) -#define DUK__BYTEOFF_A(ins) (((ins) >> DUK__SHIFT_A) & DUK__MASK_A) -#define DUK__BYTEOFF_B(ins) (((ins) >> DUK__SHIFT_B) & DUK__MASK_B) -#define DUK__BYTEOFF_C(ins) (((ins) >> DUK__SHIFT_C) & DUK__MASK_C) -#define DUK__BYTEOFF_BC(ins) (((ins) >> DUK__SHIFT_BC) & DUK__MASK_BC) - -#define DUK__REGP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_A((ins)))) -#define DUK__REGP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_B((ins)))) -#define DUK__REGP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_C((ins)))) -#define DUK__REGP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_BC((ins)))) -#define DUK__CONSTP_A(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_A((ins)))) -#define DUK__CONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_B((ins)))) -#define DUK__CONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_C((ins)))) -#define DUK__CONSTP_BC(ins) ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_BC((ins)))) -#define DUK__REGCONSTP_B(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_B((ins)))) -#define DUK__REGCONSTP_C(ins) ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_C((ins)))) -#else /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ -/* Safe alternatives, no assumption about duk_tval size. */ -#define DUK__REGP_A(ins) DUK__REGP(DUK_DEC_A((ins))) -#define DUK__REGP_B(ins) DUK__REGP(DUK_DEC_B((ins))) -#define DUK__REGP_C(ins) DUK__REGP(DUK_DEC_C((ins))) -#define DUK__REGP_BC(ins) DUK__REGP(DUK_DEC_BC((ins))) -#define DUK__CONSTP_A(ins) DUK__CONSTP(DUK_DEC_A((ins))) -#define DUK__CONSTP_B(ins) DUK__CONSTP(DUK_DEC_B((ins))) -#define DUK__CONSTP_C(ins) DUK__CONSTP(DUK_DEC_C((ins))) -#define DUK__CONSTP_BC(ins) DUK__CONSTP(DUK_DEC_BC((ins))) -#define DUK__REGCONSTP_B(ins) ((((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK_DEC_B((ins))) -#define DUK__REGCONSTP_C(ins) ((((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK_DEC_C((ins))) -#endif /* DUK_USE_EXEC_REGCONST_OPTIMIZE */ - -#if defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS) -#define DUK__INTERNAL_ERROR(msg) do { \ - DUK_ERROR_ERROR(thr, (msg)); \ - } while (0) -#else -#define DUK__INTERNAL_ERROR(msg) do { \ - goto internal_error; \ - } while (0) -#endif - -#define DUK__SYNC_CURR_PC() do { \ - duk_activation *duk__act; \ - duk__act = thr->callstack_curr; \ - duk__act->curr_pc = curr_pc; \ - } while (0) -#define DUK__SYNC_AND_NULL_CURR_PC() do { \ - duk_activation *duk__act; \ - duk__act = thr->callstack_curr; \ - duk__act->curr_pc = curr_pc; \ - thr->ptr_curr_pc = NULL; \ - } while (0) - -#if defined(DUK_USE_EXEC_PREFER_SIZE) -#define DUK__LOOKUP_INDIRECT(idx) do { \ - (idx) = (duk_uint_fast_t) duk_get_uint(thr, (duk_idx_t) (idx)); \ - } while (0) -#elif defined(DUK_USE_FASTINT) -#define DUK__LOOKUP_INDIRECT(idx) do { \ - duk_tval *tv_ind; \ - tv_ind = DUK__REGP((idx)); \ - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \ - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_ind)); /* compiler guarantees */ \ - (idx) = (duk_uint_fast_t) DUK_TVAL_GET_FASTINT_U32(tv_ind); \ - } while (0) -#else -#define DUK__LOOKUP_INDIRECT(idx) do { \ - duk_tval *tv_ind; \ - tv_ind = DUK__REGP(idx); \ - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \ - idx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); \ - } while (0) -#endif - -DUK_LOCAL void duk__handle_executor_error(duk_heap *heap, - duk_activation *entry_act, - duk_int_t entry_call_recursion_depth, - duk_jmpbuf *entry_jmpbuf_ptr) { - duk_small_uint_t lj_ret; - - /* Longjmp callers are required to sync-and-null thr->ptr_curr_pc - * before longjmp. - */ - DUK_ASSERT(heap->curr_thread != NULL); - DUK_ASSERT(heap->curr_thread->ptr_curr_pc == NULL); - - /* XXX: signalling the need to shrink check (only if unwound) */ - - /* Must be restored here to handle e.g. yields properly. */ - heap->call_recursion_depth = entry_call_recursion_depth; - - /* Switch to caller's setjmp() catcher so that if an error occurs - * during error handling, it is always propagated outwards instead - * of causing an infinite loop in our own handler. - */ - heap->lj.jmpbuf_ptr = (duk_jmpbuf *) entry_jmpbuf_ptr; - - lj_ret = duk__handle_longjmp(heap->curr_thread, entry_act); - - /* Error handling complete, remove side effect protections. - */ -#if defined(DUK_USE_ASSERTIONS) - DUK_ASSERT(heap->error_not_allowed == 1); - heap->error_not_allowed = 0; -#endif - DUK_ASSERT(heap->pf_prevent_count > 0); - heap->pf_prevent_count--; - DUK_DD(DUK_DDPRINT("executor error handled, pf_prevent_count updated to %ld", (long) heap->pf_prevent_count)); - - if (lj_ret == DUK__LONGJMP_RESTART) { - /* Restart bytecode execution, possibly with a changed thread. */ - DUK_REFZERO_CHECK_SLOW(heap->curr_thread); - } else { - /* If an error is propagated, don't run refzero checks here. - * The next catcher will deal with that. Pf_prevent_count - * will be re-bumped by the longjmp. - */ - - DUK_ASSERT(lj_ret == DUK__LONGJMP_RETHROW); /* Rethrow error to calling state. */ - DUK_ASSERT(heap->lj.jmpbuf_ptr == entry_jmpbuf_ptr); /* Longjmp handling has restored jmpbuf_ptr. */ - - /* Thread may have changed, e.g. YIELD converted to THROW. */ - duk_err_longjmp(heap->curr_thread); - DUK_UNREACHABLE(); - } -} - -/* Outer executor with setjmp/longjmp handling. */ -DUK_INTERNAL void duk_js_execute_bytecode(duk_hthread *exec_thr) { - /* Entry level info. */ - duk_hthread *entry_thread; - duk_activation *entry_act; - duk_int_t entry_call_recursion_depth; - duk_jmpbuf *entry_jmpbuf_ptr; - duk_jmpbuf our_jmpbuf; - duk_heap *heap; - - DUK_ASSERT(exec_thr != NULL); - DUK_ASSERT(exec_thr->heap != NULL); - DUK_ASSERT(exec_thr->heap->curr_thread != NULL); - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR((duk_heaphdr *) exec_thr); - DUK_ASSERT(exec_thr->callstack_top >= 1); /* at least one activation, ours */ - DUK_ASSERT(exec_thr->callstack_curr != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(exec_thr->callstack_curr) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(exec_thr->callstack_curr))); - - DUK_GC_TORTURE(exec_thr->heap); - - entry_thread = exec_thr; - heap = entry_thread->heap; - entry_act = entry_thread->callstack_curr; - DUK_ASSERT(entry_act != NULL); - entry_call_recursion_depth = entry_thread->heap->call_recursion_depth; - entry_jmpbuf_ptr = entry_thread->heap->lj.jmpbuf_ptr; - - /* - * Note: we currently assume that the setjmp() catchpoint is - * not re-entrant (longjmp() cannot be called more than once - * for a single setjmp()). - * - * See doc/code-issues.rst for notes on variable assignment - * before and after setjmp(). - */ - - for (;;) { - heap->lj.jmpbuf_ptr = &our_jmpbuf; - DUK_ASSERT(heap->lj.jmpbuf_ptr != NULL); - -#if defined(DUK_USE_CPP_EXCEPTIONS) - try { -#else - DUK_ASSERT(heap->lj.jmpbuf_ptr == &our_jmpbuf); - if (DUK_SETJMP(our_jmpbuf.jb) == 0) { -#endif - /* Execute bytecode until returned or longjmp(). */ - duk__js_execute_bytecode_inner(entry_thread, entry_act); - - /* Successful return: restore jmpbuf and return to caller. */ - heap->lj.jmpbuf_ptr = entry_jmpbuf_ptr; - - return; -#if defined(DUK_USE_CPP_EXCEPTIONS) - } catch (duk_internal_exception &exc) { -#else - } else { -#endif -#if defined(DUK_USE_CPP_EXCEPTIONS) - DUK_UNREF(exc); -#endif - DUK_DDD(DUK_DDDPRINT("longjmp caught by bytecode executor")); - DUK_STATS_INC(exec_thr->heap, stats_exec_throw); - - duk__handle_executor_error(heap, - entry_act, - entry_call_recursion_depth, - entry_jmpbuf_ptr); - } -#if defined(DUK_USE_CPP_EXCEPTIONS) - catch (std::exception &exc) { - const char *what = exc.what(); - if (!what) { - what = "unknown"; - } - DUK_D(DUK_DPRINT("unexpected c++ std::exception (perhaps thrown by user code)")); - DUK_STATS_INC(exec_thr->heap, stats_exec_throw); - try { - DUK_ASSERT(heap->curr_thread != NULL); - DUK_ERROR_FMT1(heap->curr_thread, DUK_ERR_TYPE_ERROR, "caught invalid c++ std::exception '%s' (perhaps thrown by user code)", what); - } catch (duk_internal_exception exc) { - DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ std::exception")); - DUK_UNREF(exc); - duk__handle_executor_error(heap, - entry_act, - entry_call_recursion_depth, - entry_jmpbuf_ptr); - } - } catch (...) { - DUK_D(DUK_DPRINT("unexpected c++ exception (perhaps thrown by user code)")); - DUK_STATS_INC(exec_thr->heap, stats_exec_throw); - try { - DUK_ASSERT(heap->curr_thread != NULL); - DUK_ERROR_TYPE(heap->curr_thread, "caught invalid c++ exception (perhaps thrown by user code)"); - } catch (duk_internal_exception exc) { - DUK_D(DUK_DPRINT("caught api error thrown from unexpected c++ exception")); - DUK_UNREF(exc); - duk__handle_executor_error(heap, - entry_act, - entry_call_recursion_depth, - entry_jmpbuf_ptr); - } - } -#endif - } - - DUK_UNREACHABLE(); -} - -/* Inner executor, performance critical. */ -DUK_LOCAL DUK_NOINLINE DUK_HOT void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act) { - /* Current PC, accessed by other functions through thr->ptr_to_curr_pc. - * Critical for performance. It would be safest to make this volatile, - * but that eliminates performance benefits; aliasing guarantees - * should be enough though. - */ - duk_instr_t *curr_pc; /* bytecode has a stable pointer */ - - /* Hot variables for interpretation. Critical for performance, - * but must add sparingly to minimize register shuffling. - */ - duk_hthread *thr; /* stable */ - duk_tval *consts; /* stable */ - duk_uint_fast32_t ins; - /* 'funcs' is quite rarely used, so no local for it */ -#if defined(DUK_USE_EXEC_FUN_LOCAL) - duk_hcompfunc *fun; -#else - /* 'fun' is quite rarely used, so no local for it */ -#endif - -#if defined(DUK_USE_INTERRUPT_COUNTER) - duk_int_t int_ctr; -#endif - -#if defined(DUK_USE_ASSERTIONS) - duk_size_t valstack_top_base; /* valstack top, should match before interpreting each op (no leftovers) */ -#endif - - /* Optimized reg/const access macros assume sizeof(duk_tval) to be - * either 8 or 16. Heap allocation checks this even without asserts - * enabled now because it can't be autodetected in duk_config.h. - */ -#if 1 -#if defined(DUK_USE_PACKED_TVAL) - DUK_ASSERT(sizeof(duk_tval) == 8); -#else - DUK_ASSERT(sizeof(duk_tval) == 16); -#endif -#endif - - DUK_GC_TORTURE(entry_thread->heap); - - /* - * Restart execution by reloading thread state. - * - * Note that 'thr' and any thread configuration may have changed, - * so all local variables are suspect and we need to reinitialize. - * - * The number of local variables should be kept to a minimum: if - * the variables are spilled, they will need to be loaded from - * memory anyway. - * - * Any 'goto restart_execution;' code path in opcode dispatch must - * ensure 'curr_pc' is synced back to act->curr_pc before the goto - * takes place. - * - * The interpreter must be very careful with memory pointers, as - * many pointers are not guaranteed to be 'stable' and may be - * reallocated and relocated on-the-fly quite easily (e.g. by a - * memory allocation or a property access). - * - * The following are assumed to have stable pointers: - * - the current thread - * - the current function - * - the bytecode, constant table, inner function table of the - * current function (as they are a part of the function allocation) - * - * The following are assumed to have semi-stable pointers: - * - the current activation entry: stable as long as callstack - * is not changed (reallocated by growing or shrinking), or - * by any garbage collection invocation (through finalizers) - * - Note in particular that ANY DECREF can invalidate the - * activation pointer, so for the most part a fresh lookup - * is required - * - * The following are not assumed to have stable pointers at all: - * - the value stack (registers) of the current thread - * - * See execution.rst for discussion. - */ - - restart_execution: - - /* Lookup current thread; use the stable 'entry_thread' for this to - * avoid clobber warnings. Any valid, reachable 'thr' value would be - * fine for this, so using 'entry_thread' is just to silence warnings. - */ - thr = entry_thread->heap->curr_thread; - DUK_ASSERT(thr != NULL); - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->callstack_curr != NULL); - DUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr))); - - DUK_GC_TORTURE(thr->heap); - - thr->ptr_curr_pc = &curr_pc; - - /* Relookup and initialize dispatch loop variables. Debugger check. */ - { - duk_activation *act; -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - duk_hcompfunc *fun; -#endif - - /* Assume interrupt init/counter are properly initialized here. */ - /* Assume that thr->valstack_bottom has been set-up before getting here. */ - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - fun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - DUK_ASSERT(fun != NULL); - DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == fun->nregs); - consts = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, fun); - DUK_ASSERT(consts != NULL); - -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (DUK_UNLIKELY(duk_debug_is_attached(thr->heap) && !thr->heap->dbg_processing)) { - duk__executor_recheck_debugger(thr, act, fun); - DUK_ASSERT(act == thr->callstack_curr); - DUK_ASSERT(act != NULL); - } -#endif /* DUK_USE_DEBUGGER_SUPPORT */ - -#if defined(DUK_USE_ASSERTIONS) - valstack_top_base = (duk_size_t) (thr->valstack_top - thr->valstack); -#endif - - /* Set up curr_pc for opcode dispatch. */ - curr_pc = act->curr_pc; - } - - DUK_DD(DUK_DDPRINT("restarting execution, thr %p, act idx %ld, fun %p," - "consts %p, funcs %p, lev %ld, regbot %ld, regtop %ld, " - "preventcount=%ld", - (void *) thr, - (long) (thr->callstack_top - 1), - (void *) DUK__FUN(), - (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, DUK__FUN()), - (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, DUK__FUN()), - (long) (thr->callstack_top - 1), - (long) (thr->valstack_bottom - thr->valstack), - (long) (thr->valstack_top - thr->valstack), - (long) thr->callstack_preventcount)); - - /* Dispatch loop. */ - - for (;;) { - duk_uint8_t op; - - DUK_ASSERT(thr->callstack_top >= 1); - DUK_ASSERT(thr->valstack_top - thr->valstack_bottom == DUK__FUN()->nregs); - DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) == valstack_top_base); - - /* Executor interrupt counter check, used to implement breakpoints, - * debugging interface, execution timeouts, etc. The counter is heap - * specific but is maintained in the current thread to make the check - * as fast as possible. The counter is copied back to the heap struct - * whenever a thread switch occurs by the DUK_HEAP_SWITCH_THREAD() macro. - */ -#if defined(DUK_USE_INTERRUPT_COUNTER) - int_ctr = thr->interrupt_counter; - if (DUK_LIKELY(int_ctr > 0)) { - thr->interrupt_counter = int_ctr - 1; - } else { - /* Trigger at zero or below */ - duk_small_uint_t exec_int_ret; - - DUK_STATS_INC(thr->heap, stats_exec_interrupt); - - /* Write curr_pc back for the debugger. */ - { - duk_activation *act; - DUK_ASSERT(thr->callstack_top > 0); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - act->curr_pc = (duk_instr_t *) curr_pc; - } - - /* Forced restart caused by a function return; must recheck - * debugger breakpoints before checking line transitions, - * see GH-303. Restart and then handle interrupt_counter - * zero again. - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (thr->heap->dbg_force_restart) { - DUK_DD(DUK_DDPRINT("dbg_force_restart flag forced restart execution")); /* GH-303 */ - thr->heap->dbg_force_restart = 0; - goto restart_execution; - } -#endif - - exec_int_ret = duk__executor_interrupt(thr); - if (exec_int_ret == DUK__INT_RESTART) { - /* curr_pc synced back above */ - goto restart_execution; - } - } -#endif /* DUK_USE_INTERRUPT_COUNTER */ -#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG) - /* For cross-checking during development: ensure dispatch count - * matches cumulative interrupt counter init value sums. - */ - thr->heap->inst_count_exec++; -#endif - -#if defined(DUK_USE_ASSERTIONS) || defined(DUK_USE_DEBUG) - { - duk_activation *act; - act = thr->callstack_curr; - DUK_ASSERT(curr_pc >= DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())); - DUK_ASSERT(curr_pc < DUK_HCOMPFUNC_GET_CODE_END(thr->heap, DUK__FUN())); - DUK_UNREF(act); /* if debugging disabled */ - - DUK_DDD(DUK_DDDPRINT("executing bytecode: pc=%ld, ins=0x%08lx, op=%ld, valstack_top=%ld/%ld, nregs=%ld --> %!I", - (long) (curr_pc - DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())), - (unsigned long) *curr_pc, - (long) DUK_DEC_OP(*curr_pc), - (long) (thr->valstack_top - thr->valstack), - (long) (thr->valstack_end - thr->valstack), - (long) (DUK__FUN() ? DUK__FUN()->nregs : -1), - (duk_instr_t) *curr_pc)); - } -#endif - -#if defined(DUK_USE_ASSERTIONS) - /* Quite heavy assert: check valstack policy. Improper - * shuffle instructions can write beyond valstack_top/end - * so this check catches them in the act. - */ - { - duk_tval *tv; - tv = thr->valstack_top; - while (tv != thr->valstack_end) { - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv)); - tv++; - } - } -#endif - - ins = *curr_pc++; - DUK_STATS_INC(thr->heap, stats_exec_opcodes); - - /* Typing: use duk_small_(u)int_fast_t when decoding small - * opcode fields (op, A, B, C, BC) which fit into 16 bits - * and duk_(u)int_fast_t when decoding larger fields (e.g. - * ABC). Use unsigned variant by default, signed when the - * value is used in signed arithmetic. Using variable names - * such as 'a', 'b', 'c', 'bc', etc makes it easier to spot - * typing mismatches. - */ - - /* Switch based on opcode. Cast to 8-bit unsigned value and - * use a fully populated case clauses so that the compiler - * will (at least usually) omit a bounds check. - */ - op = (duk_uint8_t) DUK_DEC_OP(ins); - switch (op) { - - /* Some useful macros. These access inner executor variables - * directly so they only apply within the executor. - */ -#if defined(DUK_USE_EXEC_PREFER_SIZE) -#define DUK__REPLACE_TOP_A_BREAK() { goto replace_top_a; } -#define DUK__REPLACE_TOP_BC_BREAK() { goto replace_top_bc; } -#define DUK__REPLACE_BOOL_A_BREAK(bval) { \ - duk_bool_t duk__bval; \ - duk__bval = (bval); \ - DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ - duk_push_boolean(thr, duk__bval); \ - DUK__REPLACE_TOP_A_BREAK(); \ - } -#else -#define DUK__REPLACE_TOP_A_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); break; } -#define DUK__REPLACE_TOP_BC_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); break; } -#define DUK__REPLACE_BOOL_A_BREAK(bval) { \ - duk_bool_t duk__bval; \ - duk_tval *duk__tvdst; \ - duk__bval = (bval); \ - DUK_ASSERT(duk__bval == 0 || duk__bval == 1); \ - duk__tvdst = DUK__REGP_A(ins); \ - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, duk__tvdst, duk__bval); \ - break; \ - } -#endif - - /* XXX: 12 + 12 bit variant might make sense too, for both reg and - * const loads. - */ - - /* For LDREG, STREG, LDCONST footprint optimized variants would just - * duk_dup() + duk_replace(), but because they're used quite a lot - * they're currently intentionally not size optimized. - */ - case DUK_OP_LDREG: { - duk_tval *tv1, *tv2; - - tv1 = DUK__REGP_A(ins); - tv2 = DUK__REGP_BC(ins); - DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ - break; - } - - case DUK_OP_STREG: { - duk_tval *tv1, *tv2; - - tv1 = DUK__REGP_A(ins); - tv2 = DUK__REGP_BC(ins); - DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv2, tv1); /* side effects */ - break; - } - - case DUK_OP_LDCONST: { - duk_tval *tv1, *tv2; - - tv1 = DUK__REGP_A(ins); - tv2 = DUK__CONSTP_BC(ins); - DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ - break; - } - - /* LDINT and LDINTX are intended to load an arbitrary signed - * 32-bit value. Only an LDINT+LDINTX sequence is supported. - * This also guarantees all values remain fastints. - */ -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_LDINT: { - duk_int32_t val; - - val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; - duk_push_int(thr, val); - DUK__REPLACE_TOP_A_BREAK(); - } - case DUK_OP_LDINTX: { - duk_int32_t val; - - val = (duk_int32_t) duk_get_int(thr, DUK_DEC_A(ins)); - val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ - duk_push_int(thr, val); - DUK__REPLACE_TOP_A_BREAK(); - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_LDINT: { - duk_tval *tv1; - duk_int32_t val; - - val = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS; - tv1 = DUK__REGP_A(ins); - DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ - break; - } - case DUK_OP_LDINTX: { - duk_tval *tv1; - duk_int32_t val; - - tv1 = DUK__REGP_A(ins); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - val = DUK_TVAL_GET_FASTINT_I32(tv1); -#else - /* XXX: fast double-to-int conversion, we know number is integer in [-0x80000000,0xffffffff]. */ - val = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - val = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins); /* no bias */ - DUK_TVAL_SET_I32_UPDREF(thr, tv1, val); /* side effects */ - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_LDTHIS: { - duk_push_this(thr); - DUK__REPLACE_TOP_BC_BREAK(); - } - case DUK_OP_LDUNDEF: { - duk_to_undefined(thr, (duk_idx_t) DUK_DEC_BC(ins)); - break; - } - case DUK_OP_LDNULL: { - duk_to_null(thr, (duk_idx_t) DUK_DEC_BC(ins)); - break; - } - case DUK_OP_LDTRUE: { - duk_push_true(thr); - DUK__REPLACE_TOP_BC_BREAK(); - } - case DUK_OP_LDFALSE: { - duk_push_false(thr); - DUK__REPLACE_TOP_BC_BREAK(); - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_LDTHIS: { - /* Note: 'this' may be bound to any value, not just an object */ - duk_tval *tv1, *tv2; - - tv1 = DUK__REGP_BC(ins); - tv2 = thr->valstack_bottom - 1; /* 'this binding' is just under bottom */ - DUK_ASSERT(tv2 >= thr->valstack); - DUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2); /* side effects */ - break; - } - case DUK_OP_LDUNDEF: { - duk_tval *tv1; - - tv1 = DUK__REGP_BC(ins); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1); /* side effects */ - break; - } - case DUK_OP_LDNULL: { - duk_tval *tv1; - - tv1 = DUK__REGP_BC(ins); - DUK_TVAL_SET_NULL_UPDREF(thr, tv1); /* side effects */ - break; - } - case DUK_OP_LDTRUE: { - duk_tval *tv1; - - tv1 = DUK__REGP_BC(ins); - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 1); /* side effects */ - break; - } - case DUK_OP_LDFALSE: { - duk_tval *tv1; - - tv1 = DUK__REGP_BC(ins); - DUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 0); /* side effects */ - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - case DUK_OP_BNOT: { - duk__vm_bitwise_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); - break; - } - - case DUK_OP_LNOT: { - duk__vm_logical_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins)); - break; - } - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_UNM: - case DUK_OP_UNP: { - duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), op); - break; - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_UNM: { - duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNM); - break; - } - case DUK_OP_UNP: { - duk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNP); - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_TYPEOF: { - duk_small_uint_t stridx; - - stridx = duk_js_typeof_stridx(DUK__REGP_BC(ins)); - DUK_ASSERT_STRIDX_VALID(stridx); - duk_push_hstring_stridx(thr, stridx); - DUK__REPLACE_TOP_A_BREAK(); - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_TYPEOF: { - duk_tval *tv; - duk_small_uint_t stridx; - duk_hstring *h_str; - - tv = DUK__REGP_BC(ins); - stridx = duk_js_typeof_stridx(tv); - DUK_ASSERT_STRIDX_VALID(stridx); - h_str = DUK_HTHREAD_GET_STRING(thr, stridx); - tv = DUK__REGP_A(ins); - DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - case DUK_OP_TYPEOFID: { - duk_small_uint_t stridx; -#if !defined(DUK_USE_EXEC_PREFER_SIZE) - duk_hstring *h_str; -#endif - duk_activation *act; - duk_hstring *name; - duk_tval *tv; - - /* A -> target register - * BC -> constant index of identifier name - */ - - tv = DUK__CONSTP_BC(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv)); - name = DUK_TVAL_GET_STRING(tv); - tv = NULL; /* lookup has side effects */ - act = thr->callstack_curr; - if (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) { - /* -> [... val this] */ - tv = DUK_GET_TVAL_NEGIDX(thr, -2); - stridx = duk_js_typeof_stridx(tv); - tv = NULL; /* no longer needed */ - duk_pop_2_unsafe(thr); - } else { - /* unresolvable, no stack changes */ - stridx = DUK_STRIDX_LC_UNDEFINED; - } - DUK_ASSERT_STRIDX_VALID(stridx); -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_push_hstring_stridx(thr, stridx); - DUK__REPLACE_TOP_A_BREAK(); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - h_str = DUK_HTHREAD_GET_STRING(thr, stridx); - tv = DUK__REGP_A(ins); - DUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str); - break; -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - } - - /* Equality: E5 Sections 11.9.1, 11.9.3 */ - -#define DUK__EQ_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_equals(thr, (barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#define DUK__NEQ_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_equals(thr, (barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - tmp ^= 1; \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#define DUK__SEQ_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_strict_equals((barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#define DUK__SNEQ_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_strict_equals((barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - tmp ^= 1; \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_EQ_RR: - case DUK_OP_EQ_CR: - case DUK_OP_EQ_RC: - case DUK_OP_EQ_CC: - DUK__EQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_NEQ_RR: - case DUK_OP_NEQ_CR: - case DUK_OP_NEQ_RC: - case DUK_OP_NEQ_CC: - DUK__NEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_SEQ_RR: - case DUK_OP_SEQ_CR: - case DUK_OP_SEQ_RC: - case DUK_OP_SEQ_CC: - DUK__SEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_SNEQ_RR: - case DUK_OP_SNEQ_CR: - case DUK_OP_SNEQ_RC: - case DUK_OP_SNEQ_CC: - DUK__SNEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_EQ_RR: - DUK__EQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_EQ_CR: - DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_EQ_RC: - DUK__EQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_EQ_CC: - DUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_NEQ_RR: - DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_NEQ_CR: - DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_NEQ_RC: - DUK__NEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_NEQ_CC: - DUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_SEQ_RR: - DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_SEQ_CR: - DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_SEQ_RC: - DUK__SEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_SEQ_CC: - DUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_SNEQ_RR: - DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_SNEQ_CR: - DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_SNEQ_RC: - DUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_SNEQ_CC: - DUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - -#define DUK__COMPARE_BODY(arg1,arg2,flags) { \ - duk_bool_t tmp; \ - tmp = duk_js_compare_helper(thr, (arg1), (arg2), (flags)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#define DUK__GT_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), 0) -#define DUK__GE_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE) -#define DUK__LT_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) -#define DUK__LE_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), DUK_COMPARE_FLAG_NEGATE) -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_GT_RR: - case DUK_OP_GT_CR: - case DUK_OP_GT_RC: - case DUK_OP_GT_CC: - DUK__GT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_GE_RR: - case DUK_OP_GE_CR: - case DUK_OP_GE_RC: - case DUK_OP_GE_CC: - DUK__GE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_LT_RR: - case DUK_OP_LT_CR: - case DUK_OP_LT_RC: - case DUK_OP_LT_CC: - DUK__LT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_LE_RR: - case DUK_OP_LE_CR: - case DUK_OP_LE_RC: - case DUK_OP_LE_CC: - DUK__LE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_GT_RR: - DUK__GT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GT_CR: - DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GT_RC: - DUK__GT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_GT_CC: - DUK__GT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_GE_RR: - DUK__GE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GE_CR: - DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GE_RC: - DUK__GE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_GE_CC: - DUK__GE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_LT_RR: - DUK__LT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_LT_CR: - DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_LT_RC: - DUK__LT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_LT_CC: - DUK__LT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_LE_RR: - DUK__LE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_LE_CR: - DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_LE_RC: - DUK__LE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_LE_CC: - DUK__LE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* No size optimized variant at present for IF. */ - case DUK_OP_IFTRUE_R: { - if (duk_js_toboolean(DUK__REGP_BC(ins)) != 0) { - curr_pc++; - } - break; - } - case DUK_OP_IFTRUE_C: { - if (duk_js_toboolean(DUK__CONSTP_BC(ins)) != 0) { - curr_pc++; - } - break; - } - case DUK_OP_IFFALSE_R: { - if (duk_js_toboolean(DUK__REGP_BC(ins)) == 0) { - curr_pc++; - } - break; - } - case DUK_OP_IFFALSE_C: { - if (duk_js_toboolean(DUK__CONSTP_BC(ins)) == 0) { - curr_pc++; - } - break; - } - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_ADD_RR: - case DUK_OP_ADD_CR: - case DUK_OP_ADD_RC: - case DUK_OP_ADD_CC: { - /* XXX: could leave value on stack top and goto replace_top_a; */ - duk__vm_arith_add(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins)); - break; - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_ADD_RR: { - duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); - break; - } - case DUK_OP_ADD_CR: { - duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins)); - break; - } - case DUK_OP_ADD_RC: { - duk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); - break; - } - case DUK_OP_ADD_CC: { - duk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins)); - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_SUB_RR: - case DUK_OP_SUB_CR: - case DUK_OP_SUB_RC: - case DUK_OP_SUB_CC: - case DUK_OP_MUL_RR: - case DUK_OP_MUL_CR: - case DUK_OP_MUL_RC: - case DUK_OP_MUL_CC: - case DUK_OP_DIV_RR: - case DUK_OP_DIV_CR: - case DUK_OP_DIV_RC: - case DUK_OP_DIV_CC: - case DUK_OP_MOD_RR: - case DUK_OP_MOD_CR: - case DUK_OP_MOD_RC: - case DUK_OP_MOD_CC: -#if defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_OP_EXP_RR: - case DUK_OP_EXP_CR: - case DUK_OP_EXP_RC: - case DUK_OP_EXP_CC: -#endif /* DUK_USE_ES7_EXP_OPERATOR */ - { - /* XXX: could leave value on stack top and goto replace_top_a; */ - duk__vm_arith_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); - break; - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_SUB_RR: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); - break; - } - case DUK_OP_SUB_CR: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); - break; - } - case DUK_OP_SUB_RC: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); - break; - } - case DUK_OP_SUB_CC: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB); - break; - } - case DUK_OP_MUL_RR: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); - break; - } - case DUK_OP_MUL_CR: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); - break; - } - case DUK_OP_MUL_RC: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); - break; - } - case DUK_OP_MUL_CC: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL); - break; - } - case DUK_OP_DIV_RR: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); - break; - } - case DUK_OP_DIV_CR: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); - break; - } - case DUK_OP_DIV_RC: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); - break; - } - case DUK_OP_DIV_CC: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV); - break; - } - case DUK_OP_MOD_RR: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); - break; - } - case DUK_OP_MOD_CR: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); - break; - } - case DUK_OP_MOD_RC: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); - break; - } - case DUK_OP_MOD_CC: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD); - break; - } -#if defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_OP_EXP_RR: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); - break; - } - case DUK_OP_EXP_CR: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); - break; - } - case DUK_OP_EXP_RC: { - duk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); - break; - } - case DUK_OP_EXP_CC: { - duk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP); - break; - } -#endif /* DUK_USE_ES7_EXP_OPERATOR */ -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_BAND_RR: - case DUK_OP_BAND_CR: - case DUK_OP_BAND_RC: - case DUK_OP_BAND_CC: - case DUK_OP_BOR_RR: - case DUK_OP_BOR_CR: - case DUK_OP_BOR_RC: - case DUK_OP_BOR_CC: - case DUK_OP_BXOR_RR: - case DUK_OP_BXOR_CR: - case DUK_OP_BXOR_RC: - case DUK_OP_BXOR_CC: - case DUK_OP_BASL_RR: - case DUK_OP_BASL_CR: - case DUK_OP_BASL_RC: - case DUK_OP_BASL_CC: - case DUK_OP_BLSR_RR: - case DUK_OP_BLSR_CR: - case DUK_OP_BLSR_RC: - case DUK_OP_BLSR_CC: - case DUK_OP_BASR_RR: - case DUK_OP_BASR_CR: - case DUK_OP_BASR_RC: - case DUK_OP_BASR_CC: { - /* XXX: could leave value on stack top and goto replace_top_a; */ - duk__vm_bitwise_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op); - break; - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_BAND_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); - break; - } - case DUK_OP_BAND_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); - break; - } - case DUK_OP_BAND_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); - break; - } - case DUK_OP_BAND_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND); - break; - } - case DUK_OP_BOR_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); - break; - } - case DUK_OP_BOR_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); - break; - } - case DUK_OP_BOR_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); - break; - } - case DUK_OP_BOR_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR); - break; - } - case DUK_OP_BXOR_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); - break; - } - case DUK_OP_BXOR_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); - break; - } - case DUK_OP_BXOR_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); - break; - } - case DUK_OP_BXOR_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR); - break; - } - case DUK_OP_BASL_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); - break; - } - case DUK_OP_BASL_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); - break; - } - case DUK_OP_BASL_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); - break; - } - case DUK_OP_BASL_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL); - break; - } - case DUK_OP_BLSR_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); - break; - } - case DUK_OP_BLSR_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); - break; - } - case DUK_OP_BLSR_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); - break; - } - case DUK_OP_BLSR_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR); - break; - } - case DUK_OP_BASR_RR: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); - break; - } - case DUK_OP_BASR_CR: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); - break; - } - case DUK_OP_BASR_RC: { - duk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); - break; - } - case DUK_OP_BASR_CC: { - duk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR); - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* For INSTOF and IN, B is always a register. */ -#define DUK__INSTOF_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_instanceof(thr, (barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#define DUK__IN_BODY(barg,carg) { \ - duk_bool_t tmp; \ - tmp = duk_js_in(thr, (barg), (carg)); \ - DUK_ASSERT(tmp == 0 || tmp == 1); \ - DUK__REPLACE_BOOL_A_BREAK(tmp); \ - } -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_INSTOF_RR: - case DUK_OP_INSTOF_CR: - case DUK_OP_INSTOF_RC: - case DUK_OP_INSTOF_CC: - DUK__INSTOF_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_IN_RR: - case DUK_OP_IN_CR: - case DUK_OP_IN_RC: - case DUK_OP_IN_CC: - DUK__IN_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_INSTOF_RR: - DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_INSTOF_CR: - DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_INSTOF_RC: - DUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_INSTOF_CC: - DUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_IN_RR: - DUK__IN_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_IN_CR: - DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_IN_RC: - DUK__IN_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_IN_CC: - DUK__IN_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* Pre/post inc/dec for register variables, important for loops. */ -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_PREINCR: - case DUK_OP_PREDECR: - case DUK_OP_POSTINCR: - case DUK_OP_POSTDECR: { - duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), op); - break; - } - case DUK_OP_PREINCV: - case DUK_OP_PREDECV: - case DUK_OP_POSTINCV: - case DUK_OP_POSTDECV: { - duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), op, DUK__STRICT()); - break; - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_PREINCR: { - duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREINCR); - break; - } - case DUK_OP_PREDECR: { - duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREDECR); - break; - } - case DUK_OP_POSTINCR: { - duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTINCR); - break; - } - case DUK_OP_POSTDECR: { - duk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTDECR); - break; - } - case DUK_OP_PREINCV: { - duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREINCV, DUK__STRICT()); - break; - } - case DUK_OP_PREDECV: { - duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREDECV, DUK__STRICT()); - break; - } - case DUK_OP_POSTINCV: { - duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTINCV, DUK__STRICT()); - break; - } - case DUK_OP_POSTDECV: { - duk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTDECV, DUK__STRICT()); - break; - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* XXX: Move to separate helper, optimize for perf/size separately. */ - /* Preinc/predec for object properties. */ - case DUK_OP_PREINCP_RR: - case DUK_OP_PREINCP_CR: - case DUK_OP_PREINCP_RC: - case DUK_OP_PREINCP_CC: - case DUK_OP_PREDECP_RR: - case DUK_OP_PREDECP_CR: - case DUK_OP_PREDECP_RC: - case DUK_OP_PREDECP_CC: - case DUK_OP_POSTINCP_RR: - case DUK_OP_POSTINCP_CR: - case DUK_OP_POSTINCP_RC: - case DUK_OP_POSTINCP_CC: - case DUK_OP_POSTDECP_RR: - case DUK_OP_POSTDECP_CR: - case DUK_OP_POSTDECP_RC: - case DUK_OP_POSTDECP_CC: { - duk_tval *tv_obj; - duk_tval *tv_key; - duk_tval *tv_val; - duk_bool_t rc; - duk_double_t x, y, z; -#if !defined(DUK_USE_EXEC_PREFER_SIZE) - duk_tval *tv_dst; -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* A -> target reg - * B -> object reg/const (may be const e.g. in "'foo'[1]") - * C -> key reg/const - */ - - /* Opcode bits 0-1 are used to distinguish reg/const variants. - * Opcode bits 2-3 are used to distinguish inc/dec variants: - * Bit 2 = inc(0)/dec(1), bit 3 = pre(0)/post(1). - */ - DUK_ASSERT((DUK_OP_PREINCP_RR & 0x0c) == 0x00); - DUK_ASSERT((DUK_OP_PREDECP_RR & 0x0c) == 0x04); - DUK_ASSERT((DUK_OP_POSTINCP_RR & 0x0c) == 0x08); - DUK_ASSERT((DUK_OP_POSTDECP_RR & 0x0c) == 0x0c); - - tv_obj = DUK__REGCONSTP_B(ins); - tv_key = DUK__REGCONSTP_C(ins); - rc = duk_hobject_getprop(thr, tv_obj, tv_key); /* -> [val] */ - DUK_UNREF(rc); /* ignore */ - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ - - /* XXX: Fastint fast path would be useful here. Also fastints - * now lose their fastint status in current handling which is - * not intuitive. - */ - - x = duk_to_number_m1(thr); - duk_pop_unsafe(thr); - if (ins & DUK_BC_INCDECP_FLAG_DEC) { - y = x - 1.0; - } else { - y = x + 1.0; - } - - duk_push_number(thr, y); - tv_val = DUK_GET_TVAL_NEGIDX(thr, -1); - DUK_ASSERT(tv_val != NULL); - tv_obj = DUK__REGCONSTP_B(ins); - tv_key = DUK__REGCONSTP_C(ins); - rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT()); - DUK_UNREF(rc); /* ignore */ - tv_obj = NULL; /* invalidated */ - tv_key = NULL; /* invalidated */ - duk_pop_unsafe(thr); - - z = (ins & DUK_BC_INCDECP_FLAG_POST) ? x : y; -#if defined(DUK_USE_EXEC_PREFER_SIZE) - duk_push_number(thr, z); - DUK__REPLACE_TOP_A_BREAK(); -#else - tv_dst = DUK__REGP_A(ins); - DUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z); - break; -#endif - } - - /* XXX: GETPROP where object is 'this', GETPROPT? - * Occurs relatively often in object oriented code. - */ - -#define DUK__GETPROP_BODY(barg,carg) { \ - /* A -> target reg \ - * B -> object reg/const (may be const e.g. in "'foo'[1]") \ - * C -> key reg/const \ - */ \ - (void) duk_hobject_getprop(thr, (barg), (carg)); \ - DUK__REPLACE_TOP_A_BREAK(); \ - } -#define DUK__GETPROPC_BODY(barg,carg) { \ - /* Same as GETPROP but callability check for property-based calls. */ \ - duk_tval *tv__targ; \ - (void) duk_hobject_getprop(thr, (barg), (carg)); \ - DUK_GC_TORTURE(thr->heap); \ - tv__targ = DUK_GET_TVAL_NEGIDX(thr, -1); \ - if (DUK_UNLIKELY(!duk_is_callable_tval(thr, tv__targ))) { \ - /* Here we intentionally re-evaluate the macro \ - * arguments to deal with potentially changed \ - * valstack base pointer! \ - */ \ - duk_call_setup_propcall_error(thr, tv__targ, (barg), (carg)); \ - } \ - DUK__REPLACE_TOP_A_BREAK(); \ - } -#define DUK__PUTPROP_BODY(aarg,barg,carg) { \ - /* A -> object reg \ - * B -> key reg/const \ - * C -> value reg/const \ - * \ - * Note: intentional difference to register arrangement \ - * of e.g. GETPROP; 'A' must contain a register-only value. \ - */ \ - (void) duk_hobject_putprop(thr, (aarg), (barg), (carg), DUK__STRICT()); \ - break; \ - } -#define DUK__DELPROP_BODY(barg,carg) { \ - /* A -> result reg \ - * B -> object reg \ - * C -> key reg/const \ - */ \ - duk_bool_t rc; \ - rc = duk_hobject_delprop(thr, (barg), (carg), DUK__STRICT()); \ - DUK_ASSERT(rc == 0 || rc == 1); \ - DUK__REPLACE_BOOL_A_BREAK(rc); \ - } -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_GETPROP_RR: - case DUK_OP_GETPROP_CR: - case DUK_OP_GETPROP_RC: - case DUK_OP_GETPROP_CC: - DUK__GETPROP_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); -#if defined(DUK_USE_VERBOSE_ERRORS) - case DUK_OP_GETPROPC_RR: - case DUK_OP_GETPROPC_CR: - case DUK_OP_GETPROPC_RC: - case DUK_OP_GETPROPC_CC: - DUK__GETPROPC_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); -#endif - case DUK_OP_PUTPROP_RR: - case DUK_OP_PUTPROP_CR: - case DUK_OP_PUTPROP_RC: - case DUK_OP_PUTPROP_CC: - DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins)); - case DUK_OP_DELPROP_RR: - case DUK_OP_DELPROP_RC: /* B is always reg */ - DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGCONSTP_C(ins)); -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_GETPROP_RR: - DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GETPROP_CR: - DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GETPROP_RC: - DUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_GETPROP_CC: - DUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); -#if defined(DUK_USE_VERBOSE_ERRORS) - case DUK_OP_GETPROPC_RR: - DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GETPROPC_CR: - DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_GETPROPC_RC: - DUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_GETPROPC_CC: - DUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); -#endif - case DUK_OP_PUTPROP_RR: - DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_PUTPROP_CR: - DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_PUTPROP_RC: - DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_PUTPROP_CC: - DUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__CONSTP_C(ins)); - case DUK_OP_DELPROP_RR: /* B is always reg */ - DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins)); - case DUK_OP_DELPROP_RC: - DUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins)); -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - /* No fast path for DECLVAR now, it's quite a rare instruction. */ - case DUK_OP_DECLVAR_RR: - case DUK_OP_DECLVAR_CR: - case DUK_OP_DECLVAR_RC: - case DUK_OP_DECLVAR_CC: { - duk_activation *act; - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_tval *tv1; - duk_hstring *name; - duk_small_uint_t prop_flags; - duk_bool_t is_func_decl; - - tv1 = DUK__REGCONSTP_B(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - - is_func_decl = ((a & DUK_BC_DECLVAR_FLAG_FUNC_DECL) != 0); - - /* XXX: declvar takes an duk_tval pointer, which is awkward and - * should be reworked. - */ - - /* Compiler is responsible for selecting property flags (configurability, - * writability, etc). - */ - prop_flags = a & DUK_PROPDESC_FLAGS_MASK; - - if (is_func_decl) { - duk_push_tval(thr, DUK__REGCONSTP_C(ins)); - } else { - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ - thr->valstack_top++; - } - tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); - - act = thr->callstack_curr; - if (duk_js_declvar_activation(thr, act, name, tv1, prop_flags, is_func_decl)) { - if (is_func_decl) { - /* Already declared, update value. */ - tv1 = DUK_GET_TVAL_NEGIDX(thr, -1); - duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); - } else { - /* Already declared but no initializer value - * (e.g. 'var xyz;'), no-op. - */ - } - } - - duk_pop_unsafe(thr); - break; - } - -#if defined(DUK_USE_REGEXP_SUPPORT) - /* The compiler should never emit DUK_OP_REGEXP if there is no - * regexp support. - */ - case DUK_OP_REGEXP_RR: - case DUK_OP_REGEXP_CR: - case DUK_OP_REGEXP_RC: - case DUK_OP_REGEXP_CC: { - /* A -> target register - * B -> bytecode (also contains flags) - * C -> escaped source - */ - - duk_push_tval(thr, DUK__REGCONSTP_C(ins)); - duk_push_tval(thr, DUK__REGCONSTP_B(ins)); /* -> [ ... escaped_source bytecode ] */ - duk_regexp_create_instance(thr); /* -> [ ... regexp_instance ] */ - DUK__REPLACE_TOP_A_BREAK(); - } -#endif /* DUK_USE_REGEXP_SUPPORT */ - - /* XXX: 'c' is unused, use whole BC, etc. */ - case DUK_OP_CSVAR_RR: - case DUK_OP_CSVAR_CR: - case DUK_OP_CSVAR_RC: - case DUK_OP_CSVAR_CC: { - /* The speciality of calling through a variable binding is that the - * 'this' value may be provided by the variable lookup: E5 Section 6.b.i. - * - * The only (standard) case where the 'this' binding is non-null is when - * (1) the variable is found in an object environment record, and - * (2) that object environment record is a 'with' block. - */ - - duk_activation *act; - duk_uint_fast_t idx; - duk_tval *tv1; - duk_hstring *name; - - /* A -> target registers (A, A + 1) for call setup - * B -> identifier name, usually constant but can be a register due to shuffling - */ - - tv1 = DUK__REGCONSTP_B(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - act = thr->callstack_curr; - (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ - - idx = (duk_uint_fast_t) DUK_DEC_A(ins); - - /* Could add direct value stack handling. */ - duk_replace(thr, (duk_idx_t) (idx + 1)); /* 'this' binding */ - duk_replace(thr, (duk_idx_t) idx); /* variable value (function, we hope, not checked here) */ - break; - } - - case DUK_OP_CLOSURE: { - duk_activation *act; - duk_hcompfunc *fun_act; - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - duk_hobject *fun_temp; - - /* A -> target reg - * BC -> inner function index - */ - - DUK_DDD(DUK_DDDPRINT("CLOSURE to target register %ld, fnum %ld (count %ld)", - (long) DUK_DEC_A(ins), (long) DUK_DEC_BC(ins), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN()))); - - DUK_ASSERT_DISABLE(bc >= 0); /* unsigned */ - DUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN())); - - act = thr->callstack_curr; - fun_act = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act); - fun_temp = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun_act)[bc]; - DUK_ASSERT(fun_temp != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(fun_temp)); - - DUK_DDD(DUK_DDDPRINT("CLOSURE: function template is: %p -> %!O", - (void *) fun_temp, (duk_heaphdr *) fun_temp)); - - if (act->lex_env == NULL) { - DUK_ASSERT(act->var_env == NULL); - duk_js_init_activation_environment_records_delayed(thr, act); - act = thr->callstack_curr; - } - DUK_ASSERT(act->lex_env != NULL); - DUK_ASSERT(act->var_env != NULL); - - /* functions always have a NEWENV flag, i.e. they get a - * new variable declaration environment, so only lex_env - * matters here. - */ - duk_js_push_closure(thr, - (duk_hcompfunc *) fun_temp, - act->var_env, - act->lex_env, - 1 /*add_auto_proto*/); - DUK__REPLACE_TOP_A_BREAK(); - } - - case DUK_OP_GETVAR: { - duk_activation *act; - duk_tval *tv1; - duk_hstring *name; - - tv1 = DUK__CONSTP_BC(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - (void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/); /* -> [... val this] */ - duk_pop_unsafe(thr); /* 'this' binding is not needed here */ - DUK__REPLACE_TOP_A_BREAK(); - } - - case DUK_OP_PUTVAR: { - duk_activation *act; - duk_tval *tv1; - duk_hstring *name; - - tv1 = DUK__CONSTP_BC(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - - /* XXX: putvar takes a duk_tval pointer, which is awkward and - * should be reworked. - */ - - tv1 = DUK__REGP_A(ins); /* val */ - act = thr->callstack_curr; - duk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT()); - break; - } - - case DUK_OP_DELVAR: { - duk_activation *act; - duk_tval *tv1; - duk_hstring *name; - duk_bool_t rc; - - tv1 = DUK__CONSTP_BC(ins); - DUK_ASSERT(DUK_TVAL_IS_STRING(tv1)); - name = DUK_TVAL_GET_STRING(tv1); - DUK_ASSERT(name != NULL); - act = thr->callstack_curr; - rc = duk_js_delvar_activation(thr, act, name); - DUK__REPLACE_BOOL_A_BREAK(rc); - } - - case DUK_OP_JUMP: { - /* Note: without explicit cast to signed, MSVC will - * apparently generate a large positive jump when the - * bias-corrected value would normally be negative. - */ - curr_pc += (duk_int_fast_t) DUK_DEC_ABC(ins) - (duk_int_fast_t) DUK_BC_JUMP_BIAS; - break; - } - -#define DUK__RETURN_SHARED() do { \ - duk_small_uint_t ret_result; \ - /* duk__handle_return() is guaranteed never to throw, except \ - * for potential out-of-memory situations which will then \ - * propagate out of the executor longjmp handler. \ - */ \ - DUK_ASSERT(thr->ptr_curr_pc == NULL); \ - ret_result = duk__handle_return(thr, entry_act); \ - if (ret_result == DUK__RETHAND_RESTART) { \ - goto restart_execution; \ - } \ - DUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); \ - return; \ - } while (0) -#if defined(DUK_USE_EXEC_PREFER_SIZE) - case DUK_OP_RETREG: - case DUK_OP_RETCONST: - case DUK_OP_RETCONSTN: - case DUK_OP_RETUNDEF: { - /* BC -> return value reg/const */ - - DUK__SYNC_AND_NULL_CURR_PC(); - - if (op == DUK_OP_RETREG) { - duk_push_tval(thr, DUK__REGP_BC(ins)); - } else if (op == DUK_OP_RETUNDEF) { - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); /* valstack policy */ - thr->valstack_top++; - } else { - DUK_ASSERT(op == DUK_OP_RETCONST || op == DUK_OP_RETCONSTN); - duk_push_tval(thr, DUK__CONSTP_BC(ins)); - } - - DUK__RETURN_SHARED(); - } -#else /* DUK_USE_EXEC_PREFER_SIZE */ - case DUK_OP_RETREG: { - duk_tval *tv; - - DUK__SYNC_AND_NULL_CURR_PC(); - tv = DUK__REGP_BC(ins); - DUK_TVAL_SET_TVAL(thr->valstack_top, tv); - DUK_TVAL_INCREF(thr, tv); - thr->valstack_top++; - DUK__RETURN_SHARED(); - } - /* This will be unused without refcounting. */ - case DUK_OP_RETCONST: { - duk_tval *tv; - - DUK__SYNC_AND_NULL_CURR_PC(); - tv = DUK__CONSTP_BC(ins); - DUK_TVAL_SET_TVAL(thr->valstack_top, tv); - DUK_TVAL_INCREF(thr, tv); - thr->valstack_top++; - DUK__RETURN_SHARED(); - } - case DUK_OP_RETCONSTN: { - duk_tval *tv; - - DUK__SYNC_AND_NULL_CURR_PC(); - tv = DUK__CONSTP_BC(ins); - DUK_TVAL_SET_TVAL(thr->valstack_top, tv); -#if defined(DUK_USE_REFERENCE_COUNTING) - /* Without refcounting only RETCONSTN is used. */ - DUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv)); /* no INCREF for this constant */ -#endif - thr->valstack_top++; - DUK__RETURN_SHARED(); - } - case DUK_OP_RETUNDEF: { - DUK__SYNC_AND_NULL_CURR_PC(); - thr->valstack_top++; /* value at valstack top is already undefined by valstack policy */ - DUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top)); - DUK__RETURN_SHARED(); - } -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - - case DUK_OP_LABEL: { - duk_activation *act; - duk_catcher *cat; - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - - /* Allocate catcher and populate it (must be atomic). */ - - cat = duk_hthread_catcher_alloc(thr); - DUK_ASSERT(cat != NULL); - - cat->flags = (duk_uint32_t) (DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT)); - cat->pc_base = (duk_instr_t *) curr_pc; /* pre-incremented, points to first jump slot */ - cat->idx_base = 0; /* unused for label */ - cat->h_varname = NULL; - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - cat->parent = act->cat; - act->cat = cat; - - DUK_DDD(DUK_DDDPRINT("LABEL catcher: flags=0x%08lx, pc_base=%ld, " - "idx_base=%ld, h_varname=%!O, label_id=%ld", - (long) cat->flags, (long) cat->pc_base, - (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat))); - - curr_pc += 2; /* skip jump slots */ - break; - } - - case DUK_OP_ENDLABEL: { - duk_activation *act; -#if (defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)) || defined(DUK_USE_ASSERTIONS) - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); -#endif -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - DUK_DDD(DUK_DDDPRINT("ENDLABEL %ld", (long) bc)); -#endif - - act = thr->callstack_curr; - DUK_ASSERT(act->cat != NULL); - DUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_LABEL); - DUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(act->cat) == bc); - duk_hthread_catcher_unwind_nolexenv_norz(thr, act); - - /* no need to unwind callstack */ - break; - } - - case DUK_OP_BREAK: { - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - - DUK__SYNC_AND_NULL_CURR_PC(); - duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK); - goto restart_execution; - } - - case DUK_OP_CONTINUE: { - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - - DUK__SYNC_AND_NULL_CURR_PC(); - duk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE); - goto restart_execution; - } - - /* XXX: move to helper, too large to be inline here */ - case DUK_OP_TRYCATCH: { - duk__handle_op_trycatch(thr, ins, curr_pc); - curr_pc += 2; /* skip jump slots */ - break; - } - - case DUK_OP_ENDTRY: { - curr_pc = duk__handle_op_endtry(thr, ins); - break; - } - - case DUK_OP_ENDCATCH: { - duk__handle_op_endcatch(thr, ins); - break; - } - - case DUK_OP_ENDFIN: { - /* Sync and NULL early. */ - DUK__SYNC_AND_NULL_CURR_PC(); - - if (duk__handle_op_endfin(thr, ins, entry_act) != 0) { - return; - } - - /* Must restart because we NULLed out curr_pc. */ - goto restart_execution; - } - - case DUK_OP_THROW: { - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - - /* Note: errors are augmented when they are created, not - * when they are thrown. So, don't augment here, it would - * break re-throwing for instance. - */ - - /* Sync so that augmentation sees up-to-date activations, NULL - * thr->ptr_curr_pc so that it's not used if side effects occur - * in augmentation or longjmp handling. - */ - DUK__SYNC_AND_NULL_CURR_PC(); - - duk_dup(thr, (duk_idx_t) bc); - DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (before throw augment)", - (duk_tval *) duk_get_tval(thr, -1))); -#if defined(DUK_USE_AUGMENT_ERROR_THROW) - duk_err_augment_error_throw(thr); - DUK_DDD(DUK_DDDPRINT("THROW ERROR (BYTECODE): %!dT (after throw augment)", - (duk_tval *) duk_get_tval(thr, -1))); -#endif - - duk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1)); -#if defined(DUK_USE_DEBUGGER_SUPPORT) - duk_err_check_debugger_integration(thr); -#endif - - DUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL); /* always in executor */ - duk_err_longjmp(thr); - DUK_UNREACHABLE(); - break; - } - - case DUK_OP_CSREG: { - /* - * Assuming a register binds to a variable declared within this - * function (a declarative binding), the 'this' for the call - * setup is always 'undefined'. E5 Section 10.2.1.1.6. - */ - - duk_small_uint_fast_t a = DUK_DEC_A(ins); - duk_small_uint_fast_t bc = DUK_DEC_BC(ins); - - /* A -> register containing target function (not type checked here) - * BC -> target registers (BC, BC + 1) for call setup - */ - -#if defined(DUK_USE_PREFER_SIZE) - duk_dup(thr, (duk_idx_t) a); - duk_replace(thr, (duk_idx_t) bc); - duk_to_undefined(thr, (duk_idx_t) (bc + 1)); -#else - duk_tval *tv1; - duk_tval *tv2; - duk_tval *tv3; - duk_tval tv_tmp1; - duk_tval tv_tmp2; - - tv1 = DUK__REGP(bc); - tv2 = tv1 + 1; - DUK_TVAL_SET_TVAL(&tv_tmp1, tv1); - DUK_TVAL_SET_TVAL(&tv_tmp2, tv2); - tv3 = DUK__REGP(a); - DUK_TVAL_SET_TVAL(tv1, tv3); - DUK_TVAL_INCREF(thr, tv1); /* no side effects */ - DUK_TVAL_SET_UNDEFINED(tv2); /* no need for incref */ - DUK_TVAL_DECREF(thr, &tv_tmp1); - DUK_TVAL_DECREF(thr, &tv_tmp2); -#endif - break; - } - - - /* XXX: in some cases it's faster NOT to reuse the value - * stack but rather copy the arguments on top of the stack - * (mainly when the calling value stack is large and the value - * stack resize would be large). - */ - - case DUK_OP_CALL0: - case DUK_OP_CALL1: - case DUK_OP_CALL2: - case DUK_OP_CALL3: - case DUK_OP_CALL4: - case DUK_OP_CALL5: - case DUK_OP_CALL6: - case DUK_OP_CALL7: { - /* Opcode packs 4 flag bits: 1 for indirect, 3 map - * 1:1 to three lowest call handling flags. - * - * A -> nargs or register with nargs (indirect) - * BC -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN) - */ - - duk_idx_t nargs; - duk_idx_t idx; - duk_small_uint_t call_flags; -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - duk_hcompfunc *fun; -#endif - - DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0); - DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) == 0); - - nargs = (duk_idx_t) DUK_DEC_A(ins); - call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA; - idx = (duk_idx_t) DUK_DEC_BC(ins); - - if (duk__executor_handle_call(thr, idx, nargs, call_flags)) { - /* curr_pc synced by duk_handle_call_unprotected() */ - DUK_ASSERT(thr->ptr_curr_pc == NULL); - goto restart_execution; - } - DUK_ASSERT(thr->ptr_curr_pc != NULL); - - /* duk_js_call.c is required to restore the stack reserve - * so we only need to reset the top. - */ -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - fun = DUK__FUN(); -#endif - duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs); - - /* No need to reinit setjmp() catchpoint, as call handling - * will store and restore our state. - * - * When debugger is enabled, we need to recheck the activation - * status after returning. This is now handled by call handling - * and heap->dbg_force_restart. - */ - break; - } - - case DUK_OP_CALL8: - case DUK_OP_CALL9: - case DUK_OP_CALL10: - case DUK_OP_CALL11: - case DUK_OP_CALL12: - case DUK_OP_CALL13: - case DUK_OP_CALL14: - case DUK_OP_CALL15: { - /* Indirect variant. */ - duk_uint_fast_t nargs; - duk_idx_t idx; - duk_small_uint_t call_flags; -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - duk_hcompfunc *fun; -#endif - - DUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0); - DUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) != 0); - - nargs = (duk_uint_fast_t) DUK_DEC_A(ins); - DUK__LOOKUP_INDIRECT(nargs); - call_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA; - idx = (duk_idx_t) DUK_DEC_BC(ins); - - if (duk__executor_handle_call(thr, idx, (duk_idx_t) nargs, call_flags)) { - DUK_ASSERT(thr->ptr_curr_pc == NULL); - goto restart_execution; - } - DUK_ASSERT(thr->ptr_curr_pc != NULL); - -#if !defined(DUK_USE_EXEC_FUN_LOCAL) - fun = DUK__FUN(); -#endif - duk_set_top_unsafe(thr, (duk_idx_t) fun->nregs); - break; - } - - case DUK_OP_NEWOBJ: { - duk_push_object(thr); -#if defined(DUK_USE_ASSERTIONS) - { - duk_hobject *h; - h = duk_require_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0); - } -#endif -#if !defined(DUK_USE_PREFER_SIZE) - /* XXX: could do a direct props realloc, but need hash size */ - duk_hobject_resize_entrypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins)); -#endif - DUK__REPLACE_TOP_BC_BREAK(); - } - - case DUK_OP_NEWARR: { - duk_push_array(thr); -#if defined(DUK_USE_ASSERTIONS) - { - duk_hobject *h; - h = duk_require_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0); - DUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0); - DUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(h)); - } -#endif -#if !defined(DUK_USE_PREFER_SIZE) - duk_hobject_realloc_props(thr, - duk_known_hobject(thr, -1), - 0 /*new_e_size*/, - DUK_DEC_A(ins) /*new_a_size*/, - 0 /*new_h_size*/, - 0 /*abandon_array*/); -#if 0 - duk_hobject_resize_arraypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins)); -#endif -#endif - DUK__REPLACE_TOP_BC_BREAK(); - } - - case DUK_OP_MPUTOBJ: - case DUK_OP_MPUTOBJI: { - duk_idx_t obj_idx; - duk_uint_fast_t idx, idx_end; - duk_small_uint_fast_t count; - - /* A -> register of target object - * B -> first register of key/value pair list - * or register containing first register number if indirect - * C -> number of key/value pairs * 2 - * (= number of value stack indices used starting from 'B') - */ - - obj_idx = DUK_DEC_A(ins); - DUK_ASSERT(duk_is_object(thr, obj_idx)); - - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) { - DUK__LOOKUP_INDIRECT(idx); - } - - count = (duk_small_uint_fast_t) DUK_DEC_C(ins); - DUK_ASSERT(count > 0); /* compiler guarantees */ - idx_end = idx + count; - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (DUK_UNLIKELY(idx_end > (duk_uint_fast_t) duk_get_top(thr))) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("MPUTOBJ out of bounds"); - } -#endif - - /* Use 'force' flag to duk_def_prop() to ensure that any - * inherited properties don't prevent the operation. - * With ES2015 duplicate properties are allowed, so that we - * must overwrite any previous data or accessor property. - * - * With ES2015 computed property names the literal keys - * may be arbitrary values and need to be ToPropertyKey() - * coerced at runtime. - */ - do { - /* XXX: faster initialization (direct access or better primitives) */ - duk_dup(thr, (duk_idx_t) idx); - duk_dup(thr, (duk_idx_t) (idx + 1)); - duk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_VALUE | - DUK_DEFPROP_FORCE | - DUK_DEFPROP_SET_WRITABLE | - DUK_DEFPROP_SET_ENUMERABLE | - DUK_DEFPROP_SET_CONFIGURABLE); - idx += 2; - } while (idx < idx_end); - break; - } - - case DUK_OP_INITSET: - case DUK_OP_INITGET: { - duk__handle_op_initset_initget(thr, ins); - break; - } - - case DUK_OP_MPUTARR: - case DUK_OP_MPUTARRI: { - duk_idx_t obj_idx; - duk_uint_fast_t idx, idx_end; - duk_small_uint_fast_t count; - duk_tval *tv1; - duk_uint32_t arr_idx; - - /* A -> register of target object - * B -> first register of value data (start_index, value1, value2, ..., valueN) - * or register containing first register number if indirect - * C -> number of key/value pairs (N) - */ - - obj_idx = DUK_DEC_A(ins); - DUK_ASSERT(duk_is_object(thr, obj_idx)); - - idx = (duk_uint_fast_t) DUK_DEC_B(ins); - if (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) { - DUK__LOOKUP_INDIRECT(idx); - } - - count = (duk_small_uint_fast_t) DUK_DEC_C(ins); - DUK_ASSERT(count > 0 + 1); /* compiler guarantees */ - idx_end = idx + count; - -#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK) - if (idx_end > (duk_uint_fast_t) duk_get_top(thr)) { - /* XXX: use duk_is_valid_index() instead? */ - /* XXX: improve check; check against nregs, not against top */ - DUK__INTERNAL_ERROR("MPUTARR out of bounds"); - } -#endif - - tv1 = DUK__REGP(idx); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - arr_idx = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); -#else - arr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - idx++; - - do { - /* duk_xdef_prop() will define an own property without any array - * special behaviors. We'll need to set the array length explicitly - * in the end. For arrays with elisions, the compiler will emit an - * explicit SETALEN which will update the length. - */ - - /* XXX: because we're dealing with 'own' properties of a fresh array, - * the array initializer should just ensure that the array has a large - * enough array part and write the values directly into array part, - * and finally set 'length' manually in the end (as already happens now). - */ - - duk_dup(thr, (duk_idx_t) idx); - duk_xdef_prop_index_wec(thr, obj_idx, arr_idx); - - idx++; - arr_idx++; - } while (idx < idx_end); - - /* XXX: E5.1 Section 11.1.4 coerces the final length through - * ToUint32() which is odd but happens now as a side effect of - * 'arr_idx' type. - */ - duk_set_length(thr, obj_idx, (duk_size_t) (duk_uarridx_t) arr_idx); - break; - } - - case DUK_OP_SETALEN: { - duk_tval *tv1; - duk_hobject *h; - duk_uint32_t len; - - tv1 = DUK__REGP_A(ins); - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); - h = DUK_TVAL_GET_OBJECT(tv1); - DUK_ASSERT(DUK_HOBJECT_IS_ARRAY(h)); - - tv1 = DUK__REGP_BC(ins); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1)); -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1)); - len = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1); -#else - len = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1); -#endif - ((duk_harray *) h)->length = len; - break; - } - - case DUK_OP_INITENUM: { - duk__handle_op_initenum(thr, ins); - break; - } - - case DUK_OP_NEXTENUM: { - curr_pc += duk__handle_op_nextenum(thr, ins); - break; - } - - case DUK_OP_INVLHS: { - DUK_ERROR_REFERENCE(thr, DUK_STR_INVALID_LVALUE); - DUK_UNREACHABLE(); - break; - } - - case DUK_OP_DEBUGGER: { - /* Opcode only emitted by compiler when debugger - * support is enabled. Ignore it silently without - * debugger support, in case it has been loaded - * from precompiled bytecode. - */ -#if defined(DUK_USE_DEBUGGER_SUPPORT) - if (duk_debug_is_attached(thr->heap)) { - DUK_D(DUK_DPRINT("DEBUGGER statement encountered, halt execution")); - DUK__SYNC_AND_NULL_CURR_PC(); - duk_debug_halt_execution(thr, 1 /*use_prev_pc*/); - DUK_D(DUK_DPRINT("DEBUGGER statement finished, resume execution")); - goto restart_execution; - } else { - DUK_D(DUK_DPRINT("DEBUGGER statement ignored, debugger not attached")); - } -#else - DUK_D(DUK_DPRINT("DEBUGGER statement ignored, no debugger support")); -#endif - break; - } - - case DUK_OP_NOP: { - /* Nop, ignored, but ABC fields may carry a value e.g. - * for indirect opcode handling. - */ - break; - } - - case DUK_OP_INVALID: { - DUK_ERROR_FMT1(thr, DUK_ERR_ERROR, "INVALID opcode (%ld)", (long) DUK_DEC_ABC(ins)); - break; - } - -#if defined(DUK_USE_ES6) - case DUK_OP_NEWTARGET: { - /* https://www.ecma-international.org/ecma-262/6.0/#sec-meta-properties-runtime-semantics-evaluation - * https://www.ecma-international.org/ecma-262/6.0/#sec-getnewtarget - * - * No newTarget support now, so as a first approximation - * use the resolved (non-bound) target function. - */ - /* XXX: C API: push_new_target()? */ - duk_activation *act; - - act = thr->callstack_curr; - DUK_ASSERT(act != NULL); - - /* Check CONSTRUCT flag from current function, or if running - * direct eval, from a non-direct-eval parent (with possibly - * more than one nested direct eval). An alternative to this - * would be to store [[NewTarget]] as a hidden symbol of the - * lexical scope, and then just look up that variable. - */ - for (;;) { - if (act == NULL) { - duk_push_undefined(thr); - break; - } - if (act->flags & DUK_ACT_FLAG_CONSTRUCT) { - duk_push_tval(thr, &act->tv_func); - break; - } else if (act->flags & DUK_ACT_FLAG_DIRECT_EVAL) { - act = act->parent; - } else { - duk_push_undefined(thr); - break; - } - } - - DUK__REPLACE_TOP_BC_BREAK(); - } -#endif /* DUK_USE_ES6 */ - -#if !defined(DUK_USE_EXEC_PREFER_SIZE) -#if !defined(DUK_USE_ES7_EXP_OPERATOR) - case DUK_OP_EXP_RR: - case DUK_OP_EXP_CR: - case DUK_OP_EXP_RC: - case DUK_OP_EXP_CC: -#endif -#if !defined(DUK_USE_ES6) - case DUK_OP_NEWTARGET: -#endif -#if !defined(DUK_USE_VERBOSE_ERRORS) - case DUK_OP_GETPROPC_RR: - case DUK_OP_GETPROPC_CR: - case DUK_OP_GETPROPC_RC: - case DUK_OP_GETPROPC_CC: -#endif - case DUK_OP_UNUSED207: - case DUK_OP_UNUSED212: - case DUK_OP_UNUSED213: - case DUK_OP_UNUSED214: - case DUK_OP_UNUSED215: - case DUK_OP_UNUSED216: - case DUK_OP_UNUSED217: - case DUK_OP_UNUSED218: - case DUK_OP_UNUSED219: - case DUK_OP_UNUSED220: - case DUK_OP_UNUSED221: - case DUK_OP_UNUSED222: - case DUK_OP_UNUSED223: - case DUK_OP_UNUSED224: - case DUK_OP_UNUSED225: - case DUK_OP_UNUSED226: - case DUK_OP_UNUSED227: - case DUK_OP_UNUSED228: - case DUK_OP_UNUSED229: - case DUK_OP_UNUSED230: - case DUK_OP_UNUSED231: - case DUK_OP_UNUSED232: - case DUK_OP_UNUSED233: - case DUK_OP_UNUSED234: - case DUK_OP_UNUSED235: - case DUK_OP_UNUSED236: - case DUK_OP_UNUSED237: - case DUK_OP_UNUSED238: - case DUK_OP_UNUSED239: - case DUK_OP_UNUSED240: - case DUK_OP_UNUSED241: - case DUK_OP_UNUSED242: - case DUK_OP_UNUSED243: - case DUK_OP_UNUSED244: - case DUK_OP_UNUSED245: - case DUK_OP_UNUSED246: - case DUK_OP_UNUSED247: - case DUK_OP_UNUSED248: - case DUK_OP_UNUSED249: - case DUK_OP_UNUSED250: - case DUK_OP_UNUSED251: - case DUK_OP_UNUSED252: - case DUK_OP_UNUSED253: - case DUK_OP_UNUSED254: - case DUK_OP_UNUSED255: - /* Force all case clauses to map to an actual handler - * so that the compiler can emit a jump without a bounds - * check: the switch argument is a duk_uint8_t so that - * the compiler may be able to figure it out. This is - * a small detail and obviously compiler dependent. - */ - /* default: clause omitted on purpose */ -#else /* DUK_USE_EXEC_PREFER_SIZE */ - default: -#endif /* DUK_USE_EXEC_PREFER_SIZE */ - { - /* Default case catches invalid/unsupported opcodes. */ - DUK_D(DUK_DPRINT("invalid opcode: %ld - %!I", (long) op, ins)); - DUK__INTERNAL_ERROR("invalid opcode"); - break; - } - - } /* end switch */ - - continue; - - /* Some shared exit paths for opcode handling below. These - * are mostly useful to reduce code footprint when multiple - * opcodes have a similar epilogue (like replacing stack top - * with index 'a'). - */ - -#if defined(DUK_USE_EXEC_PREFER_SIZE) - replace_top_a: - DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); - continue; - replace_top_bc: - DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); - continue; -#endif - } - DUK_UNREACHABLE(); - -#if !defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS) - internal_error: - DUK_ERROR_INTERNAL(thr); -#endif -} - -/* automatic undefs */ -#undef DUK__BYTEOFF_A -#undef DUK__BYTEOFF_B -#undef DUK__BYTEOFF_BC -#undef DUK__BYTEOFF_C -#undef DUK__COMPARE_BODY -#undef DUK__CONST -#undef DUK__CONSTP -#undef DUK__CONSTP_A -#undef DUK__CONSTP_B -#undef DUK__CONSTP_BC -#undef DUK__CONSTP_C -#undef DUK__DELPROP_BODY -#undef DUK__EQ_BODY -#undef DUK__FUN -#undef DUK__GETPROPC_BODY -#undef DUK__GETPROP_BODY -#undef DUK__GE_BODY -#undef DUK__GT_BODY -#undef DUK__INLINE_PERF -#undef DUK__INSTOF_BODY -#undef DUK__INTERNAL_ERROR -#undef DUK__INT_NOACTION -#undef DUK__INT_RESTART -#undef DUK__IN_BODY -#undef DUK__LE_BODY -#undef DUK__LONGJMP_RESTART -#undef DUK__LONGJMP_RETHROW -#undef DUK__LOOKUP_INDIRECT -#undef DUK__LT_BODY -#undef DUK__MASK_A -#undef DUK__MASK_B -#undef DUK__MASK_BC -#undef DUK__MASK_C -#undef DUK__NEQ_BODY -#undef DUK__NOINLINE_PERF -#undef DUK__PUTPROP_BODY -#undef DUK__RCBIT_B -#undef DUK__RCBIT_C -#undef DUK__REG -#undef DUK__REGCONSTP_B -#undef DUK__REGCONSTP_C -#undef DUK__REGP -#undef DUK__REGP_A -#undef DUK__REGP_B -#undef DUK__REGP_BC -#undef DUK__REGP_C -#undef DUK__REPLACE_BOOL_A_BREAK -#undef DUK__REPLACE_TOP_A_BREAK -#undef DUK__REPLACE_TOP_BC_BREAK -#undef DUK__REPLACE_TO_TVPTR -#undef DUK__RETHAND_FINISHED -#undef DUK__RETHAND_RESTART -#undef DUK__RETURN_SHARED -#undef DUK__SEQ_BODY -#undef DUK__SHIFT_A -#undef DUK__SHIFT_B -#undef DUK__SHIFT_BC -#undef DUK__SHIFT_C -#undef DUK__SNEQ_BODY -#undef DUK__STRICT -#undef DUK__SYNC_AND_NULL_CURR_PC -#undef DUK__SYNC_CURR_PC -#undef DUK__TVAL_SHIFT -#line 1 "duk_js_ops.c" -/* - * Ecmascript specification algorithm and conversion helpers. - * - * These helpers encapsulate the primitive Ecmascript operation semantics, - * and are used by the bytecode executor and the API (among other places). - * Some primitives are only implemented as part of the API and have no - * "internal" helper. This is the case when an internal helper would not - * really be useful; e.g. the operation is rare, uses value stack heavily, - * etc. - * - * The operation arguments depend on what is required to implement - * the operation: - * - * - If an operation is simple and stateless, and has no side - * effects, it won't take an duk_hthread argument and its - * arguments may be duk_tval pointers (which are safe as long - * as no side effects take place). - * - * - If complex coercions are required (e.g. a "ToNumber" coercion) - * or errors may be thrown, the operation takes an duk_hthread - * argument. This also implies that the operation may have - * arbitrary side effects, invalidating any duk_tval pointers. - * - * - For operations with potential side effects, arguments can be - * taken in several ways: - * - * a) as duk_tval pointers, which makes sense if the "common case" - * can be resolved without side effects (e.g. coercion); the - * arguments are pushed to the valstack for coercion if - * necessary - * - * b) as duk_tval values - * - * c) implicitly on value stack top - * - * d) as indices to the value stack - * - * Future work: - * - * - Argument styles may not be the most sensible in every case now. - * - * - In-place coercions might be useful for several operations, if - * in-place coercion is OK for the bytecode executor and the API. - */ - -/* #include duk_internal.h -> already included */ - -/* - * ToPrimitive() (E5 Section 9.1) - * - * ==> implemented in the API. - */ - -/* - * ToBoolean() (E5 Section 9.2) - */ - -DUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) { - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: - return 0; - case DUK_TAG_BOOLEAN: - DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1); - return DUK_TVAL_GET_BOOLEAN(tv); - case DUK_TAG_STRING: { - /* Symbols ToBoolean() coerce to true, regardless of their - * description. This happens with no explicit check because - * of the symbol representation byte prefix. - */ - duk_hstring *h = DUK_TVAL_GET_STRING(tv); - DUK_ASSERT(h != NULL); - return (DUK_HSTRING_GET_BYTELEN(h) > 0 ? 1 : 0); - } - case DUK_TAG_OBJECT: { - return 1; - } - case DUK_TAG_BUFFER: { - /* Mimic Uint8Array semantics: objects coerce true, regardless - * of buffer length (zero or not) or context. - */ - return 1; - } - case DUK_TAG_POINTER: { - void *p = DUK_TVAL_GET_POINTER(tv); - return (p != NULL ? 1 : 0); - } - case DUK_TAG_LIGHTFUNC: { - return 1; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: - if (DUK_TVAL_GET_FASTINT(tv) != 0) { - return 1; - } else { - return 0; - } -#endif - default: { - /* number */ - duk_double_t d; -#if defined(DUK_USE_PREFER_SIZE) - int c; -#endif - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); - d = DUK_TVAL_GET_DOUBLE(tv); -#if defined(DUK_USE_PREFER_SIZE) - c = DUK_FPCLASSIFY((double) d); - if (c == DUK_FP_ZERO || c == DUK_FP_NAN) { - return 0; - } else { - return 1; - } -#else - DUK_ASSERT(duk_double_is_nan_or_zero(d) == 0 || duk_double_is_nan_or_zero(d) == 1); - return duk_double_is_nan_or_zero(d) ^ 1; -#endif - } - } - DUK_UNREACHABLE(); -} - -/* - * ToNumber() (E5 Section 9.3) - * - * Value to convert must be on stack top, and is popped before exit. - * - * See: http://www.cs.indiana.edu/~burger/FP-Printing-PLDI96.pdf - * http://www.cs.indiana.edu/~burger/fp/index.html - * - * Notes on the conversion: - * - * - There are specific requirements on the accuracy of the conversion - * through a "Mathematical Value" (MV), so this conversion is not - * trivial. - * - * - Quick rejects (e.g. based on first char) are difficult because - * the grammar allows leading and trailing white space. - * - * - Quick reject based on string length is difficult even after - * accounting for white space; there may be arbitrarily many - * decimal digits. - * - * - Standard grammar allows decimal values ("123"), hex values - * ("0x123") and infinities - * - * - Unlike source code literals, ToNumber() coerces empty strings - * and strings with only whitespace to zero (not NaN). - */ - -/* E5 Section 9.3.1 */ -DUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) { - duk_small_uint_t s2n_flags; - duk_double_t d; - - DUK_ASSERT(duk_is_string(thr, -1)); - - /* Quite lenient, e.g. allow empty as zero, but don't allow trailing - * garbage. - */ - s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | - DUK_S2N_FLAG_ALLOW_EXP | - DUK_S2N_FLAG_ALLOW_PLUS | - DUK_S2N_FLAG_ALLOW_MINUS | - DUK_S2N_FLAG_ALLOW_INF | - DUK_S2N_FLAG_ALLOW_FRAC | - DUK_S2N_FLAG_ALLOW_NAKED_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO | - DUK_S2N_FLAG_ALLOW_LEADING_ZERO | - DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT | - DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT | - DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT; - - duk_numconv_parse(thr, 10 /*radix*/, s2n_flags); - -#if defined(DUK_USE_PREFER_SIZE) - d = duk_get_number(thr, -1); - duk_pop_unsafe(thr); -#else - thr->valstack_top--; - DUK_ASSERT(DUK_TVAL_IS_NUMBER(thr->valstack_top)); - DUK_ASSERT(DUK_TVAL_IS_DOUBLE(thr->valstack_top)); /* no fastint conversion in numconv now */ - DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(thr->valstack_top)); - d = DUK_TVAL_GET_DOUBLE(thr->valstack_top); /* assumes not a fastint */ - DUK_TVAL_SET_UNDEFINED(thr->valstack_top); -#endif - - return d; -} - -DUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(tv != NULL); - - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_UNDEFINED: { - /* return a specific NaN (although not strictly necessary) */ - duk_double_union du; - DUK_DBLUNION_SET_NAN(&du); - DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); - return du.d; - } - case DUK_TAG_NULL: { - /* +0.0 */ - return 0.0; - } - case DUK_TAG_BOOLEAN: { - if (DUK_TVAL_IS_BOOLEAN_TRUE(tv)) { - return 1.0; - } - return 0.0; - } - case DUK_TAG_STRING: { - /* For Symbols ToNumber() is always a TypeError. */ - duk_hstring *h = DUK_TVAL_GET_STRING(tv); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) { - DUK_ERROR_TYPE(thr, DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL); - } - duk_push_hstring(thr, h); - return duk__tonumber_string_raw(thr); - } - case DUK_TAG_BUFFER: /* plain buffer treated like object */ - case DUK_TAG_OBJECT: { - duk_double_t d; - duk_push_tval(thr, tv); - duk_to_primitive(thr, -1, DUK_HINT_NUMBER); /* 'tv' becomes invalid */ - - /* recursive call for a primitive value (guaranteed not to cause second - * recursion). - */ - DUK_ASSERT(duk_get_tval(thr, -1) != NULL); - d = duk_js_tonumber(thr, duk_get_tval(thr, -1)); - - duk_pop_unsafe(thr); - return d; - } - case DUK_TAG_POINTER: { - /* Coerce like boolean */ - void *p = DUK_TVAL_GET_POINTER(tv); - return (p != NULL ? 1.0 : 0.0); - } - case DUK_TAG_LIGHTFUNC: { - /* +(function(){}) -> NaN */ - return DUK_DOUBLE_NAN; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: - return (duk_double_t) DUK_TVAL_GET_FASTINT(tv); -#endif - default: { - /* number */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv)); - DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); - return DUK_TVAL_GET_DOUBLE(tv); - } - } - - DUK_UNREACHABLE(); -} - -/* - * ToInteger() (E5 Section 9.4) - */ - -/* exposed, used by e.g. duk_bi_date.c */ -DUK_INTERNAL duk_double_t duk_js_tointeger_number(duk_double_t x) { -#if defined(DUK_USE_PREFER_SIZE) - duk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x); - - if (DUK_UNLIKELY(c == DUK_FP_NAN)) { - return 0.0; - } else if (DUK_UNLIKELY(c == DUK_FP_INFINITE)) { - return x; - } else { - /* Finite, including neg/pos zero. Neg zero sign must be - * preserved. - */ - return duk_double_trunc_towards_zero(x); - } -#else /* DUK_USE_PREFER_SIZE */ - /* NaN and Infinity have the same exponent so it's a cheap - * initial check for the rare path. - */ - if (DUK_UNLIKELY(duk_double_is_nan_or_inf(x) != 0U)) { - if (duk_double_is_nan(x)) { - return 0.0; - } else { - return x; - } - } else { - return duk_double_trunc_towards_zero(x); - } -#endif /* DUK_USE_PREFER_SIZE */ -} - -DUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) { - /* XXX: fastint */ - duk_double_t d = duk_js_tonumber(thr, tv); /* invalidates tv */ - return duk_js_tointeger_number(d); -} - -/* - * ToInt32(), ToUint32(), ToUint16() (E5 Sections 9.5, 9.6, 9.7) - */ - -/* combined algorithm matching E5 Sections 9.5 and 9.6 */ -DUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t is_toint32) { -#if defined (DUK_USE_PREFER_SIZE) - duk_small_int_t c; -#endif - -#if defined (DUK_USE_PREFER_SIZE) - c = (duk_small_int_t) DUK_FPCLASSIFY(x); - if (c == DUK_FP_NAN || c == DUK_FP_ZERO || c == DUK_FP_INFINITE) { - return 0.0; - } -#else - if (duk_double_is_nan_zero_inf(x)) { - return 0.0; - } -#endif - - /* x = sign(x) * floor(abs(x)), i.e. truncate towards zero, keep sign */ - x = duk_double_trunc_towards_zero(x); - - /* NOTE: fmod(x) result sign is same as sign of x, which - * differs from what Javascript wants (see Section 9.6). - */ - - x = DUK_FMOD(x, DUK_DOUBLE_2TO32); /* -> x in ]-2**32, 2**32[ */ - - if (x < 0.0) { - x += DUK_DOUBLE_2TO32; - } - DUK_ASSERT(x >= 0 && x < DUK_DOUBLE_2TO32); /* -> x in [0, 2**32[ */ - - if (is_toint32) { - if (x >= DUK_DOUBLE_2TO31) { - /* x in [2**31, 2**32[ */ - - x -= DUK_DOUBLE_2TO32; /* -> x in [-2**31,2**31[ */ - } - } - - return x; -} - -DUK_INTERNAL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv) { - duk_double_t d; - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - return DUK_TVAL_GET_FASTINT_I32(tv); - } -#endif - - d = duk_js_tonumber(thr, tv); /* invalidates tv */ - d = duk__toint32_touint32_helper(d, 1); - DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL); - DUK_ASSERT(d >= -2147483648.0 && d <= 2147483647.0); /* [-0x80000000,0x7fffffff] */ - DUK_ASSERT(d == ((duk_double_t) ((duk_int32_t) d))); /* whole, won't clip */ - return (duk_int32_t) d; -} - - -DUK_INTERNAL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv) { - duk_double_t d; - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv)) { - return DUK_TVAL_GET_FASTINT_U32(tv); - } -#endif - - d = duk_js_tonumber(thr, tv); /* invalidates tv */ - d = duk__toint32_touint32_helper(d, 0); - DUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL); - DUK_ASSERT(d >= 0.0 && d <= 4294967295.0); /* [0x00000000, 0xffffffff] */ - DUK_ASSERT(d == ((duk_double_t) ((duk_uint32_t) d))); /* whole, won't clip */ - return (duk_uint32_t) d; - -} - -DUK_INTERNAL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv) { - /* should be a safe way to compute this */ - return (duk_uint16_t) (duk_js_touint32(thr, tv) & 0x0000ffffU); -} - -/* - * ToString() (E5 Section 9.8) - * ToObject() (E5 Section 9.9) - * CheckObjectCoercible() (E5 Section 9.10) - * IsCallable() (E5 Section 9.11) - * - * ==> implemented in the API. - */ - -/* - * Loose equality, strict equality, and SameValue (E5 Sections 11.9.1, 11.9.4, - * 9.12). These have much in common so they can share some helpers. - * - * Future work notes: - * - * - Current implementation (and spec definition) has recursion; this should - * be fixed if possible. - * - * - String-to-number coercion should be possible without going through the - * value stack (and be more compact) if a shared helper is invoked. - */ - -/* Note that this is the same operation for strict and loose equality: - * - E5 Section 11.9.3, step 1.c (loose) - * - E5 Section 11.9.6, step 4 (strict) - */ - -DUK_LOCAL duk_bool_t duk__js_equals_number(duk_double_t x, duk_double_t y) { -#if defined(DUK_USE_PARANOID_MATH) - /* Straightforward algorithm, makes fewer compiler assumptions. */ - duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); - duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); - if (cx == DUK_FP_NAN || cy == DUK_FP_NAN) { - return 0; - } - if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) { - return 1; - } - if (x == y) { - return 1; - } - return 0; -#else /* DUK_USE_PARANOID_MATH */ - /* Better equivalent algorithm. If the compiler is compliant, C and - * Ecmascript semantics are identical for this particular comparison. - * In particular, NaNs must never compare equal and zeroes must compare - * equal regardless of sign. Could also use a macro, but this inlines - * already nicely (no difference on gcc, for instance). - */ - if (x == y) { - /* IEEE requires that NaNs compare false */ - DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN); - DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN); - return 1; - } else { - /* IEEE requires that zeros compare the same regardless - * of their signed, so if both x and y are zeroes, they - * are caught above. - */ - DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO)); - return 0; - } -#endif /* DUK_USE_PARANOID_MATH */ -} - -DUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) { -#if defined(DUK_USE_PARANOID_MATH) - duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); - duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); - - if (cx == DUK_FP_NAN && cy == DUK_FP_NAN) { - /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */ - return 1; - } - if (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) { - /* Note: cannot assume that a non-zero return value of signbit() would - * always be the same -- hence cannot (portably) use something like: - * - * signbit(x) == signbit(y) - */ - duk_small_int_t sx = DUK_SIGNBIT(x) ? 1 : 0; - duk_small_int_t sy = DUK_SIGNBIT(y) ? 1 : 0; - return (sx == sy); - } - - /* normal comparison; known: - * - both x and y are not NaNs (but one of them can be) - * - both x and y are not zero (but one of them can be) - * - x and y may be denormal or infinite - */ - - return (x == y); -#else /* DUK_USE_PARANOID_MATH */ - duk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x); - duk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y); - - if (x == y) { - /* IEEE requires that NaNs compare false */ - DUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN); - DUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN); - - /* Using classification has smaller footprint than direct comparison. */ - if (DUK_UNLIKELY(cx == DUK_FP_ZERO && cy == DUK_FP_ZERO)) { - /* Note: cannot assume that a non-zero return value of signbit() would - * always be the same -- hence cannot (portably) use something like: - * - * signbit(x) == signbit(y) - */ - return duk_double_same_sign(x, y); - } - return 1; - } else { - /* IEEE requires that zeros compare the same regardless - * of their sign, so if both x and y are zeroes, they - * are caught above. - */ - DUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO)); - - /* Difference to non-strict/strict comparison is that NaNs compare - * equal and signed zero signs matter. - */ - if (DUK_UNLIKELY(cx == DUK_FP_NAN && cy == DUK_FP_NAN)) { - /* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */ - return 1; - } - return 0; - } -#endif /* DUK_USE_PARANOID_MATH */ -} - -DUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) { - duk_uint_t type_mask_x; - duk_uint_t type_mask_y; - - /* If flags != 0 (strict or SameValue), thr can be NULL. For loose - * equals comparison it must be != NULL. - */ - DUK_ASSERT(flags != 0 || thr != NULL); - - /* - * Same type? - * - * Note: since number values have no explicit tag in the 8-byte - * representation, need the awkward if + switch. - */ - -#if defined(DUK_USE_FASTINT) - if (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) { - if (DUK_TVAL_GET_FASTINT(tv_x) == DUK_TVAL_GET_FASTINT(tv_y)) { - return 1; - } else { - return 0; - } - } - else -#endif - if (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) { - duk_double_t d1, d2; - - /* Catches both doubles and cases where only one argument is - * a fastint so can't assume a double. - */ - d1 = DUK_TVAL_GET_NUMBER(tv_x); - d2 = DUK_TVAL_GET_NUMBER(tv_y); - if (DUK_UNLIKELY((flags & DUK_EQUALS_FLAG_SAMEVALUE) != 0)) { - /* SameValue */ - return duk__js_samevalue_number(d1, d2); - } else { - /* equals and strict equals */ - return duk__js_equals_number(d1, d2); - } - } else if (DUK_TVAL_GET_TAG(tv_x) == DUK_TVAL_GET_TAG(tv_y)) { - switch (DUK_TVAL_GET_TAG(tv_x)) { - case DUK_TAG_UNDEFINED: - case DUK_TAG_NULL: { - return 1; - } - case DUK_TAG_BOOLEAN: { - return DUK_TVAL_GET_BOOLEAN(tv_x) == DUK_TVAL_GET_BOOLEAN(tv_y); - } - case DUK_TAG_POINTER: { - return DUK_TVAL_GET_POINTER(tv_x) == DUK_TVAL_GET_POINTER(tv_y); - } - case DUK_TAG_STRING: - case DUK_TAG_OBJECT: { - /* Heap pointer comparison suffices for strings and objects. - * Symbols compare equal if they have the same internal - * representation; again heap pointer comparison suffices. - */ - return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); - } - case DUK_TAG_BUFFER: { - /* In Duktape 2.x plain buffers mimic Uint8Array objects - * so always compare by heap pointer. In Duktape 1.x - * strict comparison would compare heap pointers and - * non-strict would compare contents. - */ - return DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y); - } - case DUK_TAG_LIGHTFUNC: { - /* At least 'magic' has a significant impact on function - * identity. - */ - duk_small_uint_t lf_flags_x; - duk_small_uint_t lf_flags_y; - duk_c_function func_x; - duk_c_function func_y; - - DUK_TVAL_GET_LIGHTFUNC(tv_x, func_x, lf_flags_x); - DUK_TVAL_GET_LIGHTFUNC(tv_y, func_y, lf_flags_y); - return ((func_x == func_y) && (lf_flags_x == lf_flags_y)) ? 1 : 0; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x)); - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_y)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_y)); - DUK_UNREACHABLE(); - return 0; - } - } - } - - if ((flags & (DUK_EQUALS_FLAG_STRICT | DUK_EQUALS_FLAG_SAMEVALUE)) != 0) { - return 0; - } - - DUK_ASSERT(flags == 0); /* non-strict equality from here on */ - - /* - * Types are different; various cases for non-strict comparison - * - * Since comparison is symmetric, we use a "swap trick" to reduce - * code size. - */ - - type_mask_x = duk_get_type_mask_tval(tv_x); - type_mask_y = duk_get_type_mask_tval(tv_y); - - /* Undefined/null are considered equal (e.g. "null == undefined" -> true). */ - if ((type_mask_x & (DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL)) && - (type_mask_y & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED))) { - return 1; - } - - /* Number/string -> coerce string to number (e.g. "'1.5' == 1.5" -> true). */ - if ((type_mask_x & DUK_TYPE_MASK_NUMBER) && (type_mask_y & DUK_TYPE_MASK_STRING)) { - if (!DUK_TVAL_STRING_IS_SYMBOL(tv_y)) { - duk_double_t d1, d2; - d1 = DUK_TVAL_GET_NUMBER(tv_x); - d2 = duk_to_number_tval(thr, tv_y); - return duk__js_equals_number(d1, d2); - } - } - if ((type_mask_x & DUK_TYPE_MASK_STRING) && (type_mask_y & DUK_TYPE_MASK_NUMBER)) { - if (!DUK_TVAL_STRING_IS_SYMBOL(tv_x)) { - duk_double_t d1, d2; - d1 = DUK_TVAL_GET_NUMBER(tv_y); - d2 = duk_to_number_tval(thr, tv_x); - return duk__js_equals_number(d1, d2); - } - } - - /* Boolean/any -> coerce boolean to number and try again. If boolean is - * compared to a pointer, the final comparison after coercion now always - * yields false (as pointer vs. number compares to false), but this is - * not special cased. - * - * ToNumber(bool) is +1.0 or 0.0. Tagged boolean value is always 0 or 1. - */ - if (type_mask_x & DUK_TYPE_MASK_BOOLEAN) { - DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_x) == 0 || DUK_TVAL_GET_BOOLEAN(tv_x) == 1); - duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_x)); - duk_push_tval(thr, tv_y); - goto recursive_call; - } - if (type_mask_y & DUK_TYPE_MASK_BOOLEAN) { - DUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_y) == 0 || DUK_TVAL_GET_BOOLEAN(tv_y) == 1); - duk_push_tval(thr, tv_x); - duk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_y)); - goto recursive_call; - } - - /* String-number-symbol/object -> coerce object to primitive (apparently without hint), then try again. */ - if ((type_mask_x & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER)) && - (type_mask_y & DUK_TYPE_MASK_OBJECT)) { - /* No symbol check needed because symbols and strings are accepted. */ - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - duk_to_primitive(thr, -1, DUK_HINT_NONE); /* apparently no hint? */ - goto recursive_call; - } - if ((type_mask_x & DUK_TYPE_MASK_OBJECT) && - (type_mask_y & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER))) { - /* No symbol check needed because symbols and strings are accepted. */ - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - duk_to_primitive(thr, -2, DUK_HINT_NONE); /* apparently no hint? */ - goto recursive_call; - } - - /* Nothing worked -> not equal. */ - return 0; - - recursive_call: - /* Shared code path to call the helper again with arguments on stack top. */ - { - duk_bool_t rc; - rc = duk_js_equals_helper(thr, - DUK_GET_TVAL_NEGIDX(thr, -2), - DUK_GET_TVAL_NEGIDX(thr, -1), - 0 /*flags:nonstrict*/); - duk_pop_2_unsafe(thr); - return rc; - } -} - -/* - * Comparisons (x >= y, x > y, x <= y, x < y) - * - * E5 Section 11.8.5: implement 'x < y' and then use negate and eval_left_first - * flags to get the rest. - */ - -/* XXX: this should probably just operate on the stack top, because it - * needs to push stuff on the stack anyway... - */ - -DUK_INTERNAL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2) { - duk_size_t prefix_len; - duk_small_int_t rc; - - prefix_len = (len1 <= len2 ? len1 : len2); - - /* DUK_MEMCMP() is guaranteed to return zero (equal) for zero length - * inputs so no zero length check is needed. - */ - rc = DUK_MEMCMP((const void *) buf1, - (const void *) buf2, - (size_t) prefix_len); - - if (rc < 0) { - return -1; - } else if (rc > 0) { - return 1; - } - - /* prefix matches, lengths matter now */ - if (len1 < len2) { - /* e.g. "x" < "xx" */ - return -1; - } else if (len1 > len2) { - return 1; - } - - return 0; -} - -DUK_INTERNAL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2) { - /* - * String comparison (E5 Section 11.8.5, step 4), which - * needs to compare codepoint by codepoint. - * - * However, UTF-8 allows us to use strcmp directly: the shared - * prefix will be encoded identically (UTF-8 has unique encoding) - * and the first differing character can be compared with a simple - * unsigned byte comparison (which strcmp does). - * - * This will not work properly for non-xutf-8 strings, but this - * is not an issue for compliance. - */ - - DUK_ASSERT(h1 != NULL); - DUK_ASSERT(h2 != NULL); - - return duk_js_data_compare((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h1), - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h2), - (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1), - (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2)); -} - -#if 0 /* unused */ -DUK_INTERNAL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2) { - /* Similar to String comparison. */ - - DUK_ASSERT(h1 != NULL); - DUK_ASSERT(h2 != NULL); - DUK_UNREF(heap); - - return duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h1), - (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h2), - (duk_size_t) DUK_HBUFFER_GET_SIZE(h1), - (duk_size_t) DUK_HBUFFER_GET_SIZE(h2)); -} -#endif - -#if defined(DUK_USE_FASTINT) -DUK_LOCAL duk_bool_t duk__compare_fastint(duk_bool_t retval, duk_int64_t v1, duk_int64_t v2) { - DUK_ASSERT(retval == 0 || retval == 1); - if (v1 < v2) { - return retval ^ 1; - } else { - return retval; - } -} -#endif - -#if defined(DUK_USE_PARANOID_MATH) -DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { - duk_small_int_t c1, s1, c2, s2; - - DUK_ASSERT(retval == 0 || retval == 1); - c1 = (duk_small_int_t) DUK_FPCLASSIFY(d1); - s1 = (duk_small_int_t) DUK_SIGNBIT(d1); - c2 = (duk_small_int_t) DUK_FPCLASSIFY(d2); - s2 = (duk_small_int_t) DUK_SIGNBIT(d2); - - if (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) { - return 0; /* Always false, regardless of negation. */ - } - - if (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) { - /* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0, - * steps e, f, and g. - */ - return retval; /* false */ - } - - if (d1 == d2) { - return retval; /* false */ - } - - if (c1 == DUK_FP_INFINITE && s1 == 0) { - /* x == +Infinity */ - return retval; /* false */ - } - - if (c2 == DUK_FP_INFINITE && s2 == 0) { - /* y == +Infinity */ - return retval ^ 1; /* true */ - } - - if (c2 == DUK_FP_INFINITE && s2 != 0) { - /* y == -Infinity */ - return retval; /* false */ - } - - if (c1 == DUK_FP_INFINITE && s1 != 0) { - /* x == -Infinity */ - return retval ^ 1; /* true */ - } - - if (d1 < d2) { - return retval ^ 1; /* true */ - } - - return retval; /* false */ -} -#else /* DUK_USE_PARANOID_MATH */ -DUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) { - /* This comparison tree relies doesn't match the exact steps in - * E5 Section 11.8.5 but should produce the same results. The - * steps rely on exact IEEE semantics for NaNs, etc. - */ - - DUK_ASSERT(retval == 0 || retval == 1); - if (d1 < d2) { - /* In no case should both (d1 < d2) and (d2 < d1) be true. - * It's possible that neither is true though, and that's - * handled below. - */ - DUK_ASSERT(!(d2 < d1)); - - /* - d1 < d2, both d1/d2 are normals (not Infinity, not NaN) - * - d2 is +Infinity, d1 != +Infinity and NaN - * - d1 is -Infinity, d2 != -Infinity and NaN - */ - return retval ^ 1; - } else { - if (d2 < d1) { - /* - !(d1 < d2), both d1/d2 are normals (not Infinity, not NaN) - * - d1 is +Infinity, d2 != +Infinity and NaN - * - d2 is -Infinity, d1 != -Infinity and NaN - */ - return retval; - } else { - /* - d1 and/or d2 is NaN - * - d1 and d2 are both +/- 0 - * - d1 == d2 (including infinities) - */ - if (duk_double_is_nan(d1) || duk_double_is_nan(d2)) { - /* Note: undefined from Section 11.8.5 always - * results in false return (see e.g. Section - * 11.8.3) - hence special treatment here. - */ - return 0; /* zero regardless of negation */ - } else { - return retval; - } - } - } -} -#endif /* DUK_USE_PARANOID_MATH */ - -DUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) { - duk_double_t d1, d2; - duk_small_int_t rc; - duk_bool_t retval; - - DUK_ASSERT(DUK_COMPARE_FLAG_NEGATE == 1); /* Rely on this flag being lowest. */ - retval = flags & DUK_COMPARE_FLAG_NEGATE; - DUK_ASSERT(retval == 0 || retval == 1); - - /* Fast path for fastints */ -#if defined(DUK_USE_FASTINT) - if (DUK_LIKELY(DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y))) { - return duk__compare_fastint(retval, - DUK_TVAL_GET_FASTINT(tv_x), - DUK_TVAL_GET_FASTINT(tv_y)); - } -#endif /* DUK_USE_FASTINT */ - - /* Fast path for numbers (one of which may be a fastint) */ -#if !defined(DUK_USE_PREFER_SIZE) - if (DUK_LIKELY(DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y))) { - return duk__compare_number(retval, - DUK_TVAL_GET_NUMBER(tv_x), - DUK_TVAL_GET_NUMBER(tv_y)); - } -#endif - - /* Slow path */ - - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - - if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { - duk_to_primitive(thr, -2, DUK_HINT_NUMBER); - duk_to_primitive(thr, -1, DUK_HINT_NUMBER); - } else { - duk_to_primitive(thr, -1, DUK_HINT_NUMBER); - duk_to_primitive(thr, -2, DUK_HINT_NUMBER); - } - - /* Note: reuse variables */ - tv_x = DUK_GET_TVAL_NEGIDX(thr, -2); - tv_y = DUK_GET_TVAL_NEGIDX(thr, -1); - - if (DUK_TVAL_IS_STRING(tv_x) && DUK_TVAL_IS_STRING(tv_y)) { - duk_hstring *h1 = DUK_TVAL_GET_STRING(tv_x); - duk_hstring *h2 = DUK_TVAL_GET_STRING(tv_y); - DUK_ASSERT(h1 != NULL); - DUK_ASSERT(h2 != NULL); - - if (DUK_LIKELY(!DUK_HSTRING_HAS_SYMBOL(h1) && !DUK_HSTRING_HAS_SYMBOL(h2))) { - rc = duk_js_string_compare(h1, h2); - duk_pop_2_unsafe(thr); - if (rc < 0) { - return retval ^ 1; - } else { - return retval; - } - } - - /* One or both are Symbols: fall through to handle in the - * generic path. Concretely, ToNumber() will fail. - */ - } - - /* Ordering should not matter (E5 Section 11.8.5, step 3.a). */ -#if 0 - if (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) { - d1 = duk_to_number_m2(thr); - d2 = duk_to_number_m1(thr); - } else { - d2 = duk_to_number_m1(thr); - d1 = duk_to_number_m2(thr); - } -#endif - d1 = duk_to_number_m2(thr); - d2 = duk_to_number_m1(thr); - - /* We want to duk_pop_2_unsafe(thr); because the values are numbers - * no decref check is needed. - */ -#if defined(DUK_USE_PREFER_SIZE) - duk_pop_2_nodecref_unsafe(thr); -#else - DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -2))); - DUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -1))); - DUK_ASSERT(duk_get_top(thr) >= 2); - thr->valstack_top -= 2; - tv_x = thr->valstack_top; - tv_y = tv_x + 1; - DUK_TVAL_SET_UNDEFINED(tv_x); /* Value stack policy */ - DUK_TVAL_SET_UNDEFINED(tv_y); -#endif - - return duk__compare_number(retval, d1, d2); -} - -/* - * instanceof - */ - -/* - * E5 Section 11.8.6 describes the main algorithm, which uses - * [[HasInstance]]. [[HasInstance]] is defined for only - * function objects: - * - * - Normal functions: - * E5 Section 15.3.5.3 - * - Functions established with Function.prototype.bind(): - * E5 Section 15.3.4.5.3 - * - * For other objects, a TypeError is thrown. - * - * Limited Proxy support: don't support 'getPrototypeOf' trap but - * continue lookup in Proxy target if the value is a Proxy. - */ - -DUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) { - duk_hobject *func; - duk_hobject *val; - duk_hobject *proto; - duk_tval *tv; - duk_bool_t skip_first; - duk_uint_t sanity; - - /* - * Get the values onto the stack first. It would be possible to cover - * some normal cases without resorting to the value stack. - * - * The right hand side could be a light function (as they generally - * behave like objects). Light functions never have a 'prototype' - * property so E5.1 Section 15.3.5.3 step 3 always throws a TypeError. - * Using duk_require_hobject() is thus correct (except for error msg). - */ - - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - func = duk_require_hobject(thr, -1); - DUK_ASSERT(func != NULL); - - /* - * For bound objects, [[HasInstance]] just calls the target function - * [[HasInstance]]. If that is again a bound object, repeat until - * we find a non-bound Function object. - * - * The bound function chain is now "collapsed" so there can be only - * one bound function in the chain. - */ - - if (!DUK_HOBJECT_IS_CALLABLE(func)) { - /* - * Note: of native Ecmascript objects, only Function instances - * have a [[HasInstance]] internal property. Custom objects might - * also have it, but not in current implementation. - * - * XXX: add a separate flag, DUK_HOBJECT_FLAG_ALLOW_INSTANCEOF? - */ - goto error_invalid_rval; - } - - if (DUK_HOBJECT_HAS_BOUNDFUNC(func)) { - duk_push_tval(thr, &((duk_hboundfunc *) func)->target); - duk_replace(thr, -2); - func = duk_require_hobject(thr, -1); /* lightfunc throws */ - - /* Rely on Function.prototype.bind() never creating bound - * functions whose target is not proper. - */ - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func)); - } - - /* - * 'func' is now a non-bound object which supports [[HasInstance]] - * (which here just means DUK_HOBJECT_FLAG_CALLABLE). Move on - * to execute E5 Section 15.3.5.3. - */ - - DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); - DUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func)); - - /* [ ... lval rval(func) ] */ - - /* For lightfuncs, buffers, and pointers start the comparison directly - * from the virtual prototype object. - */ - skip_first = 0; - tv = DUK_GET_TVAL_NEGIDX(thr, -2); - switch (DUK_TVAL_GET_TAG(tv)) { - case DUK_TAG_LIGHTFUNC: - val = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]; - DUK_ASSERT(val != NULL); - break; - case DUK_TAG_BUFFER: - val = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE]; - DUK_ASSERT(val != NULL); - break; - case DUK_TAG_POINTER: - val = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE]; - DUK_ASSERT(val != NULL); - break; - case DUK_TAG_OBJECT: - skip_first = 1; /* Ignore object itself on first round. */ - val = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(val != NULL); - break; - default: - goto pop2_and_false; - } - DUK_ASSERT(val != NULL); /* Loop doesn't actually rely on this. */ - - /* Look up .prototype of rval. Leave it on the value stack in case it - * has been virtualized (e.g. getter, Proxy trap). - */ - duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_PROTOTYPE); /* -> [ ... lval rval rval.prototype ] */ -#if defined(DUK_USE_VERBOSE_ERRORS) - proto = duk_get_hobject(thr, -1); - if (proto == NULL) { - goto error_invalid_rval_noproto; - } -#else - proto = duk_require_hobject(thr, -1); -#endif - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - do { - /* - * Note: prototype chain is followed BEFORE first comparison. This - * means that the instanceof lval is never itself compared to the - * rval.prototype property. This is apparently intentional, see E5 - * Section 15.3.5.3, step 4.a. - * - * Also note: - * - * js> (function() {}) instanceof Function - * true - * js> Function instanceof Function - * true - * - * For the latter, h_proto will be Function.prototype, which is the - * built-in Function prototype. Because Function.[[Prototype]] is - * also the built-in Function prototype, the result is true. - */ - - if (!val) { - goto pop3_and_false; - } - - DUK_ASSERT(val != NULL); -#if defined(DUK_USE_ES6_PROXY) - val = duk_hobject_resolve_proxy_target(val); -#endif - - if (skip_first) { - skip_first = 0; - } else if (val == proto) { - goto pop3_and_true; - } - - DUK_ASSERT(val != NULL); - val = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val); - } while (--sanity > 0); - - if (DUK_UNLIKELY(sanity == 0)) { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - DUK_UNREACHABLE(); - - pop2_and_false: - duk_pop_2_unsafe(thr); - return 0; - - pop3_and_false: - duk_pop_3_unsafe(thr); - return 0; - - pop3_and_true: - duk_pop_3_unsafe(thr); - return 1; - - error_invalid_rval: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL); - return 0; - -#if defined(DUK_USE_VERBOSE_ERRORS) - error_invalid_rval_noproto: - DUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO); - return 0; -#endif -} - -/* - * in - */ - -/* - * E5 Sections 11.8.7, 8.12.6. - * - * Basically just a property existence check using [[HasProperty]]. - */ - -DUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) { - duk_bool_t retval; - - /* - * Get the values onto the stack first. It would be possible to cover - * some normal cases without resorting to the value stack (e.g. if - * lval is already a string). - */ - - /* XXX: The ES5/5.1/6 specifications require that the key in 'key in obj' - * must be string coerced before the internal HasProperty() algorithm is - * invoked. A fast path skipping coercion could be safely implemented for - * numbers (as number-to-string coercion has no side effects). For ES2015 - * proxy behavior, the trap 'key' argument must be in a string coerced - * form (which is a shame). - */ - - /* TypeError if rval is not an object or object like (e.g. lightfunc - * or plain buffer). - */ - duk_push_tval(thr, tv_x); - duk_push_tval(thr, tv_y); - duk_require_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER); - - (void) duk_to_property_key_hstring(thr, -2); - - retval = duk_hobject_hasprop(thr, - DUK_GET_TVAL_NEGIDX(thr, -1), - DUK_GET_TVAL_NEGIDX(thr, -2)); - - duk_pop_2_unsafe(thr); - return retval; -} - -/* - * typeof - * - * E5 Section 11.4.3. - * - * Very straightforward. The only question is what to return for our - * non-standard tag / object types. - * - * There is an unfortunate string constant define naming problem with - * typeof return values for e.g. "Object" and "object"; careful with - * the built-in string defines. The LC_XXX defines are used for the - * lowercase variants now. - */ - -DUK_INTERNAL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x) { - duk_small_uint_t stridx = 0; - - switch (DUK_TVAL_GET_TAG(tv_x)) { - case DUK_TAG_UNDEFINED: { - stridx = DUK_STRIDX_LC_UNDEFINED; - break; - } - case DUK_TAG_NULL: { - /* Note: not a typo, "object" is returned for a null value. */ - stridx = DUK_STRIDX_LC_OBJECT; - break; - } - case DUK_TAG_BOOLEAN: { - stridx = DUK_STRIDX_LC_BOOLEAN; - break; - } - case DUK_TAG_POINTER: { - /* Implementation specific. */ - stridx = DUK_STRIDX_LC_POINTER; - break; - } - case DUK_TAG_STRING: { - duk_hstring *str; - - /* All internal keys are identified as Symbols. */ - str = DUK_TVAL_GET_STRING(tv_x); - DUK_ASSERT(str != NULL); - if (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(str))) { - stridx = DUK_STRIDX_LC_SYMBOL; - } else { - stridx = DUK_STRIDX_LC_STRING; - } - break; - } - case DUK_TAG_OBJECT: { - duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_x); - DUK_ASSERT(obj != NULL); - if (DUK_HOBJECT_IS_CALLABLE(obj)) { - stridx = DUK_STRIDX_LC_FUNCTION; - } else { - stridx = DUK_STRIDX_LC_OBJECT; - } - break; - } - case DUK_TAG_BUFFER: { - /* Implementation specific. In Duktape 1.x this would be - * 'buffer', in Duktape 2.x changed to 'object' because plain - * buffers now mimic Uint8Array objects. - */ - stridx = DUK_STRIDX_LC_OBJECT; - break; - } - case DUK_TAG_LIGHTFUNC: { - stridx = DUK_STRIDX_LC_FUNCTION; - break; - } -#if defined(DUK_USE_FASTINT) - case DUK_TAG_FASTINT: -#endif - default: { - /* number */ - DUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x)); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x)); - stridx = DUK_STRIDX_LC_NUMBER; - break; - } - } - - DUK_ASSERT_STRIDX_VALID(stridx); - return stridx; -} - -/* - * Array index and length - * - * Array index: E5 Section 15.4 - * Array length: E5 Section 15.4.5.1 steps 3.c - 3.d (array length write) - */ - -/* Compure array index from string context, or return a "not array index" - * indicator. - */ -DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen) { - duk_uarridx_t res; - - /* Only strings with byte length 1-10 can be 32-bit array indices. - * Leading zeroes (except '0' alone), plus/minus signs are not allowed. - * We could do a lot of prechecks here, but since most strings won't - * start with any digits, it's simpler to just parse the number and - * fail quickly. - */ - - res = 0; - if (blen == 0) { - goto parse_fail; - } - do { - duk_uarridx_t dig; - dig = (duk_uarridx_t) (*str++) - DUK_ASC_0; - - if (dig <= 9U) { - /* Careful overflow handling. When multiplying by 10: - * - 0x19999998 x 10 = 0xfffffff0: no overflow, and adding - * 0...9 is safe. - * - 0x19999999 x 10 = 0xfffffffa: no overflow, adding - * 0...5 is safe, 6...9 overflows. - * - 0x1999999a x 10 = 0x100000004: always overflow. - */ - if (DUK_UNLIKELY(res >= 0x19999999UL)) { - if (res >= 0x1999999aUL) { - /* Always overflow. */ - goto parse_fail; - } - DUK_ASSERT(res == 0x19999999UL); - if (dig >= 6U) { - goto parse_fail; - } - res = 0xfffffffaUL + dig; - DUK_ASSERT(res >= 0xfffffffaUL); - DUK_ASSERT_DISABLE(res <= 0xffffffffUL); /* range */ - } else { - res = res * 10U + dig; - if (DUK_UNLIKELY(res == 0)) { - /* If 'res' is 0, previous 'res' must - * have been 0 and we scanned in a zero. - * This is only allowed if blen == 1, - * i.e. the exact string '0'. - */ - if (blen == (duk_uint32_t) 1) { - return 0; - } - goto parse_fail; - } - } - } else { - /* Because 'dig' is unsigned, catches both values - * above '9' and below '0'. - */ - goto parse_fail; - } - } while (--blen > 0); - - return res; - - parse_fail: - return DUK_HSTRING_NO_ARRAY_INDEX; -} - -#if !defined(DUK_USE_HSTRING_ARRIDX) -/* Get array index for a string which is known to be an array index. This helper - * is needed when duk_hstring doesn't concretely store the array index, but strings - * are flagged as array indices at intern time. - */ -DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h) { - const duk_uint8_t *p; - duk_uarridx_t res; - duk_uint8_t t; - - DUK_ASSERT(h != NULL); - DUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(h)); - - p = DUK_HSTRING_GET_DATA(h); - res = 0; - for (;;) { - t = *p++; - if (DUK_UNLIKELY(t == 0)) { - /* Scanning to NUL is always safe for interned strings. */ - break; - } - DUK_ASSERT(t >= (duk_uint8_t) DUK_ASC_0 && t <= (duk_uint8_t) DUK_ASC_9); - res = res * 10U + (duk_uarridx_t) t - (duk_uarridx_t) DUK_ASC_0; - } - return res; -} - -DUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h) { - DUK_ASSERT(h != NULL); - if (!DUK_HSTRING_HAS_ARRIDX(h)) { - return DUK_HSTRING_NO_ARRAY_INDEX; - } - return duk_js_to_arrayindex_hstring_fast_known(h); -} -#endif /* DUK_USE_HSTRING_ARRIDX */ -#line 1 "duk_js_var.c" -/* - * Identifier access and function closure handling. - * - * Provides the primitives for slow path identifier accesses: GETVAR, - * PUTVAR, DELVAR, etc. The fast path, direct register accesses, should - * be used for most identifier accesses. Consequently, these slow path - * primitives should be optimized for maximum compactness. - * - * Ecmascript environment records (declarative and object) are represented - * as internal objects with control keys. Environment records have a - * parent record ("outer environment reference") which is represented by - * the implicit prototype for technical reasons (in other words, it is a - * convenient field). The prototype chain is not followed in the ordinary - * sense for variable lookups. - * - * See identifier-handling.rst for more details on the identifier algorithms - * and the internal representation. See function-objects.rst for details on - * what function templates and instances are expected to look like. - * - * Care must be taken to avoid duk_tval pointer invalidation caused by - * e.g. value stack or object resizing. - * - * TODO: properties for function instances could be initialized much more - * efficiently by creating a property allocation for a certain size and - * filling in keys and values directly (and INCREFing both with "bulk incref" - * primitives. - * - * XXX: duk_hobject_getprop() and duk_hobject_putprop() calls are a bit - * awkward (especially because they follow the prototype chain); rework - * if "raw" own property helpers are added. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Local result type for duk__get_identifier_reference() lookup. - */ - -typedef struct { - duk_hobject *env; - duk_hobject *holder; /* for object-bound identifiers */ - duk_tval *value; /* for register-bound and declarative env identifiers */ - duk_uint_t attrs; /* property attributes for identifier (relevant if value != NULL) */ - duk_bool_t has_this; /* for object-bound identifiers: provide 'this' binding */ -} duk__id_lookup_result; - -/* - * Create a new function object based on a "template function" which contains - * compiled bytecode, constants, etc, but lacks a lexical environment. - * - * Ecmascript requires that each created closure is a separate object, with - * its own set of editable properties. However, structured property values - * (such as the formal arguments list and the variable map) are shared. - * Also the bytecode, constants, and inner functions are shared. - * - * See E5 Section 13.2 for detailed requirements on the function objects; - * there are no similar requirements for function "templates" which are an - * implementation dependent internal feature. Also see function-objects.rst - * for a discussion on the function instance properties provided by this - * implementation. - * - * Notes: - * - * * Order of internal properties should match frequency of use, since the - * properties will be linearly scanned on lookup (functions usually don't - * have enough properties to warrant a hash part). - * - * * The created closure is independent of its template; they do share the - * same 'data' buffer object, but the template object itself can be freed - * even if the closure object remains reachable. - */ - -DUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompfunc *f) { - duk_tval *tv, *tv_end; - duk_hobject **funcs, **funcs_end; - - DUK_UNREF(thr); - - /* If function creation fails due to out-of-memory, the data buffer - * pointer may be NULL in some cases. That's actually possible for - * GC code, but shouldn't be possible here because the incomplete - * function will be unwound from the value stack and never instantiated. - */ - DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, f) != NULL); - - tv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, f); - tv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, f); - while (tv < tv_end) { - DUK_TVAL_INCREF(thr, tv); - tv++; - } - - funcs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, f); - funcs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, f); - while (funcs < funcs_end) { - DUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) *funcs); - funcs++; - } -} - -/* Push a new closure on the stack. - * - * Note: if fun_temp has NEWENV, i.e. a new lexical and variable declaration - * is created when the function is called, only outer_lex_env matters - * (outer_var_env is ignored and may or may not be same as outer_lex_env). - */ - -DUK_LOCAL const duk_uint16_t duk__closure_copy_proplist[] = { - /* order: most frequent to least frequent */ - DUK_STRIDX_INT_VARMAP, - DUK_STRIDX_INT_FORMALS, -#if defined(DUK_USE_PC2LINE) - DUK_STRIDX_INT_PC2LINE, -#endif -#if defined(DUK_USE_FUNC_FILENAME_PROPERTY) - DUK_STRIDX_FILE_NAME, -#endif -#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY) - DUK_STRIDX_INT_SOURCE -#endif -}; - -DUK_INTERNAL -void duk_js_push_closure(duk_hthread *thr, - duk_hcompfunc *fun_temp, - duk_hobject *outer_var_env, - duk_hobject *outer_lex_env, - duk_bool_t add_auto_proto) { - duk_hcompfunc *fun_clos; - duk_small_uint_t i; - duk_uint_t len_value; - - DUK_ASSERT(fun_temp != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp) != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp) != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp) != NULL); - DUK_ASSERT(outer_var_env != NULL); - DUK_ASSERT(outer_lex_env != NULL); - DUK_UNREF(len_value); - - fun_clos = duk_push_hcompfunc(thr); - DUK_ASSERT(fun_clos != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) fun_clos) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - - duk_push_hobject(thr, &fun_temp->obj); /* -> [ ... closure template ] */ - - DUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun_clos)); - DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) == NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) == NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) == NULL); - - DUK_HCOMPFUNC_SET_DATA(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp)); - DUK_HCOMPFUNC_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp)); - DUK_HCOMPFUNC_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp)); - - /* Note: all references inside 'data' need to get their refcounts - * upped too. This is the case because refcounts are decreased - * through every function referencing 'data' independently. - */ - - DUK_HBUFFER_INCREF(thr, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos)); - duk__inc_data_inner_refcounts(thr, fun_temp); - - fun_clos->nregs = fun_temp->nregs; - fun_clos->nargs = fun_temp->nargs; -#if defined(DUK_USE_DEBUGGER_SUPPORT) - fun_clos->start_line = fun_temp->start_line; - fun_clos->end_line = fun_temp->end_line; -#endif - - DUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) != NULL); - - /* XXX: Could also copy from template, but there's no way to have any - * other value here now (used code has no access to the template). - * Prototype is set by duk_push_hcompfunc(). - */ - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); -#if 0 - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &fun_clos->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); -#endif - - /* Copy duk_hobject flags as is from the template using a mask. - * Leave out duk_heaphdr owned flags just in case (e.g. if there's - * some GC flag or similar). Some flags can then be adjusted - * separately if necessary. - */ - - /* DUK_HEAPHDR_SET_FLAGS() masks changes to non-duk_heaphdr flags only. */ - DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) fun_clos, DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp)); - DUK_DD(DUK_DDPRINT("fun_temp heaphdr flags: 0x%08lx, fun_clos heaphdr flags: 0x%08lx", - (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp), - (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_clos))); - - DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&fun_clos->obj)); - DUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&fun_clos->obj)); - /* DUK_HOBJECT_FLAG_ARRAY_PART: don't care */ - /* DUK_HOBJECT_FLAG_NEWENV: handled below */ - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&fun_clos->obj)); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&fun_clos->obj)); - - if (!DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)) { - /* If the template is not constructable don't add an automatic - * .prototype property. This is the case for e.g. ES2015 object - * literal getters/setters and method definitions. - */ - add_auto_proto = 0; - } - - /* - * Setup environment record properties based on the template and - * its flags. - * - * If DUK_HOBJECT_HAS_NEWENV(fun_temp) is true, the environment - * records represent identifiers "outside" the function; the - * "inner" environment records are created on demand. Otherwise, - * the environment records are those that will be directly used - * (e.g. for declarations). - * - * _Lexenv is always set; _Varenv defaults to _Lexenv if missing, - * so _Varenv is only set if _Lexenv != _Varenv. - * - * This is relatively complex, see doc/identifier-handling.rst. - */ - - if (DUK_HOBJECT_HAS_NEWENV(&fun_clos->obj)) { -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - if (DUK_HOBJECT_HAS_NAMEBINDING(&fun_clos->obj)) { - duk_hobject *proto; - duk_hdecenv *new_env; - - /* - * Named function expression, name needs to be bound - * in an intermediate environment record. The "outer" - * lexical/variable environment will thus be: - * - * a) { funcname: , __prototype: outer_lex_env } - * b) { funcname: , __prototype: } (if outer_lex_env missing) - */ - - if (outer_lex_env) { - proto = outer_lex_env; - } else { - proto = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - } - - /* -> [ ... closure template env ] */ - new_env = duk_hdecenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); - DUK_ASSERT(new_env != NULL); - duk_push_hobject(thr, (duk_hobject *) new_env); - - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, proto); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, proto); - - DUK_ASSERT(new_env->thread == NULL); /* Closed. */ - DUK_ASSERT(new_env->varmap == NULL); - - /* It's important that duk_xdef_prop() is a 'raw define' so that any - * properties in an ancestor are never an issue (they should never be - * e.g. non-writable, but just in case). - * - * Because template objects are not visible to user code, the case - * where .name is missing shouldn't happen in practice. It it does, - * the name 'undefined' gets bound and maps to the closure (which is - * a bit odd, but safe). - */ - (void) duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME); - /* -> [ ... closure template env funcname ] */ - duk_dup_m4(thr); /* -> [ ... closure template env funcname closure ] */ - duk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ ... closure template env ] */ - /* env[funcname] = closure */ - - /* [ ... closure template env ] */ - - DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, (duk_hobject *) new_env); - DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, (duk_hobject *) new_env); - DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); - DUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env); - duk_pop_unsafe(thr); - - /* [ ... closure template ] */ - } - else -#endif /* DUK_USE_FUNC_NAME_PROPERTY */ - { - /* - * Other cases (function declaration, anonymous function expression, - * strict direct eval code). The "outer" environment will be whatever - * the caller gave us. - */ - - DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); - DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_lex_env); - DUK_HOBJECT_INCREF(thr, outer_lex_env); - DUK_HOBJECT_INCREF(thr, outer_lex_env); - - /* [ ... closure template ] */ - } - } else { - /* - * Function gets no new environment when called. This is the - * case for global code, indirect eval code, and non-strict - * direct eval code. There is no direct correspondence to the - * E5 specification, as global/eval code is not exposed as a - * function. - */ - - DUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj)); - - DUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env); - DUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_var_env); - DUK_HOBJECT_INCREF(thr, outer_lex_env); /* NULLs not allowed; asserted on entry */ - DUK_HOBJECT_INCREF(thr, outer_var_env); - } - DUK_DDD(DUK_DDDPRINT("closure varenv -> %!ipO, lexenv -> %!ipO", - (duk_heaphdr *) fun_clos->var_env, - (duk_heaphdr *) fun_clos->lex_env)); - - /* Call handling assumes this for all callable closures. */ - DUK_ASSERT(DUK_HCOMPFUNC_GET_LEXENV(thr->heap, fun_clos) != NULL); - DUK_ASSERT(DUK_HCOMPFUNC_GET_VARENV(thr->heap, fun_clos) != NULL); - - /* - * Copy some internal properties directly - * - * The properties will be non-writable and non-enumerable, but - * configurable. - */ - - /* [ ... closure template ] */ - - DUK_DDD(DUK_DDDPRINT("copying properties: closure=%!iT, template=%!iT", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - for (i = 0; i < (duk_small_uint_t) (sizeof(duk__closure_copy_proplist) / sizeof(duk_uint16_t)); i++) { - duk_small_int_t stridx = (duk_small_int_t) duk__closure_copy_proplist[i]; - if (duk_get_prop_stridx_short(thr, -1, stridx)) { - /* [ ... closure template val ] */ - DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> found", (long) stridx)); - duk_xdef_prop_stridx_short(thr, -3, stridx, DUK_PROPDESC_FLAGS_C); - } else { - DUK_DDD(DUK_DDDPRINT("copying property, stridx=%ld -> not found", (long) stridx)); - duk_pop_unsafe(thr); - } - } - - /* - * "length" maps to number of formals (E5 Section 13.2) for function - * declarations/expressions (non-bound functions). Note that 'nargs' - * is NOT necessarily equal to the number of arguments. Use length - * of _Formals; if missing, assume nargs matches .length. - */ - - /* [ ... closure template ] */ - - /* XXX: these lookups should be just own property lookups instead of - * looking up the inheritance chain. - */ - if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS)) { - /* [ ... closure template formals ] */ - len_value = (duk_uint_t) duk_get_length(thr, -1); /* could access duk_harray directly, not important */ - DUK_DD(DUK_DDPRINT("closure length from _Formals -> %ld", (long) len_value)); - } else { - len_value = fun_temp->nargs; - DUK_DD(DUK_DDPRINT("closure length defaulted from nargs -> %ld", (long) len_value)); - } - duk_pop_unsafe(thr); - - duk_push_uint(thr, len_value); /* [ ... closure template len_value ] */ - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C); - - /* - * "prototype" is, by default, a fresh object with the "constructor" - * property. - * - * Note that this creates a circular reference for every function - * instance (closure) which prevents refcount-based collection of - * function instances. - * - * XXX: Try to avoid creating the default prototype object, because - * many functions are not used as constructors and the default - * prototype is unnecessary. Perhaps it could be created on-demand - * when it is first accessed? - */ - - /* [ ... closure template ] */ - - if (add_auto_proto) { - duk_push_object(thr); /* -> [ ... closure template newobj ] */ - duk_dup_m3(thr); /* -> [ ... closure template newobj closure ] */ - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* -> [ ... closure template newobj ] */ - duk_compact(thr, -1); /* compact the prototype */ - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); /* -> [ ... closure template ] */ - } - - /* - * "arguments" and "caller" must be mapped to throwers for strict - * mode and bound functions (E5 Section 15.3.5). - * - * XXX: This is expensive to have for every strict function instance. - * Try to implement as virtual properties or on-demand created properties. - */ - - /* [ ... closure template ] */ - - if (DUK_HOBJECT_HAS_STRICT(&fun_clos->obj)) { - duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_CALLER); - duk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_LC_ARGUMENTS); - } else { -#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY) - DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property in use, add initial 'null' value")); - duk_push_null(thr); - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); -#else - DUK_DDD(DUK_DDDPRINT("function is non-strict and non-standard 'caller' property not used")); -#endif - } - - /* - * "name" used to be non-standard but is now defined by ES2015. - * In ES2015/ES2016 the .name property is configurable. - */ - - /* [ ... closure template ] */ - -#if defined(DUK_USE_FUNC_NAME_PROPERTY) - /* XXX: Look for own property only; doesn't matter much because - * templates are bare objects. - */ - if (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME)) { - /* [ ... closure template name ] */ - DUK_ASSERT(duk_is_string(thr, -1)); - DUK_DD(DUK_DDPRINT("setting function instance name to %!T", duk_get_tval(thr, -1))); - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C); /* -> [ ... closure template ] */ - } else { - /* Anonymous functions don't have a .name in ES2015, so don't set - * it on the instance either. The instance will then inherit - * it from Function.prototype.name. - */ - DUK_DD(DUK_DDPRINT("not setting function instance .name")); - duk_pop_unsafe(thr); - } -#endif - - /* - * Compact the closure, in most cases no properties will be added later. - * Also, without this the closures end up having unused property slots - * (e.g. in Duktape 0.9.0, 8 slots would be allocated and only 7 used). - * A better future solution would be to allocate the closure directly - * to correct size (and setup the properties directly without going - * through the API). - */ - - duk_compact(thr, -2); - - /* - * Some assertions (E5 Section 13.2). - */ - - DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(&fun_clos->obj) == DUK_HOBJECT_CLASS_FUNCTION); - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); - DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj)); - DUK_ASSERT(duk_has_prop_stridx(thr, -2, DUK_STRIDX_LENGTH) != 0); - DUK_ASSERT(add_auto_proto == 0 || duk_has_prop_stridx(thr, -2, DUK_STRIDX_PROTOTYPE) != 0); - /* May be missing .name */ - DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || - duk_has_prop_stridx(thr, -2, DUK_STRIDX_CALLER) != 0); - DUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) || - duk_has_prop_stridx(thr, -2, DUK_STRIDX_LC_ARGUMENTS) != 0); - - /* - * Finish - */ - - /* [ ... closure template ] */ - - DUK_DDD(DUK_DDDPRINT("created function instance: template=%!iT -> closure=%!iT", - (duk_tval *) duk_get_tval(thr, -1), - (duk_tval *) duk_get_tval(thr, -2))); - - duk_pop_unsafe(thr); - - /* [ ... closure ] */ -} - -/* - * Delayed activation environment record initialization (for functions - * with NEWENV). - * - * The non-delayed initialization is handled by duk_handle_call(). - */ - -/* shared helper */ -DUK_INTERNAL -duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, - duk_hobject *func, - duk_size_t bottom_byteoff) { - duk_hdecenv *env; - duk_hobject *parent; - duk_hcompfunc *f; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(func != NULL); - - f = (duk_hcompfunc *) func; - parent = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); - if (!parent) { - parent = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - } - - env = duk_hdecenv_alloc(thr, - DUK_HOBJECT_FLAG_EXTENSIBLE | - DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV)); - DUK_ASSERT(env != NULL); - duk_push_hobject(thr, (duk_hobject *) env); - - DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL); - DUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, parent); - DUK_HOBJECT_INCREF_ALLOWNULL(thr, parent); /* parent env is the prototype */ - - /* open scope information, for compiled functions only */ - - DUK_ASSERT(env->thread == NULL); - DUK_ASSERT(env->varmap == NULL); - DUK_ASSERT(env->regbase_byteoff == 0); - if (DUK_HOBJECT_IS_COMPFUNC(func)) { - duk_hobject *varmap; - duk_tval *tv; - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); - if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - varmap = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(varmap != NULL); - env->varmap = varmap; - DUK_HOBJECT_INCREF(thr, varmap); - env->thread = thr; - DUK_HTHREAD_INCREF(thr, thr); - env->regbase_byteoff = bottom_byteoff; - } else { - /* If function has no _Varmap, leave the environment closed. */ - DUK_ASSERT(env->thread == NULL); - DUK_ASSERT(env->varmap == NULL); - DUK_ASSERT(env->regbase_byteoff == 0); - } - } - - return (duk_hobject *) env; -} - -DUK_INTERNAL -void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, - duk_activation *act) { - duk_hobject *func; - duk_hobject *env; - - DUK_ASSERT(thr != NULL); - func = DUK_ACT_GET_FUNC(act); - DUK_ASSERT(func != NULL); - DUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func)); /* bound functions are never in act 'func' */ - - /* - * Delayed initialization only occurs for 'NEWENV' functions. - */ - - DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); - DUK_ASSERT(act->lex_env == NULL); - DUK_ASSERT(act->var_env == NULL); - - env = duk_create_activation_environment_record(thr, func, act->bottom_byteoff); - DUK_ASSERT(env != NULL); - /* 'act' is a stable pointer, so still OK. */ - - DUK_DDD(DUK_DDDPRINT("created delayed fresh env: %!ipO", (duk_heaphdr *) env)); -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - { - duk_hobject *p = env; - while (p) { - DUK_DDD(DUK_DDDPRINT(" -> %!ipO", (duk_heaphdr *) p)); - p = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, p); - } - } -#endif - - act->lex_env = env; - act->var_env = env; - DUK_HOBJECT_INCREF(thr, env); /* XXX: incref by count (here 2 times) */ - DUK_HOBJECT_INCREF(thr, env); - - duk_pop_unsafe(thr); -} - -/* - * Closing environment records. - * - * The environment record MUST be closed with the thread where its activation - * is; i.e. if 'env' is open, 'thr' must match env->thread, and the regbase - * and varmap must still be valid. On entry, 'env' must be reachable. - */ - -DUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env) { - duk_uint_fast32_t i; - duk_hobject *varmap; - duk_hstring *key; - duk_tval *tv; - duk_uint_t regnum; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(env != NULL); - - if (DUK_UNLIKELY(!DUK_HOBJECT_IS_DECENV(env))) { - DUK_DDD(DUK_DDDPRINT("env not a declarative record: %!iO", (duk_heaphdr *) env)); - return; - } - - varmap = ((duk_hdecenv *) env)->varmap; - if (varmap == NULL) { - DUK_DDD(DUK_DDDPRINT("env already closed: %!iO", (duk_heaphdr *) env)); - - return; - } - DUK_ASSERT(((duk_hdecenv *) env)->thread != NULL); - DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); - - DUK_DDD(DUK_DDDPRINT("closing env: %!iO", (duk_heaphdr *) env)); - DUK_DDD(DUK_DDDPRINT("varmap: %!O", (duk_heaphdr *) varmap)); - - /* Env must be closed in the same thread as where it runs. */ - DUK_ASSERT(((duk_hdecenv *) env)->thread == thr); - - /* XXX: additional conditions when to close variables? we don't want to do it - * unless the environment may have "escaped" (referenced in a function closure). - * With delayed environments, the existence is probably good enough of a check. - */ - - /* Note: we rely on the _Varmap having a bunch of nice properties, like: - * - being compacted and unmodified during this process - * - not containing an array part - * - having correct value types - */ - - DUK_DDD(DUK_DDDPRINT("copying bound register values, %ld bound regs", (long) DUK_HOBJECT_GET_ENEXT(varmap))); - - /* Copy over current variable values from value stack to the - * environment record. The scope object is empty but may - * inherit from another scope which has conflicting names. - */ - - /* XXX: Do this using a once allocated entry area, no side effects. - * Hash part would need special treatment however (maybe copy, and - * then realloc with hash part if large enough). - */ - for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(varmap); i++) { - duk_size_t regbase_byteoff; - - key = DUK_HOBJECT_E_GET_KEY(thr->heap, varmap, i); - DUK_ASSERT(key != NULL); /* assume keys are compact in _Varmap */ - DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, varmap, i)); /* assume plain values */ - - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, varmap, i); - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */ -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); - regnum = (duk_uint_t) DUK_TVAL_GET_FASTINT_U32(tv); -#else - regnum = (duk_uint_t) DUK_TVAL_GET_NUMBER(tv); -#endif - - regbase_byteoff = ((duk_hdecenv *) env)->regbase_byteoff; - DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum >= (duk_uint8_t *) thr->valstack); - DUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum < (duk_uint8_t *) thr->valstack_top); - - /* If property already exists, overwrites silently. - * Property is writable, but not deletable (not configurable - * in terms of property attributes). - */ - duk_push_tval(thr, (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum)); - DUK_DDD(DUK_DDDPRINT("closing identifier %!O -> reg %ld, value %!T", - (duk_heaphdr *) key, - (long) regnum, - (duk_tval *) duk_get_tval(thr, -1))); - duk_hobject_define_property_internal(thr, env, key, DUK_PROPDESC_FLAGS_WE); - } - - /* NULL atomically to avoid inconsistent state + side effects. */ - DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->thread); - DUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->varmap); - ((duk_hdecenv *) env)->thread = NULL; - ((duk_hdecenv *) env)->varmap = NULL; - - DUK_DDD(DUK_DDDPRINT("env after closing: %!O", (duk_heaphdr *) env)); -} - -/* - * GETIDREF: a GetIdentifierReference-like helper. - * - * Provides a parent traversing lookup and a single level lookup - * (for HasBinding). - * - * Instead of returning the value, returns a bunch of values allowing - * the caller to read, write, or delete the binding. Value pointers - * are duk_tval pointers which can be mutated directly as long as - * refcounts are properly updated. Note that any operation which may - * reallocate valstacks or compact objects may invalidate the returned - * duk_tval (but not object) pointers, so caller must be very careful. - * - * If starting environment record 'env' is given, 'act' is ignored. - * However, if 'env' is NULL, the caller may identify, in 'act', an - * activation which hasn't had its declarative environment initialized - * yet. The activation registers are then looked up, and its parent - * traversed normally. - * - * The 'out' structure values are only valid if the function returns - * success (non-zero). - */ - -/* lookup name from an open declarative record's registers */ -DUK_LOCAL -duk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr, - duk_hstring *name, - duk_hdecenv *env, - duk__id_lookup_result *out) { - duk_tval *tv; - duk_size_t reg_rel; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(name != NULL); - DUK_ASSERT(env != NULL); - DUK_ASSERT(out != NULL); - - DUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) env)); - DUK_ASSERT_HDECENV_VALID(env); - - if (env->thread == NULL) { - /* already closed */ - return 0; - } - DUK_ASSERT(env->varmap != NULL); - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, env->varmap, name); - if (DUK_UNLIKELY(tv == NULL)) { - return 0; - } - - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - DUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX); /* limits */ -#if defined(DUK_USE_FASTINT) - DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); - reg_rel = (duk_size_t) DUK_TVAL_GET_FASTINT_U32(tv); -#else - reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); -#endif - DUK_ASSERT_DISABLE(reg_rel >= 0); /* unsigned */ - - tv = (duk_tval *) (void *) ((duk_uint8_t *) env->thread->valstack + env->regbase_byteoff + sizeof(duk_tval) * reg_rel); - DUK_ASSERT(tv >= env->thread->valstack && tv < env->thread->valstack_end); /* XXX: more accurate? */ - - out->value = tv; - out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */ - out->env = (duk_hobject *) env; - out->holder = NULL; - out->has_this = 0; - return 1; -} - -/* lookup name from current activation record's functions' registers */ -DUK_LOCAL -duk_bool_t duk__getid_activation_regs(duk_hthread *thr, - duk_hstring *name, - duk_activation *act, - duk__id_lookup_result *out) { - duk_tval *tv; - duk_hobject *func; - duk_hobject *varmap; - duk_size_t reg_rel; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(name != NULL); - DUK_ASSERT(act != NULL); - DUK_ASSERT(out != NULL); - - func = DUK_ACT_GET_FUNC(act); - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); - - if (!DUK_HOBJECT_IS_COMPFUNC(func)) { - return 0; - } - - /* XXX: move varmap to duk_hcompfunc struct field. */ - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); - if (!tv) { - return 0; - } - DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv)); - varmap = DUK_TVAL_GET_OBJECT(tv); - DUK_ASSERT(varmap != NULL); - - tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, varmap, name); - if (!tv) { - return 0; - } - DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); - reg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv); - DUK_ASSERT_DISABLE(reg_rel >= 0); - DUK_ASSERT(reg_rel < ((duk_hcompfunc *) func)->nregs); - - tv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff); - tv += reg_rel; - - out->value = tv; - out->attrs = DUK_PROPDESC_FLAGS_W; /* registers are mutable, non-deletable */ - out->env = NULL; - out->holder = NULL; - out->has_this = 0; - return 1; -} - -DUK_LOCAL -duk_bool_t duk__get_identifier_reference(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name, - duk_activation *act, - duk_bool_t parents, - duk__id_lookup_result *out) { - duk_tval *tv; - duk_uint_t sanity; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(env != NULL || act != NULL); - DUK_ASSERT(name != NULL); - DUK_ASSERT(out != NULL); - - DUK_ASSERT(!env || DUK_HOBJECT_IS_ENV(env)); - DUK_ASSERT(!env || !DUK_HOBJECT_HAS_ARRAY_PART(env)); - - /* - * Conceptually, we look for the identifier binding by starting from - * 'env' and following to chain of environment records (represented - * by the prototype chain). - * - * If 'env' is NULL, the current activation does not yet have an - * allocated declarative environment record; this should be treated - * exactly as if the environment record existed but had no bindings - * other than register bindings. - * - * Note: we assume that with the DUK_HOBJECT_FLAG_NEWENV cleared - * the environment will always be initialized immediately; hence - * a NULL 'env' should only happen with the flag set. This is the - * case for: (1) function calls, and (2) strict, direct eval calls. - */ - - if (env == NULL && act != NULL) { - duk_hobject *func; - duk_hcompfunc *f; - - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference: env is NULL, activation is non-NULL -> " - "delayed env case, look up activation regs first")); - - /* - * Try registers - */ - - if (duk__getid_activation_regs(thr, name, act, out)) { - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " - "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " - "(found from register bindings when env=NULL)", - (duk_heaphdr *) name, (duk_tval *) out->value, - (long) out->attrs, (long) out->has_this, - (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); - return 1; - } - - DUK_DDD(DUK_DDDPRINT("not found in current activation regs")); - - /* - * Not found in registers, proceed to the parent record. - * Here we need to determine what the parent would be, - * if 'env' was not NULL (i.e. same logic as when initializing - * the record). - * - * Note that environment initialization is only deferred when - * DUK_HOBJECT_HAS_NEWENV is set, and this only happens for: - * - Function code - * - Strict eval code - * - * We only need to check _Lexenv here; _Varenv exists only if it - * differs from _Lexenv (and thus _Lexenv will also be present). - */ - - if (!parents) { - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal " - "(not found from register bindings when env=NULL)")); - goto fail_not_found; - } - - func = DUK_ACT_GET_FUNC(act); - DUK_ASSERT(func != NULL); - DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func)); - f = (duk_hcompfunc *) func; - - env = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f); - if (!env) { - env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; - } - - DUK_DDD(DUK_DDDPRINT("continue lookup from env: %!iO", - (duk_heaphdr *) env)); - } - - /* - * Prototype walking starting from 'env'. - * - * ('act' is not needed anywhere here.) - */ - - sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; - while (env != NULL) { - duk_small_uint_t cl; - duk_uint_t attrs; - - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference, name=%!O, considering env=%p -> %!iO", - (duk_heaphdr *) name, - (void *) env, - (duk_heaphdr *) env)); - - DUK_ASSERT(env != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); - DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env)); - - cl = DUK_HOBJECT_GET_CLASS_NUMBER(env); - DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV || cl == DUK_HOBJECT_CLASS_DECENV); - if (cl == DUK_HOBJECT_CLASS_DECENV) { - /* - * Declarative environment record. - * - * Identifiers can never be stored in ancestors and are - * always plain values, so we can use an internal helper - * and access the value directly with an duk_tval ptr. - * - * A closed environment is only indicated by it missing - * the "book-keeping" properties required for accessing - * register-bound variables. - */ - - DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); - if (duk__getid_open_decl_env_regs(thr, name, (duk_hdecenv *) env, out)) { - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " - "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " - "(declarative environment record, scope open, found in regs)", - (duk_heaphdr *) name, (duk_tval *) out->value, - (long) out->attrs, (long) out->has_this, - (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); - return 1; - } - - tv = duk_hobject_find_existing_entry_tval_ptr_and_attrs(thr->heap, env, name, &attrs); - if (tv) { - out->value = tv; - out->attrs = attrs; - out->env = env; - out->holder = env; - out->has_this = 0; - - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " - "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " - "(declarative environment record, found in properties)", - (duk_heaphdr *) name, (duk_tval *) out->value, - (long) out->attrs, (long) out->has_this, - (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); - return 1; - } - } else { - /* - * Object environment record. - * - * Binding (target) object is an external, uncontrolled object. - * Identifier may be bound in an ancestor property, and may be - * an accessor. Target can also be a Proxy which we must support - * here. - */ - - /* XXX: we could save space by using _Target OR _This. If _Target, assume - * this binding is undefined. If _This, assumes this binding is _This, and - * target is also _This. One property would then be enough. - */ - - duk_hobject *target; - duk_bool_t found; - - DUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV); - DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env); - - target = ((duk_hobjenv *) env)->target; - DUK_ASSERT(target != NULL); - - /* Target may be a Proxy or property may be an accessor, so we must - * use an actual, Proxy-aware hasprop check here. - * - * out->holder is NOT set to the actual duk_hobject where the - * property is found, but rather the object binding target object. - */ - -#if defined(DUK_USE_ES6_PROXY) - if (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(target))) { - duk_tval tv_name; - duk_tval tv_target_tmp; - - DUK_ASSERT(name != NULL); - DUK_TVAL_SET_STRING(&tv_name, name); - DUK_TVAL_SET_OBJECT(&tv_target_tmp, target); - - found = duk_hobject_hasprop(thr, &tv_target_tmp, &tv_name); - } else -#endif /* DUK_USE_ES6_PROXY */ - { - /* XXX: duk_hobject_hasprop() would be correct for - * non-Proxy objects too, but it is about ~20-25% - * slower at present so separate code paths for - * Proxy and non-Proxy now. - */ - found = duk_hobject_hasprop_raw(thr, target, name); - } - - if (found) { - out->value = NULL; /* can't get value, may be accessor */ - out->attrs = 0; /* irrelevant when out->value == NULL */ - out->env = env; - out->holder = target; - out->has_this = ((duk_hobjenv *) env)->has_this; - - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference successful: " - "name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O " - "(object environment record)", - (duk_heaphdr *) name, (duk_tval *) out->value, - (long) out->attrs, (long) out->has_this, - (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder)); - return 1; - } - } - - if (!parents) { - DUK_DDD(DUK_DDDPRINT("duk__get_identifier_reference failed, no parent traversal " - "(not found from first traversed env)")); - goto fail_not_found; - } - - if (DUK_UNLIKELY(sanity-- == 0)) { - DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT); - } - env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env); - } - - /* - * Not found (even in global object) - */ - - fail_not_found: - return 0; -} - -/* - * HASVAR: check identifier binding from a given environment record - * without traversing its parents. - * - * This primitive is not exposed to user code as such, but is used - * internally for e.g. declaration binding instantiation. - * - * See E5 Sections: - * 10.2.1.1.1 HasBinding(N) - * 10.2.1.2.1 HasBinding(N) - * - * Note: strictness has no bearing on this check. Hence we don't take - * a 'strict' parameter. - */ - -#if 0 /*unused*/ -DUK_INTERNAL -duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name) { - duk__id_lookup_result ref; - duk_bool_t parents; - - DUK_DDD(DUK_DDDPRINT("hasvar: thr=%p, env=%p, name=%!O " - "(env -> %!dO)", - (void *) thr, (void *) env, (duk_heaphdr *) name, - (duk_heaphdr *) env)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(env != NULL); - DUK_ASSERT(name != NULL); - - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); - - DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); - DUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env)); - - /* lookup results is ignored */ - parents = 0; - return duk__get_identifier_reference(thr, env, name, NULL, parents, &ref); -} -#endif - -/* - * GETVAR - * - * See E5 Sections: - * 11.1.2 Identifier Reference - * 10.3.1 Identifier Resolution - * 11.13.1 Simple Assignment [example of where the Reference is GetValue'd] - * 8.7.1 GetValue (V) - * 8.12.1 [[GetOwnProperty]] (P) - * 8.12.2 [[GetProperty]] (P) - * 8.12.3 [[Get]] (P) - * - * If 'throw' is true, always leaves two values on top of stack: [val this]. - * - * If 'throw' is false, returns 0 if identifier cannot be resolved, and the - * stack will be unaffected in this case. If identifier is resolved, returns - * 1 and leaves [val this] on top of stack. - * - * Note: the 'strict' flag of a reference returned by GetIdentifierReference - * is ignored by GetValue. Hence we don't take a 'strict' parameter. - * - * The 'throw' flag is needed for implementing 'typeof' for an unreferenced - * identifier. An unreference identifier in other contexts generates a - * ReferenceError. - */ - -DUK_LOCAL -duk_bool_t duk__getvar_helper(duk_hthread *thr, - duk_hobject *env, - duk_activation *act, - duk_hstring *name, - duk_bool_t throw_flag) { - duk__id_lookup_result ref; - duk_tval tv_tmp_obj; - duk_tval tv_tmp_key; - duk_bool_t parents; - - DUK_DDD(DUK_DDDPRINT("getvar: thr=%p, env=%p, act=%p, name=%!O " - "(env -> %!dO)", - (void *) thr, (void *) env, (void *) act, - (duk_heaphdr *) name, (duk_heaphdr *) env)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(name != NULL); - /* env and act may be NULL */ - - DUK_STATS_INC(thr->heap, stats_getvar_all); - - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); - - parents = 1; /* follow parent chain */ - if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { - if (ref.value) { - duk_push_tval(thr, ref.value); - duk_push_undefined(thr); - } else { - DUK_ASSERT(ref.holder != NULL); - - /* ref.holder is safe across the getprop call (even - * with side effects) because 'env' is reachable and - * ref.holder is a direct heap pointer. - */ - - DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder); - DUK_TVAL_SET_STRING(&tv_tmp_key, name); - (void) duk_hobject_getprop(thr, &tv_tmp_obj, &tv_tmp_key); /* [value] */ - - if (ref.has_this) { - duk_push_hobject(thr, ref.holder); - } else { - duk_push_undefined(thr); - } - - /* [value this] */ - } - - return 1; - } else { - if (throw_flag) { - DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR, - "identifier '%s' undefined", - (const char *) DUK_HSTRING_GET_DATA(name)); - } - - return 0; - } -} - -DUK_INTERNAL -duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name, - duk_bool_t throw_flag) { - return duk__getvar_helper(thr, env, NULL, name, throw_flag); -} - -DUK_INTERNAL -duk_bool_t duk_js_getvar_activation(duk_hthread *thr, - duk_activation *act, - duk_hstring *name, - duk_bool_t throw_flag) { - DUK_ASSERT(act != NULL); - return duk__getvar_helper(thr, act->lex_env, act, name, throw_flag); -} - -/* - * PUTVAR - * - * See E5 Sections: - * 11.1.2 Identifier Reference - * 10.3.1 Identifier Resolution - * 11.13.1 Simple Assignment [example of where the Reference is PutValue'd] - * 8.7.2 PutValue (V,W) [see especially step 3.b, undefined -> automatic global in non-strict mode] - * 8.12.4 [[CanPut]] (P) - * 8.12.5 [[Put]] (P) - * - * Note: may invalidate any valstack (or object) duk_tval pointers because - * putting a value may reallocate any object or any valstack. Caller beware. - */ - -DUK_LOCAL -void duk__putvar_helper(duk_hthread *thr, - duk_hobject *env, - duk_activation *act, - duk_hstring *name, - duk_tval *val, - duk_bool_t strict) { - duk__id_lookup_result ref; - duk_tval tv_tmp_obj; - duk_tval tv_tmp_key; - duk_bool_t parents; - - DUK_STATS_INC(thr->heap, stats_putvar_all); - - DUK_DDD(DUK_DDDPRINT("putvar: thr=%p, env=%p, act=%p, name=%!O, val=%p, strict=%ld " - "(env -> %!dO, val -> %!T)", - (void *) thr, (void *) env, (void *) act, - (duk_heaphdr *) name, (void *) val, (long) strict, - (duk_heaphdr *) env, (duk_tval *) val)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(name != NULL); - DUK_ASSERT(val != NULL); - /* env and act may be NULL */ - - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env); - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); - DUK_ASSERT_REFCOUNT_NONZERO_TVAL(val); - - /* - * In strict mode E5 protects 'eval' and 'arguments' from being - * assigned to (or even declared anywhere). Attempt to do so - * should result in a compile time SyntaxError. See the internal - * design documentation for details. - * - * Thus, we should never come here, run-time, for strict code, - * and name 'eval' or 'arguments'. - */ - - DUK_ASSERT(!strict || - (name != DUK_HTHREAD_STRING_EVAL(thr) && - name != DUK_HTHREAD_STRING_LC_ARGUMENTS(thr))); - - /* - * Lookup variable and update in-place if found. - */ - - parents = 1; /* follow parent chain */ - - if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { - if (ref.value && (ref.attrs & DUK_PROPDESC_FLAG_WRITABLE)) { - /* Update duk_tval in-place if pointer provided and the - * property is writable. If the property is not writable - * (immutable binding), use duk_hobject_putprop() which - * will respect mutability. - */ - duk_tval *tv_val; - - tv_val = ref.value; - DUK_ASSERT(tv_val != NULL); - DUK_TVAL_SET_TVAL_UPDREF(thr, tv_val, val); /* side effects */ - - /* ref.value invalidated here */ - } else { - DUK_ASSERT(ref.holder != NULL); - - DUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder); - DUK_TVAL_SET_STRING(&tv_tmp_key, name); - (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, strict); - - /* ref.value invalidated here */ - } - - return; - } - - /* - * Not found: write to global object (non-strict) or ReferenceError - * (strict); see E5 Section 8.7.2, step 3. - */ - - if (strict) { - DUK_DDD(DUK_DDDPRINT("identifier binding not found, strict => reference error")); - DUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR, - "identifier '%s' undefined", - (const char *) DUK_HSTRING_GET_DATA(name)); - } - - DUK_DDD(DUK_DDDPRINT("identifier binding not found, not strict => set to global")); - - DUK_TVAL_SET_OBJECT(&tv_tmp_obj, thr->builtins[DUK_BIDX_GLOBAL]); - DUK_TVAL_SET_STRING(&tv_tmp_key, name); - (void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, 0); /* 0 = no throw */ - - /* NB: 'val' may be invalidated here because put_value may realloc valstack, - * caller beware. - */ -} - -DUK_INTERNAL -void duk_js_putvar_envrec(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name, - duk_tval *val, - duk_bool_t strict) { - duk__putvar_helper(thr, env, NULL, name, val, strict); -} - -DUK_INTERNAL -void duk_js_putvar_activation(duk_hthread *thr, - duk_activation *act, - duk_hstring *name, - duk_tval *val, - duk_bool_t strict) { - DUK_ASSERT(act != NULL); - duk__putvar_helper(thr, act->lex_env, act, name, val, strict); -} - -/* - * DELVAR - * - * See E5 Sections: - * 11.4.1 The delete operator - * 10.2.1.1.5 DeleteBinding (N) [declarative environment record] - * 10.2.1.2.5 DeleteBinding (N) [object environment record] - * - * Variable bindings established inside eval() are deletable (configurable), - * other bindings are not, including variables declared in global level. - * Registers are always non-deletable, and the deletion of other bindings - * is controlled by the configurable flag. - * - * For strict mode code, the 'delete' operator should fail with a compile - * time SyntaxError if applied to identifiers. Hence, no strict mode - * run-time deletion of identifiers should ever happen. This function - * should never be called from strict mode code! - */ - -DUK_LOCAL -duk_bool_t duk__delvar_helper(duk_hthread *thr, - duk_hobject *env, - duk_activation *act, - duk_hstring *name) { - duk__id_lookup_result ref; - duk_bool_t parents; - - DUK_DDD(DUK_DDDPRINT("delvar: thr=%p, env=%p, act=%p, name=%!O " - "(env -> %!dO)", - (void *) thr, (void *) env, (void *) act, - (duk_heaphdr *) name, (duk_heaphdr *) env)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(name != NULL); - /* env and act may be NULL */ - - DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name); - - parents = 1; /* follow parent chain */ - - if (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) { - if (ref.value && !(ref.attrs & DUK_PROPDESC_FLAG_CONFIGURABLE)) { - /* Identifier found in registers (always non-deletable) - * or declarative environment record and non-configurable. - */ - return 0; - } - DUK_ASSERT(ref.holder != NULL); - - return duk_hobject_delprop_raw(thr, ref.holder, name, 0); - } - - /* - * Not found (even in global object). - * - * In non-strict mode this is a silent SUCCESS (!), see E5 Section 11.4.1, - * step 3.b. In strict mode this case is a compile time SyntaxError so - * we should not come here. - */ - - DUK_DDD(DUK_DDDPRINT("identifier to be deleted not found: name=%!O " - "(treated as silent success)", - (duk_heaphdr *) name)); - return 1; -} - -#if 0 /*unused*/ -DUK_INTERNAL -duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name) { - return duk__delvar_helper(thr, env, NULL, name); -} -#endif - -DUK_INTERNAL -duk_bool_t duk_js_delvar_activation(duk_hthread *thr, - duk_activation *act, - duk_hstring *name) { - DUK_ASSERT(act != NULL); - return duk__delvar_helper(thr, act->lex_env, act, name); -} - -/* - * DECLVAR - * - * See E5 Sections: - * 10.4.3 Entering Function Code - * 10.5 Declaration Binding Instantion - * 12.2 Variable Statement - * 11.1.2 Identifier Reference - * 10.3.1 Identifier Resolution - * - * Variable declaration behavior is mainly discussed in Section 10.5, - * and is not discussed in the execution semantics (Sections 11-13). - * - * Conceptually declarations happen when code (global, eval, function) - * is entered, before any user code is executed. In practice, register- - * bound identifiers are 'declared' automatically (by virtue of being - * allocated to registers with the initial value 'undefined'). Other - * identifiers are declared in the function prologue with this primitive. - * - * Since non-register bindings eventually back to an internal object's - * properties, the 'prop_flags' argument is used to specify binding - * type: - * - * - Immutable binding: set DUK_PROPDESC_FLAG_WRITABLE to false - * - Non-deletable binding: set DUK_PROPDESC_FLAG_CONFIGURABLE to false - * - The flag DUK_PROPDESC_FLAG_ENUMERABLE should be set, although it - * doesn't really matter for internal objects - * - * All bindings are non-deletable mutable bindings except: - * - * - Declarations in eval code (mutable, deletable) - * - 'arguments' binding in strict function code (immutable) - * - Function name binding of a function expression (immutable) - * - * Declarations may go to declarative environment records (always - * so for functions), but may also go to object environment records - * (e.g. global code). The global object environment has special - * behavior when re-declaring a function (but not a variable); see - * E5.1 specification, Section 10.5, step 5.e. - * - * Declarations always go to the 'top-most' environment record, i.e. - * we never check the record chain. It's not an error even if a - * property (even an immutable or non-deletable one) of the same name - * already exists. - * - * If a declared variable already exists, its value needs to be updated - * (if possible). Returns 1 if a PUTVAR needs to be done by the caller; - * otherwise returns 0. - */ - -DUK_LOCAL -duk_bool_t duk__declvar_helper(duk_hthread *thr, - duk_hobject *env, - duk_hstring *name, - duk_tval *val, - duk_small_uint_t prop_flags, - duk_bool_t is_func_decl) { - duk_hobject *holder; - duk_bool_t parents; - duk__id_lookup_result ref; - duk_tval *tv; - - DUK_DDD(DUK_DDDPRINT("declvar: thr=%p, env=%p, name=%!O, val=%!T, prop_flags=0x%08lx, is_func_decl=%ld " - "(env -> %!iO)", - (void *) thr, (void *) env, (duk_heaphdr *) name, - (duk_tval *) val, (unsigned long) prop_flags, - (unsigned int) is_func_decl, (duk_heaphdr *) env)); - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(env != NULL); - DUK_ASSERT(name != NULL); - DUK_ASSERT(val != NULL); - - /* Note: in strict mode the compiler should reject explicit - * declaration of 'eval' or 'arguments'. However, internal - * bytecode may declare 'arguments' in the function prologue. - * We don't bother checking (or asserting) for these now. - */ - - /* Note: val is a stable duk_tval pointer. The caller makes - * a value copy into its stack frame, so 'tv_val' is not subject - * to side effects here. - */ - - /* - * Check whether already declared. - * - * We need to check whether the binding exists in the environment - * without walking its parents. However, we still need to check - * register-bound identifiers and the prototype chain of an object - * environment target object. - */ - - parents = 0; /* just check 'env' */ - if (duk__get_identifier_reference(thr, env, name, NULL, parents, &ref)) { - duk_int_t e_idx; - duk_int_t h_idx; - duk_small_uint_t flags; - - /* - * Variable already declared, ignore re-declaration. - * The only exception is the updated behavior of E5.1 for - * global function declarations, E5.1 Section 10.5, step 5.e. - * This behavior does not apply to global variable declarations. - */ - - if (!(is_func_decl && env == thr->builtins[DUK_BIDX_GLOBAL_ENV])) { - DUK_DDD(DUK_DDDPRINT("re-declare a binding, ignoring")); - return 1; /* 1 -> needs a PUTVAR */ - } - - /* - * Special behavior in E5.1. - * - * Note that even though parents == 0, the conflicting property - * may be an inherited property (currently our global object's - * prototype is Object.prototype). Step 5.e first operates on - * the existing property (which is potentially in an ancestor) - * and then defines a new property in the global object (and - * never modifies the ancestor). - * - * Also note that this logic would become even more complicated - * if the conflicting property might be a virtual one. Object - * prototype has no virtual properties, though. - * - * XXX: this is now very awkward, rework. - */ - - DUK_DDD(DUK_DDDPRINT("re-declare a function binding in global object, " - "updated E5.1 processing")); - - DUK_ASSERT(ref.holder != NULL); - holder = ref.holder; - - /* holder will be set to the target object, not the actual object - * where the property was found (see duk__get_identifier_reference()). - */ - DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(holder) == DUK_HOBJECT_CLASS_GLOBAL); - DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(holder)); /* global object doesn't have array part */ - - /* XXX: use a helper for prototype traversal; no loop check here */ - /* must be found: was found earlier, and cannot be inherited */ - for (;;) { - DUK_ASSERT(holder != NULL); - if (duk_hobject_find_existing_entry(thr->heap, holder, name, &e_idx, &h_idx)) { - DUK_ASSERT(e_idx >= 0); - break; - } - /* SCANBUILD: NULL pointer dereference, doesn't actually trigger, - * asserted above. - */ - holder = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, holder); - } - DUK_ASSERT(holder != NULL); - DUK_ASSERT(e_idx >= 0); - /* SCANBUILD: scan-build produces a NULL pointer dereference warning - * below; it never actually triggers because holder is actually never - * NULL. - */ - - /* ref.holder is global object, holder is the object with the - * conflicting property. - */ - - flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, holder, e_idx); - if (!(flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) { - if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { - DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable " - "accessor -> reject")); - goto fail_existing_attributes; - } - if (!((flags & DUK_PROPDESC_FLAG_WRITABLE) && - (flags & DUK_PROPDESC_FLAG_ENUMERABLE))) { - DUK_DDD(DUK_DDDPRINT("existing property is a non-configurable " - "plain property which is not writable and " - "enumerable -> reject")); - goto fail_existing_attributes; - } - - DUK_DDD(DUK_DDDPRINT("existing property is not configurable but " - "is plain, enumerable, and writable -> " - "allow redeclaration")); - } - - if (holder == ref.holder) { - /* XXX: if duk_hobject_define_property_internal() was updated - * to handle a pre-existing accessor property, this would be - * a simple call (like for the ancestor case). - */ - DUK_DDD(DUK_DDDPRINT("redefine, offending property in global object itself")); - - if (flags & DUK_PROPDESC_FLAG_ACCESSOR) { - duk_hobject *tmp; - - tmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, holder, e_idx); - DUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, holder, e_idx, NULL); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); - DUK_UNREF(tmp); - tmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, holder, e_idx); - DUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, holder, e_idx, NULL); - DUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp); - DUK_UNREF(tmp); - } else { - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx); - DUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv); - } - - /* Here val would be potentially invalid if we didn't make - * a value copy at the caller. - */ - - tv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx); - DUK_TVAL_SET_TVAL(tv, val); - DUK_TVAL_INCREF(thr, tv); - DUK_HOBJECT_E_SET_FLAGS(thr->heap, holder, e_idx, prop_flags); - - DUK_DDD(DUK_DDDPRINT("updated global binding, final result: " - "value -> %!T, prop_flags=0x%08lx", - (duk_tval *) DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx), - (unsigned long) prop_flags)); - } else { - DUK_DDD(DUK_DDDPRINT("redefine, offending property in ancestor")); - - DUK_ASSERT(ref.holder == thr->builtins[DUK_BIDX_GLOBAL]); - duk_push_tval(thr, val); - duk_hobject_define_property_internal(thr, ref.holder, name, prop_flags); - } - - return 0; - } - - /* - * Not found (in registers or record objects). Declare - * to current variable environment. - */ - - /* - * Get holder object - */ - - if (DUK_HOBJECT_IS_DECENV(env)) { - DUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env); - holder = env; - } else { - DUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env); - holder = ((duk_hobjenv *) env)->target; - DUK_ASSERT(holder != NULL); - } - - /* - * Define new property - * - * Note: this may fail if the holder is not extensible. - */ - - /* XXX: this is awkward as we use an internal method which doesn't handle - * extensibility etc correctly. Basically we'd want to do a [[DefineOwnProperty]] - * or Object.defineProperty() here. - */ - - if (!DUK_HOBJECT_HAS_EXTENSIBLE(holder)) { - goto fail_not_extensible; - } - - duk_push_hobject(thr, holder); - duk_push_hstring(thr, name); - duk_push_tval(thr, val); - duk_xdef_prop(thr, -3, prop_flags); /* [holder name val] -> [holder] */ - duk_pop_unsafe(thr); - - return 0; - - fail_existing_attributes: - fail_not_extensible: - DUK_ERROR_TYPE(thr, "declaration failed"); - return 0; -} - -DUK_INTERNAL -duk_bool_t duk_js_declvar_activation(duk_hthread *thr, - duk_activation *act, - duk_hstring *name, - duk_tval *val, - duk_small_uint_t prop_flags, - duk_bool_t is_func_decl) { - duk_hobject *env; - duk_tval tv_val_copy; - - DUK_ASSERT(act != NULL); - - /* - * Make a value copy of the input val. This ensures that - * side effects cannot invalidate the pointer. - */ - - DUK_TVAL_SET_TVAL(&tv_val_copy, val); - val = &tv_val_copy; - - /* - * Delayed env creation check - */ - - if (!act->var_env) { - DUK_ASSERT(act->lex_env == NULL); - duk_js_init_activation_environment_records_delayed(thr, act); - /* 'act' is a stable pointer, so still OK. */ - } - DUK_ASSERT(act->lex_env != NULL); - DUK_ASSERT(act->var_env != NULL); - - env = act->var_env; - DUK_ASSERT(env != NULL); - DUK_ASSERT(DUK_HOBJECT_IS_ENV(env)); - - return duk__declvar_helper(thr, env, name, val, prop_flags, is_func_decl); -} -#line 1 "duk_lexer.c" -/* - * Lexer for source files, ToNumber() string conversions, RegExp expressions, - * and JSON. - * - * Provides a stream of Ecmascript tokens from an UTF-8/CESU-8 buffer. The - * caller can also rewind the token stream into a certain position which is - * needed by the compiler part for multi-pass scanning. Tokens are - * represented as duk_token structures, and contain line number information. - * Token types are identified with DUK_TOK_* defines. - * - * Characters are decoded into a fixed size lookup window consisting of - * decoded Unicode code points, with window positions past the end of the - * input filled with an invalid codepoint (-1). The tokenizer can thus - * perform multiple character lookups efficiently and with few sanity - * checks (such as access outside the end of the input), which keeps the - * tokenization code small at the cost of performance. - * - * Character data in tokens, such as identifier names and string literals, - * is encoded into CESU-8 format on-the-fly while parsing the token in - * question. The string data is made reachable to garbage collection by - * placing the token-related values in value stack entries allocated for - * this purpose by the caller. The characters exist in Unicode code point - * form only in the fixed size lookup window, which keeps character data - * expansion (of especially ASCII data) low. - * - * Token parsing supports the full range of Unicode characters as described - * in the E5 specification. Parsing has been optimized for ASCII characters - * because ordinary Ecmascript code consists almost entirely of ASCII - * characters. Matching of complex Unicode codepoint sets (such as in the - * IdentifierStart and IdentifierPart productions) is optimized for size, - * and is done using a linear scan of a bit-packed list of ranges. This is - * very slow, but should never be entered unless the source code actually - * contains Unicode characters. - * - * Ecmascript tokenization is partially context sensitive. First, - * additional future reserved words are recognized in strict mode (see E5 - * Section 7.6.1.2). Second, a forward slash character ('/') can be - * recognized either as starting a RegExp literal or as a division operator, - * depending on context. The caller must provide necessary context flags - * when requesting a new token. - * - * Future work: - * - * * Make line number tracking optional, as it consumes space. - * - * * Add a feature flag for disabling UTF-8 decoding of input, as most - * source code is ASCII. Because of Unicode escapes written in ASCII, - * this does not allow Unicode support to be removed from e.g. - * duk_unicode_is_identifier_start() nor does it allow removal of CESU-8 - * encoding of e.g. string literals. - * - * * Add a feature flag for disabling Unicode compliance of e.g. identifier - * names. This allows for a build more than a kilobyte smaller, because - * Unicode ranges needed by duk_unicode_is_identifier_start() and - * duk_unicode_is_identifier_part() can be dropped. String literals - * should still be allowed to contain escaped Unicode, so this still does - * not allow removal of CESU-8 encoding of e.g. string literals. - * - * * Character lookup tables for codepoints above BMP could be stripped. - * - * * Strictly speaking, E5 specification requires that source code consists - * of 16-bit code units, and if not, must be conceptually converted to - * that format first. The current lexer processes Unicode code points - * and allows characters outside the BMP. These should be converted to - * surrogate pairs while reading the source characters into the window, - * not after tokens have been formed (as is done now). However, the fix - * is not trivial because two characters are decoded from one codepoint. - * - * * Optimize for speed as well as size. Large if-else ladders are (at - * least potentially) slow. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Various defines and file specific helper macros - */ - -#define DUK__MAX_RE_DECESC_DIGITS 9 -#define DUK__MAX_RE_QUANT_DIGITS 9 /* Does not allow e.g. 2**31-1, but one more would allow overflows of u32. */ - -/* whether to use macros or helper function depends on call count */ -#define DUK__ISDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_9) -#define DUK__ISHEXDIGIT(x) duk__is_hex_digit((x)) -#define DUK__ISOCTDIGIT(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_7) -#define DUK__ISDIGIT03(x) ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_3) -#define DUK__ISDIGIT47(x) ((x) >= DUK_ASC_4 && (x) <= DUK_ASC_7) - -/* lexer character window helpers */ -#define DUK__LOOKUP(lex_ctx,idx) ((lex_ctx)->window[(idx)].codepoint) -#define DUK__ADVANCECHARS(lex_ctx,count) duk__advance_chars((lex_ctx), (count)) -#define DUK__ADVANCEBYTES(lex_ctx,count) duk__advance_bytes((lex_ctx), (count)) -#define DUK__INITBUFFER(lex_ctx) duk__initbuffer((lex_ctx)) -#define DUK__APPENDBUFFER(lex_ctx,x) duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x)) -#define DUK__APPENDBUFFER_ASCII(lex_ctx,x) duk__appendbuffer_ascii((lex_ctx), (duk_codepoint_t) (x)) - -/* lookup shorthands (note: assume context variable is named 'lex_ctx') */ -#define DUK__L0() DUK__LOOKUP(lex_ctx, 0) -#define DUK__L1() DUK__LOOKUP(lex_ctx, 1) -#define DUK__L2() DUK__LOOKUP(lex_ctx, 2) -#define DUK__L3() DUK__LOOKUP(lex_ctx, 3) -#define DUK__L4() DUK__LOOKUP(lex_ctx, 4) -#define DUK__L5() DUK__LOOKUP(lex_ctx, 5) - -/* packed advance/token number macro used by multiple functions */ -#define DUK__ADVTOK(advbytes,tok) ((((advbytes) * sizeof(duk_lexer_codepoint)) << 8) + (tok)) - -/* - * Advance lookup window by N characters, filling in new characters as - * necessary. After returning caller is guaranteed a character window of - * at least DUK_LEXER_WINDOW_SIZE characters. - * - * The main function duk__advance_bytes() is called at least once per every - * token so it has a major lexer/compiler performance impact. There are two - * variants for the main duk__advance_bytes() algorithm: a sliding window - * approach which is slightly faster at the cost of larger code footprint, - * and a simple copying one. - * - * Decoding directly from the source string would be another lexing option. - * But the lookup window based approach has the advantage of hiding the - * source string and its encoding effectively which gives more flexibility - * going forward to e.g. support chunked streaming of source from flash. - * - * Decodes UTF-8/CESU-8 leniently with support for code points from U+0000 to - * U+10FFFF, causing an error if the input is unparseable. Leniency means: - * - * * Unicode code point validation is intentionally not performed, - * except to check that the codepoint does not exceed 0x10ffff. - * - * * In particular, surrogate pairs are allowed and not combined, which - * allows source files to represent all SourceCharacters with CESU-8. - * Broken surrogate pairs are allowed, as Ecmascript does not mandate - * their validation. - * - * * Allow non-shortest UTF-8 encodings. - * - * Leniency here causes few security concerns because all character data is - * decoded into Unicode codepoints before lexer processing, and is then - * re-encoded into CESU-8. The source can be parsed as strict UTF-8 with - * a compiler option. However, Ecmascript source characters include -all- - * 16-bit unsigned integer codepoints, so leniency seems to be appropriate. - * - * Note that codepoints above the BMP are not strictly SourceCharacters, - * but the lexer still accepts them as such. Before ending up in a string - * or an identifier name, codepoints above BMP are converted into surrogate - * pairs and then CESU-8 encoded, resulting in 16-bit Unicode data as - * expected by Ecmascript. - * - * An alternative approach to dealing with invalid or partial sequences - * would be to skip them and replace them with e.g. the Unicode replacement - * character U+FFFD. This has limited utility because a replacement character - * will most likely cause a parse error, unless it occurs inside a string. - * Further, Ecmascript source is typically pure ASCII. - * - * See: - * - * http://en.wikipedia.org/wiki/UTF-8 - * http://en.wikipedia.org/wiki/CESU-8 - * http://tools.ietf.org/html/rfc3629 - * http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences - * - * Future work: - * - * * Reject other invalid Unicode sequences (see Wikipedia entry for examples) - * in strict UTF-8 mode. - * - * * Size optimize. An attempt to use a 16-byte lookup table for the first - * byte resulted in a code increase though. - * - * * Is checking against maximum 0x10ffff really useful? 4-byte encoding - * imposes a certain limit anyway. - * - * * Support chunked streaming of source code. Can be implemented either - * by streaming chunks of bytes or chunks of codepoints. - */ - -#if defined(DUK_USE_LEXER_SLIDING_WINDOW) -DUK_LOCAL void duk__fill_lexer_buffer(duk_lexer_ctx *lex_ctx, duk_small_uint_t start_offset_bytes) { - duk_lexer_codepoint *cp, *cp_end; - duk_ucodepoint_t x; - duk_small_uint_t contlen; - const duk_uint8_t *p, *p_end; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - duk_ucodepoint_t mincp; -#endif - duk_int_t input_line; - - /* Use temporaries and update lex_ctx only when finished. */ - input_line = lex_ctx->input_line; - p = lex_ctx->input + lex_ctx->input_offset; - p_end = lex_ctx->input + lex_ctx->input_length; - - cp = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->buffer + start_offset_bytes); - cp_end = lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE; - - for (; cp != cp_end; cp++) { - cp->offset = (duk_size_t) (p - lex_ctx->input); - cp->line = input_line; - - /* XXX: potential issue with signed pointers, p_end < p. */ - if (DUK_UNLIKELY(p >= p_end)) { - /* If input_offset were assigned a negative value, it would - * result in a large positive value. Most likely it would be - * larger than input_length and be caught here. In any case - * no memory unsafe behavior would happen. - */ - cp->codepoint = -1; - continue; - } - - x = (duk_ucodepoint_t) (*p++); - - /* Fast path. */ - - if (DUK_LIKELY(x < 0x80UL)) { - DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */ - if (DUK_UNLIKELY(x <= 0x000dUL)) { - if ((x == 0x000aUL) || - ((x == 0x000dUL) && (p >= p_end || *p != 0x000aUL))) { - /* lookup for 0x000a above assumes shortest encoding now */ - - /* E5 Section 7.3, treat the following as newlines: - * LF - * CR [not followed by LF] - * LS - * PS - * - * For CR LF, CR is ignored if it is followed by LF, and the LF will bump - * the line number. - */ - input_line++; - } - } - - cp->codepoint = (duk_codepoint_t) x; - continue; - } - - /* Slow path. */ - - if (x < 0xc0UL) { - /* 10xx xxxx -> invalid */ - goto error_encoding; - } else if (x < 0xe0UL) { - /* 110x xxxx 10xx xxxx */ - contlen = 1; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x80UL; -#endif - x = x & 0x1fUL; - } else if (x < 0xf0UL) { - /* 1110 xxxx 10xx xxxx 10xx xxxx */ - contlen = 2; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x800UL; -#endif - x = x & 0x0fUL; - } else if (x < 0xf8UL) { - /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */ - contlen = 3; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x10000UL; -#endif - x = x & 0x07UL; - } else { - /* no point in supporting encodings of 5 or more bytes */ - goto error_encoding; - } - - DUK_ASSERT(p_end >= p); - if ((duk_size_t) contlen > (duk_size_t) (p_end - p)) { - goto error_clipped; - } - - while (contlen > 0) { - duk_small_uint_t y; - y = *p++; - if ((y & 0xc0U) != 0x80U) { - /* check that byte has the form 10xx xxxx */ - goto error_encoding; - } - x = x << 6; - x += y & 0x3fUL; - contlen--; - } - - /* check final character validity */ - - if (x > 0x10ffffUL) { - goto error_encoding; - } -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) { - goto error_encoding; - } -#endif - - DUK_ASSERT(x != 0x000aUL && x != 0x000dUL); - if ((x == 0x2028UL) || (x == 0x2029UL)) { - input_line++; - } - - cp->codepoint = (duk_codepoint_t) x; - } - - lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input); - lex_ctx->input_line = input_line; - return; - - error_clipped: /* clipped codepoint */ - error_encoding: /* invalid codepoint encoding or codepoint */ - lex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input); - lex_ctx->input_line = input_line; - - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED); -} - -DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) { - duk_small_uint_t used_bytes, avail_bytes; - - DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */ - DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))); - DUK_ASSERT(lex_ctx->window >= lex_ctx->buffer); - DUK_ASSERT(lex_ctx->window < lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE); - DUK_ASSERT((duk_uint8_t *) lex_ctx->window + count_bytes <= (duk_uint8_t *) lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint)); - - /* Zero 'count' is also allowed to make call sites easier. - * Arithmetic in bytes generates better code in GCC. - */ - - lex_ctx->window = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->window + count_bytes); /* avoid multiply */ - used_bytes = (duk_small_uint_t) ((duk_uint8_t *) lex_ctx->window - (duk_uint8_t *) lex_ctx->buffer); - avail_bytes = DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint) - used_bytes; - if (avail_bytes < (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))) { - /* Not enough data to provide a full window, so "scroll" window to - * start of buffer and fill up the rest. - */ - DUK_MEMMOVE((void *) lex_ctx->buffer, - (const void *) lex_ctx->window, - (size_t) avail_bytes); - lex_ctx->window = lex_ctx->buffer; - duk__fill_lexer_buffer(lex_ctx, avail_bytes); - } -} - -DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) { - lex_ctx->window = lex_ctx->buffer; - duk__fill_lexer_buffer(lex_ctx, 0); -} -#else /* DUK_USE_LEXER_SLIDING_WINDOW */ -DUK_LOCAL duk_codepoint_t duk__read_char(duk_lexer_ctx *lex_ctx) { - duk_ucodepoint_t x; - duk_small_uint_t len; - duk_small_uint_t i; - const duk_uint8_t *p; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - duk_ucodepoint_t mincp; -#endif - duk_size_t input_offset; - - input_offset = lex_ctx->input_offset; - if (DUK_UNLIKELY(input_offset >= lex_ctx->input_length)) { - /* If input_offset were assigned a negative value, it would - * result in a large positive value. Most likely it would be - * larger than input_length and be caught here. In any case - * no memory unsafe behavior would happen. - */ - return -1; - } - - p = lex_ctx->input + input_offset; - x = (duk_ucodepoint_t) (*p); - - if (DUK_LIKELY(x < 0x80UL)) { - /* 0xxx xxxx -> fast path */ - - /* input offset tracking */ - lex_ctx->input_offset++; - - DUK_ASSERT(x != 0x2028UL && x != 0x2029UL); /* not LS/PS */ - if (DUK_UNLIKELY(x <= 0x000dUL)) { - if ((x == 0x000aUL) || - ((x == 0x000dUL) && (lex_ctx->input_offset >= lex_ctx->input_length || - lex_ctx->input[lex_ctx->input_offset] != 0x000aUL))) { - /* lookup for 0x000a above assumes shortest encoding now */ - - /* E5 Section 7.3, treat the following as newlines: - * LF - * CR [not followed by LF] - * LS - * PS - * - * For CR LF, CR is ignored if it is followed by LF, and the LF will bump - * the line number. - */ - lex_ctx->input_line++; - } - } - - return (duk_codepoint_t) x; - } - - /* Slow path. */ - - if (x < 0xc0UL) { - /* 10xx xxxx -> invalid */ - goto error_encoding; - } else if (x < 0xe0UL) { - /* 110x xxxx 10xx xxxx */ - len = 2; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x80UL; -#endif - x = x & 0x1fUL; - } else if (x < 0xf0UL) { - /* 1110 xxxx 10xx xxxx 10xx xxxx */ - len = 3; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x800UL; -#endif - x = x & 0x0fUL; - } else if (x < 0xf8UL) { - /* 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx */ - len = 4; -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - mincp = 0x10000UL; -#endif - x = x & 0x07UL; - } else { - /* no point in supporting encodings of 5 or more bytes */ - goto error_encoding; - } - - DUK_ASSERT(lex_ctx->input_length >= lex_ctx->input_offset); - if ((duk_size_t) len > (duk_size_t) (lex_ctx->input_length - lex_ctx->input_offset)) { - goto error_clipped; - } - - p++; - for (i = 1; i < len; i++) { - duk_small_uint_t y; - y = *p++; - if ((y & 0xc0U) != 0x80U) { - /* check that byte has the form 10xx xxxx */ - goto error_encoding; - } - x = x << 6; - x += y & 0x3fUL; - } - - /* check final character validity */ - - if (x > 0x10ffffUL) { - goto error_encoding; - } -#if defined(DUK_USE_STRICT_UTF8_SOURCE) - if (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) { - goto error_encoding; - } -#endif - - /* input offset tracking */ - lex_ctx->input_offset += len; - - /* line tracking */ - DUK_ASSERT(x != 0x000aUL && x != 0x000dUL); - if ((x == 0x2028UL) || (x == 0x2029UL)) { - lex_ctx->input_line++; - } - - return (duk_codepoint_t) x; - - error_clipped: /* clipped codepoint */ - error_encoding: /* invalid codepoint encoding or codepoint */ - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED); - return 0; -} - -DUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) { - duk_small_uint_t keep_bytes; - duk_lexer_codepoint *cp, *cp_end; - - DUK_ASSERT_DISABLE(count_bytes >= 0); /* unsigned */ - DUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))); - - /* Zero 'count' is also allowed to make call sites easier. */ - - keep_bytes = DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint) - count_bytes; - DUK_MEMMOVE((void *) lex_ctx->window, - (const void *) ((duk_uint8_t *) lex_ctx->window + count_bytes), - (size_t) keep_bytes); - - cp = (duk_lexer_codepoint *) ((duk_uint8_t *) lex_ctx->window + keep_bytes); - cp_end = lex_ctx->window + DUK_LEXER_WINDOW_SIZE; - for (; cp != cp_end; cp++) { - cp->offset = lex_ctx->input_offset; - cp->line = lex_ctx->input_line; - cp->codepoint = duk__read_char(lex_ctx); - } -} - -DUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) { - /* Call with count == DUK_LEXER_WINDOW_SIZE to fill buffer initially. */ - duk__advance_bytes(lex_ctx, DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)); /* fill window */ -} -#endif /* DUK_USE_LEXER_SLIDING_WINDOW */ - -DUK_LOCAL void duk__advance_chars(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_chars) { - duk__advance_bytes(lex_ctx, count_chars * sizeof(duk_lexer_codepoint)); -} - -/* - * (Re)initialize the temporary byte buffer. May be called extra times - * with little impact. - */ - -DUK_LOCAL void duk__initbuffer(duk_lexer_ctx *lex_ctx) { - /* Reuse buffer as is unless buffer has grown large. */ - if (DUK_HBUFFER_DYNAMIC_GET_SIZE(lex_ctx->buf) < DUK_LEXER_TEMP_BUF_LIMIT) { - /* Keep current size */ - } else { - duk_hbuffer_resize(lex_ctx->thr, lex_ctx->buf, DUK_LEXER_TEMP_BUF_LIMIT); - } - - DUK_BW_INIT_WITHBUF(lex_ctx->thr, &lex_ctx->bw, lex_ctx->buf); -} - -/* - * Append a Unicode codepoint to the temporary byte buffer. Performs - * CESU-8 surrogate pair encoding for codepoints above the BMP. - * Existing surrogate pairs are allowed and also encoded into CESU-8. - */ - -DUK_LOCAL void duk__appendbuffer(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { - /* - * Since character data is only generated by decoding the source or by - * the compiler itself, we rely on the input codepoints being correct - * and avoid a check here. - * - * Character data can also come here through decoding of Unicode - * escapes ("\udead\ubeef") so all 16-but unsigned values can be - * present, even when the source file itself is strict UTF-8. - */ - DUK_ASSERT(x >= 0 && x <= 0x10ffffL); - - DUK_BW_WRITE_ENSURE_CESU8(lex_ctx->thr, &lex_ctx->bw, (duk_ucodepoint_t) x); -} - -DUK_LOCAL void duk__appendbuffer_ascii(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) { - /* ASCII characters can be emitted as a single byte without encoding - * which matters for some fast paths. - */ - DUK_ASSERT(x >= 0 && x <= 0x7f); - - DUK_BW_WRITE_ENSURE_U8(lex_ctx->thr, &lex_ctx->bw, (duk_uint8_t) x); -} - -/* - * Intern the temporary byte buffer into a valstack slot - * (in practice, slot1 or slot2). - */ - -DUK_LOCAL duk_hstring *duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) { - DUK_ASSERT(valstack_idx == lex_ctx->slot1_idx || valstack_idx == lex_ctx->slot2_idx); - - DUK_BW_PUSH_AS_STRING(lex_ctx->thr, &lex_ctx->bw); - duk_replace(lex_ctx->thr, valstack_idx); - return duk_known_hstring(lex_ctx->thr, valstack_idx); -} - -/* - * Init lexer context - */ - -DUK_INTERNAL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx) { - DUK_ASSERT(lex_ctx != NULL); - - DUK_MEMZERO(lex_ctx, sizeof(*lex_ctx)); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) -#if defined(DUK_USE_LEXER_SLIDING_WINDOW) - lex_ctx->window = NULL; -#endif - lex_ctx->thr = NULL; - lex_ctx->input = NULL; - lex_ctx->buf = NULL; -#endif -} - -/* - * Set lexer input position and reinitialize lookup window. - */ - -DUK_INTERNAL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { - pt->offset = lex_ctx->window[0].offset; - pt->line = lex_ctx->window[0].line; -} - -DUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) { - DUK_ASSERT_DISABLE(pt->offset >= 0); /* unsigned */ - DUK_ASSERT(pt->line >= 1); - lex_ctx->input_offset = pt->offset; - lex_ctx->input_line = pt->line; - duk__init_lexer_window(lex_ctx); -} - -/* - * Lexing helpers - */ - -/* Numeric value of a hex digit (also covers octal and decimal digits) or - * -1 if not a valid hex digit. - */ -DUK_LOCAL duk_codepoint_t duk__hexval_validate(duk_codepoint_t x) { - duk_small_int_t t; - - /* Here 'x' is a Unicode codepoint */ - if (DUK_LIKELY(x >= 0 && x <= 0xff)) { - t = duk_hex_dectab[x]; - if (DUK_LIKELY(t >= 0)) { - return t; - } - } - - return -1; -} - -/* Just a wrapper for call sites where 'x' is known to be valid so - * we assert for it before decoding. - */ -DUK_LOCAL duk_codepoint_t duk__hexval(duk_codepoint_t x) { - duk_codepoint_t ret; - - DUK_ASSERT((x >= DUK_ASC_0 && x <= DUK_ASC_9) || - (x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_F) || - (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_F)); - ret = duk__hexval_validate(x); - DUK_ASSERT(ret >= 0 && ret <= 15); - return ret; -} - -/* having this as a separate function provided a size benefit */ -DUK_LOCAL duk_bool_t duk__is_hex_digit(duk_codepoint_t x) { - if (DUK_LIKELY(x >= 0 && x <= 0xff)) { - return (duk_hex_dectab[x] >= 0); - } - return 0; -} - -/* Parse a Unicode escape of the form \xHH, \uHHHH, or \u{H+}. Shared by - * source and RegExp parsing. - */ -DUK_LOCAL duk_codepoint_t duk__lexer_parse_escape(duk_lexer_ctx *lex_ctx, duk_bool_t allow_es6) { - duk_small_int_t digits; /* Initial value 2 or 4 for fixed length escapes, 0 for ES2015 \u{H+}. */ - duk_codepoint_t escval; - duk_codepoint_t x; - duk_small_uint_t adv; - - DUK_ASSERT(DUK__L0() == DUK_ASC_BACKSLASH); /* caller responsibilities */ - DUK_ASSERT(DUK__L1() == DUK_ASC_LC_X || DUK__L1() == DUK_ASC_LC_U); - DUK_UNREF(allow_es6); - - adv = 2; - digits = 2; - if (DUK__L1() == DUK_ASC_LC_U) { - digits = 4; -#if defined(DUK_USE_ES6_UNICODE_ESCAPE) - if (DUK__L2() == DUK_ASC_LCURLY && allow_es6) { - digits = 0; - adv = 3; - } -#endif - } - DUK__ADVANCECHARS(lex_ctx, adv); - - escval = 0; - for (;;) { - /* One of the escape forms: \xHH, \uHHHH, \u{H+}. - * The 'digits' variable tracks parsing state and is - * initialized to: - * - * \xHH 2 - * \uHH 4 - * \u{H+} 0 first time, updated to -1 to indicate - * at least one digit has been parsed - * - * Octal parsing is handled separately because it can be - * done with fixed lookahead and also has validation - * rules which depend on the escape length (which is - * variable). - * - * We don't need a specific check for x < 0 (end of - * input) or duk_unicode_is_line_terminator(x) - * because the 'dig' decode will fail and lead to a - * SyntaxError. - */ - duk_codepoint_t dig; - - x = DUK__L0(); - DUK__ADVANCECHARS(lex_ctx, 1); - - dig = duk__hexval_validate(x); - if (digits > 0) { - digits--; - if (dig < 0) { - goto fail_escape; - } - DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); - escval = (escval << 4) + dig; - if (digits == 0) { - DUK_ASSERT(escval >= 0 && escval <= 0xffffL); - break; - } - } else { -#if defined(DUK_USE_ES6_UNICODE_ESCAPE) - DUK_ASSERT(digits == 0 /* first time */ || digits == -1 /* others */); - if (dig >= 0) { - DUK_ASSERT(dig >= 0x00 && dig <= 0x0f); - escval = (escval << 4) + dig; - if (escval > 0x10ffffL) { - goto fail_escape; - } - } else if (x == DUK_ASC_RCURLY) { - if (digits == 0) { - /* Empty escape, \u{}. */ - goto fail_escape; - } - DUK_ASSERT(escval >= 0 && escval <= 0x10ffffL); - break; - } else { - goto fail_escape; - } - digits = -1; /* Indicate we have at least one digit. */ -#else /* DUK_USE_ES6_UNICODE_ESCAPE */ - DUK_ASSERT(0); /* Never happens if \u{H+} support disabled. */ -#endif /* DUK_USE_ES6_UNICODE_ESCAPE */ - } - } - - return escval; - - fail_escape: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); -} - -/* Parse legacy octal escape of the form \N{1,3}, e.g. \0, \5, \0377. Maximum - * allowed value is \0377 (U+00FF), longest match is used. Used for both string - * RegExp octal escape parsing. Window[0] must be the slash '\' and the first - * digit must already be validated to be in [0-9] by the caller. - */ -DUK_LOCAL duk_codepoint_t duk__lexer_parse_legacy_octal(duk_lexer_ctx *lex_ctx, duk_small_uint_t *out_adv, duk_bool_t reject_annex_b) { - duk_codepoint_t cp; - duk_small_uint_t lookup_idx; - duk_small_uint_t adv; - duk_codepoint_t tmp; - - DUK_ASSERT(out_adv != NULL); - DUK_ASSERT(DUK__LOOKUP(lex_ctx, 0) == DUK_ASC_BACKSLASH); - DUK_ASSERT(DUK__LOOKUP(lex_ctx, 1) >= DUK_ASC_0 && DUK__LOOKUP(lex_ctx, 1) <= DUK_ASC_9); - - cp = 0; - tmp = 0; - for (lookup_idx = 1; lookup_idx <= 3; lookup_idx++) { - DUK_DDD(DUK_DDDPRINT("lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp)); - tmp = DUK__LOOKUP(lex_ctx, lookup_idx); - if (tmp < DUK_ASC_0 || tmp > DUK_ASC_7) { - /* No more valid digits. */ - break; - } - tmp = (cp << 3) + (tmp - DUK_ASC_0); - if (tmp > 0xff) { - /* Three digit octal escapes above \377 (= 0xff) - * are not allowed. - */ - break; - } - cp = tmp; - } - DUK_DDD(DUK_DDDPRINT("final lookup_idx=%ld, cp=%ld", (long) lookup_idx, (long) cp)); - - adv = lookup_idx; - if (lookup_idx == 1) { - DUK_DDD(DUK_DDDPRINT("\\8 or \\9 -> treat as literal, accept in strict mode too")); - DUK_ASSERT(tmp == DUK_ASC_8 || tmp == DUK_ASC_9); - cp = tmp; - adv++; /* correction to above, eat offending character */ - } else if (lookup_idx == 2 && cp == 0) { - /* Note: 'foo\0bar' is OK in strict mode, but 'foo\00bar' is not. - * It won't be interpreted as 'foo\u{0}0bar' but as a SyntaxError. - */ - DUK_DDD(DUK_DDDPRINT("\\0 -> accept in strict mode too")); - } else { - /* This clause also handles non-shortest zero, e.g. \00. */ - if (reject_annex_b) { - DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> reject in strict-mode", (long) cp)); - cp = -1; - } else { - DUK_DDD(DUK_DDDPRINT("non-zero octal literal %ld -> accepted", (long) cp)); - DUK_ASSERT(cp >= 0 && cp <= 0xff); - } - } - - *out_adv = adv; - - DUK_ASSERT((cp >= 0 && cp <= 0xff) || (cp == -1 && reject_annex_b)); - return cp; -} - -/* XXX: move strict mode to lex_ctx? */ -DUK_LOCAL void duk__lexer_parse_string_literal(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_small_int_t quote, duk_bool_t strict_mode) { - duk_small_uint_t adv; - - for (adv = 1 /* initial quote */ ;;) { - duk_codepoint_t x; - - DUK__ADVANCECHARS(lex_ctx, adv); /* eat opening quote on first loop */ - x = DUK__L0(); - - adv = 1; - if (x == quote) { - DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing quote */ - break; - } else if (x == '\\') { - /* DUK__L0 -> '\' char - * DUK__L1 ... DUK__L5 -> more lookup - */ - duk_small_int_t emitcp = -1; - - x = DUK__L1(); - - /* How much to advance before next loop. */ - adv = 2; /* note: long live range */ - - switch (x) { - case '\'': - emitcp = 0x0027; - break; - case '"': - emitcp = 0x0022; - break; - case '\\': - emitcp = 0x005c; - break; - case 'b': - emitcp = 0x0008; - break; - case 'f': - emitcp = 0x000c; - break; - case 'n': - emitcp = 0x000a; - break; - case 'r': - emitcp = 0x000d; - break; - case 't': - emitcp = 0x0009; - break; - case 'v': - emitcp = 0x000b; - break; - case 'x': - case 'u': { - duk_codepoint_t esc_cp; - esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); - DUK__APPENDBUFFER(lex_ctx, esc_cp); - adv = 0; - break; - } - default: { - if (duk_unicode_is_line_terminator(x)) { - /* line continuation */ - if (x == 0x000d && DUK__L2() == 0x000a) { - /* CR LF again a special case */ - adv = 3; /* line terminator, CR, LF */ - } - } else if (DUK__ISDIGIT(x)) { - /* - * Octal escape or zero escape: - * \0 (lookahead not OctalDigit) - * \1 ... \7 (lookahead not OctalDigit) - * \ZeroToThree OctalDigit (lookahead not OctalDigit) - * \FourToSeven OctalDigit (no lookahead restrictions) - * \ZeroToThree OctalDigit OctalDigit (no lookahead restrictions) - * - * Zero escape is part of the standard syntax. Octal escapes are - * defined in E5 Section B.1.2, and are only allowed in non-strict mode. - * Any other productions starting with a decimal digit are invalid - * but are in practice treated like identity escapes. - * - * Parse octal (up to 3 digits) from the lookup window. - */ - - emitcp = duk__lexer_parse_legacy_octal(lex_ctx, &adv, strict_mode /*reject_annex_b*/); - if (emitcp < 0) { - goto fail_escape; - } - } else if (x < 0) { - goto fail_unterminated; - } else { - /* escaped NonEscapeCharacter */ - DUK__APPENDBUFFER(lex_ctx, x); - } - } /* end default clause */ - } /* end switch */ - - /* Shared handling for single codepoint escapes. */ - if (emitcp >= 0) { - DUK__APPENDBUFFER(lex_ctx, emitcp); - } - - /* Track number of escapes; count not really needed but directive - * prologues need to detect whether there were any escapes or line - * continuations or not. - */ - out_token->num_escapes++; - } else if (x >= 0x20 && x <= 0x7f) { - /* Fast path for ASCII case, avoids line terminator - * check and CESU-8 encoding. - */ - DUK_ASSERT(x >= 0); - DUK_ASSERT(!duk_unicode_is_line_terminator(x)); - DUK_ASSERT(x != quote); - DUK_ASSERT(x != DUK_ASC_BACKSLASH); - DUK__APPENDBUFFER_ASCII(lex_ctx, x); - } else if (x < 0 || duk_unicode_is_line_terminator(x)) { - goto fail_unterminated; - } else { - /* Character which is part of the string but wasn't handled - * by the fast path. - */ - DUK__APPENDBUFFER(lex_ctx, x); - } - } /* string parse loop */ - - return; - - fail_escape: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); - return; - - fail_unterminated: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_STRING); - return; -} - -/* Skip to end-of-line (or end-of-file), used for single line comments. */ -DUK_LOCAL void duk__lexer_skip_to_endofline(duk_lexer_ctx *lex_ctx) { - for (;;) { - duk_codepoint_t x; - - x = DUK__L0(); - if (x < 0 || duk_unicode_is_line_terminator(x)) { - break; - } - DUK__ADVANCECHARS(lex_ctx, 1); - } -} - -/* - * Parse Ecmascript source InputElementDiv or InputElementRegExp - * (E5 Section 7), skipping whitespace, comments, and line terminators. - * - * Possible results are: - * (1) a token - * (2) a line terminator (skipped) - * (3) a comment (skipped) - * (4) EOF - * - * White space is automatically skipped from the current position (but - * not after the input element). If input has already ended, returns - * DUK_TOK_EOF indefinitely. If a parse error occurs, uses an DUK_ERROR() - * macro call (and hence a longjmp through current heap longjmp context). - * Comments and line terminator tokens are automatically skipped. - * - * The input element being matched is determined by regexp_mode; if set, - * parses a InputElementRegExp, otherwise a InputElementDiv. The - * difference between these are handling of productions starting with a - * forward slash. - * - * If strict_mode is set, recognizes additional future reserved words - * specific to strict mode, and refuses to parse octal literals. - * - * The matching strategy below is to (currently) use a six character - * lookup window to quickly determine which production is the -longest- - * matching one, and then parse that. The top-level if-else clauses - * match the first character, and the code blocks for each clause - * handle -all- alternatives for that first character. Ecmascript - * specification uses the "longest match wins" semantics, so the order - * of the if-clauses matters. - * - * Misc notes: - * - * * Ecmascript numeric literals do not accept a sign character. - * Consequently e.g. "-1.0" is parsed as two tokens: a negative - * sign and a positive numeric literal. The compiler performs - * the negation during compilation, so this has no adverse impact. - * - * * There is no token for "undefined": it is just a value available - * from the global object (or simply established by doing a reference - * to an undefined value). - * - * * Some contexts want Identifier tokens, which are IdentifierNames - * excluding reserved words, while some contexts want IdentifierNames - * directly. In the latter case e.g. "while" is interpreted as an - * identifier name, not a DUK_TOK_WHILE token. The solution here is - * to provide both token types: DUK_TOK_WHILE goes to 't' while - * DUK_TOK_IDENTIFIER goes to 't_nores', and 'slot1' always contains - * the identifier / keyword name. - * - * * Directive prologue needs to identify string literals such as - * "use strict" and 'use strict', which are sensitive to line - * continuations and escape sequences. For instance, "use\u0020strict" - * is a valid directive but is distinct from "use strict". The solution - * here is to decode escapes while tokenizing, but to keep track of the - * number of escapes. Directive detection can then check that the - * number of escapes is zero. - * - * * Multi-line comments with one or more internal LineTerminator are - * treated like a line terminator to comply with automatic semicolon - * insertion. - */ - -DUK_INTERNAL -void duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx, - duk_token *out_token, - duk_bool_t strict_mode, - duk_bool_t regexp_mode) { - duk_codepoint_t x; /* temporary, must be signed and 32-bit to hold Unicode code points */ - duk_small_uint_t advtok = 0; /* (advance << 8) + token_type, updated at function end, - * init is unnecessary but suppresses "may be used uninitialized" warnings. - */ - duk_bool_t got_lineterm = 0; /* got lineterm preceding non-whitespace, non-lineterm token */ - - if (++lex_ctx->token_count >= lex_ctx->token_limit) { - goto fail_token_limit; - } - - out_token->t = DUK_TOK_EOF; - out_token->t_nores = DUK_TOK_INVALID; /* marker: copy t if not changed */ -#if 0 /* not necessary to init, disabled for faster parsing */ - out_token->num = DUK_DOUBLE_NAN; - out_token->str1 = NULL; - out_token->str2 = NULL; -#endif - out_token->num_escapes = 0; - /* out_token->lineterm set by caller */ - - /* This would be nice, but parsing is faster without resetting the - * value slots. The only side effect is that references to temporary - * string values may linger until lexing is finished; they're then - * freed normally. - */ -#if 0 - duk_to_undefined(lex_ctx->thr, lex_ctx->slot1_idx); - duk_to_undefined(lex_ctx->thr, lex_ctx->slot2_idx); -#endif - - /* 'advtok' indicates how much to advance and which token id to assign - * at the end. This shared functionality minimizes code size. All - * code paths are required to set 'advtok' to some value, so no default - * init value is used. Code paths calling DUK_ERROR() never return so - * they don't need to set advtok. - */ - - /* - * Matching order: - * - * Punctuator first chars, also covers comments, regexps - * LineTerminator - * Identifier or reserved word, also covers null/true/false literals - * NumericLiteral - * StringLiteral - * EOF - * - * The order does not matter as long as the longest match is - * always correctly identified. There are order dependencies - * in the clauses, so it's not trivial to convert to a switch. - */ - - restart_lineupdate: - out_token->start_line = lex_ctx->window[0].line; - - restart: - out_token->start_offset = lex_ctx->window[0].offset; - - x = DUK__L0(); - - switch (x) { - case DUK_ASC_SPACE: - case DUK_ASC_HT: /* fast paths for space and tab */ - DUK__ADVANCECHARS(lex_ctx, 1); - goto restart; - case DUK_ASC_LF: /* LF line terminator; CR LF and Unicode lineterms are handled in slow path */ - DUK__ADVANCECHARS(lex_ctx, 1); - got_lineterm = 1; - goto restart_lineupdate; -#if defined(DUK_USE_SHEBANG_COMMENTS) - case DUK_ASC_HASH: /* '#' */ - if (DUK__L1() == DUK_ASC_EXCLAMATION && lex_ctx->window[0].offset == 0 && - (lex_ctx->flags & DUK_COMPILE_SHEBANG)) { - /* "Shebang" comment ('#! ...') on first line. */ - /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */ - duk__lexer_skip_to_endofline(lex_ctx); - goto restart; /* line terminator will be handled on next round */ - } - goto fail_token; -#endif /* DUK_USE_SHEBANG_COMMENTS */ - case DUK_ASC_SLASH: /* '/' */ - if (DUK__L1() == DUK_ASC_SLASH) { - /* - * E5 Section 7.4, allow SourceCharacter (which is any 16-bit - * code point). - */ - - /* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */ - duk__lexer_skip_to_endofline(lex_ctx); - goto restart; /* line terminator will be handled on next round */ - } else if (DUK__L1() == DUK_ASC_STAR) { - /* - * E5 Section 7.4. If the multi-line comment contains a newline, - * it is treated like a single line terminator for automatic - * semicolon insertion. - */ - - duk_bool_t last_asterisk = 0; - DUK__ADVANCECHARS(lex_ctx, 2); - for (;;) { - x = DUK__L0(); - if (x < 0) { - goto fail_unterm_comment; - } - DUK__ADVANCECHARS(lex_ctx, 1); - if (last_asterisk && x == DUK_ASC_SLASH) { - break; - } - if (duk_unicode_is_line_terminator(x)) { - got_lineterm = 1; - } - last_asterisk = (x == DUK_ASC_STAR); - } - goto restart_lineupdate; - } else if (regexp_mode) { -#if defined(DUK_USE_REGEXP_SUPPORT) - /* - * "/" followed by something in regexp mode. See E5 Section 7.8.5. - * - * RegExp parsing is a bit complex. First, the regexp body is delimited - * by forward slashes, but the body may also contain forward slashes as - * part of an escape sequence or inside a character class (delimited by - * square brackets). A mini state machine is used to implement these. - * - * Further, an early (parse time) error must be thrown if the regexp - * would cause a run-time error when used in the expression new RegExp(...). - * Parsing here simply extracts the (candidate) regexp, and also accepts - * invalid regular expressions (which are delimited properly). The caller - * (compiler) must perform final validation and regexp compilation. - * - * RegExp first char may not be '/' (single line comment) or '*' (multi- - * line comment). These have already been checked above, so there is no - * need below for special handling of the first regexp character as in - * the E5 productions. - * - * About unicode escapes within regexp literals: - * - * E5 Section 7.8.5 grammar does NOT accept \uHHHH escapes. - * However, Section 6 states that regexps accept the escapes, - * see paragraph starting with "In string literals...". - * The regexp grammar, which sees the decoded regexp literal - * (after lexical parsing) DOES have a \uHHHH unicode escape. - * So, for instance: - * - * /\u1234/ - * - * should first be parsed by the lexical grammar as: - * - * '\' 'u' RegularExpressionBackslashSequence - * '1' RegularExpressionNonTerminator - * '2' RegularExpressionNonTerminator - * '3' RegularExpressionNonTerminator - * '4' RegularExpressionNonTerminator - * - * and the escape itself is then parsed by the regexp engine. - * This is the current implementation. - * - * Minor spec inconsistency: - * - * E5 Section 7.8.5 RegularExpressionBackslashSequence is: - * - * \ RegularExpressionNonTerminator - * - * while Section A.1 RegularExpressionBackslashSequence is: - * - * \ NonTerminator - * - * The latter is not normative and a typo. - * - */ - - /* first, parse regexp body roughly */ - - duk_small_int_t state = 0; /* 0=base, 1=esc, 2=class, 3=class+esc */ - - DUK__INITBUFFER(lex_ctx); - for (;;) { - DUK__ADVANCECHARS(lex_ctx, 1); /* skip opening slash on first loop */ - x = DUK__L0(); - if (x < 0 || duk_unicode_is_line_terminator(x)) { - goto fail_unterm_regexp; - } - x = DUK__L0(); /* re-read to avoid spill / fetch */ - if (state == 0) { - if (x == DUK_ASC_SLASH) { - DUK__ADVANCECHARS(lex_ctx, 1); /* eat closing slash */ - break; - } else if (x == DUK_ASC_BACKSLASH) { - state = 1; - } else if (x == DUK_ASC_LBRACKET) { - state = 2; - } - } else if (state == 1) { - state = 0; - } else if (state == 2) { - if (x == DUK_ASC_RBRACKET) { - state = 0; - } else if (x == DUK_ASC_BACKSLASH) { - state = 3; - } - } else { /* state == 3 */ - state = 2; - } - DUK__APPENDBUFFER(lex_ctx, x); - } - out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - - /* second, parse flags */ - - DUK__INITBUFFER(lex_ctx); - for (;;) { - x = DUK__L0(); - if (!duk_unicode_is_identifier_part(x)) { - break; - } - x = DUK__L0(); /* re-read to avoid spill / fetch */ - DUK__APPENDBUFFER(lex_ctx, x); - DUK__ADVANCECHARS(lex_ctx, 1); - } - out_token->str2 = duk__internbuffer(lex_ctx, lex_ctx->slot2_idx); - - DUK__INITBUFFER(lex_ctx); /* free some memory */ - - /* validation of the regexp is caller's responsibility */ - - advtok = DUK__ADVTOK(0, DUK_TOK_REGEXP); -#else /* DUK_USE_REGEXP_SUPPORT */ - goto fail_regexp_support; -#endif /* DUK_USE_REGEXP_SUPPORT */ - } else if (DUK__L1() == DUK_ASC_EQUALS) { - /* "/=" and not in regexp mode */ - advtok = DUK__ADVTOK(2, DUK_TOK_DIV_EQ); - } else { - /* "/" and not in regexp mode */ - advtok = DUK__ADVTOK(1, DUK_TOK_DIV); - } - break; - case DUK_ASC_LCURLY: /* '{' */ - advtok = DUK__ADVTOK(1, DUK_TOK_LCURLY); - break; - case DUK_ASC_RCURLY: /* '}' */ - advtok = DUK__ADVTOK(1, DUK_TOK_RCURLY); - break; - case DUK_ASC_LPAREN: /* '(' */ - advtok = DUK__ADVTOK(1, DUK_TOK_LPAREN); - break; - case DUK_ASC_RPAREN: /* ')' */ - advtok = DUK__ADVTOK(1, DUK_TOK_RPAREN); - break; - case DUK_ASC_LBRACKET: /* '[' */ - advtok = DUK__ADVTOK(1, DUK_TOK_LBRACKET); - break; - case DUK_ASC_RBRACKET: /* ']' */ - advtok = DUK__ADVTOK(1, DUK_TOK_RBRACKET); - break; - case DUK_ASC_PERIOD: /* '.' */ - if (DUK__ISDIGIT(DUK__L1())) { - /* Period followed by a digit can only start DecimalLiteral - * (handled in slow path). We could jump straight into the - * DecimalLiteral handling but should avoid goto to inside - * a block. - */ - goto slow_path; - } - advtok = DUK__ADVTOK(1, DUK_TOK_PERIOD); - break; - case DUK_ASC_SEMICOLON: /* ';' */ - advtok = DUK__ADVTOK(1, DUK_TOK_SEMICOLON); - break; - case DUK_ASC_COMMA: /* ',' */ - advtok = DUK__ADVTOK(1, DUK_TOK_COMMA); - break; - case DUK_ASC_LANGLE: /* '<' */ -#if defined(DUK_USE_HTML_COMMENTS) - if (DUK__L1() == DUK_ASC_EXCLAMATION && DUK__L2() == DUK_ASC_MINUS && DUK__L3() == DUK_ASC_MINUS) { - /* - * ES2015: B.1.3, handle "" SingleLineHTMLCloseComment - * Only allowed: - * - on new line - * - preceded only by whitespace - * - preceded by end of multiline comment and optional whitespace - * - * Since whitespace generates no tokens, and multiline comments - * are treated as a line ending, consulting `got_lineterm` is - * sufficient to test for these three options. - */ - - /* DUK__ADVANCECHARS(lex_ctx, 3) would be correct here, but not necessary */ - duk__lexer_skip_to_endofline(lex_ctx); - goto restart; /* line terminator will be handled on next round */ - } else -#endif /* DUK_USE_HTML_COMMENTS */ - if (DUK__L1() == DUK_ASC_MINUS) { - advtok = DUK__ADVTOK(2, DUK_TOK_DECREMENT); - } else if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_SUB_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_SUB); - } - break; - case DUK_ASC_STAR: /* '*' */ -#if defined(DUK_USE_ES7_EXP_OPERATOR) - if (DUK__L1() == DUK_ASC_STAR && DUK__L2() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(3, DUK_TOK_EXP_EQ); - } else if (DUK__L1() == DUK_ASC_STAR) { - advtok = DUK__ADVTOK(2, DUK_TOK_EXP); - } else -#endif - if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_MUL_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_MUL); - } - break; - case DUK_ASC_PERCENT: /* '%' */ - if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_MOD_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_MOD); - } - break; - case DUK_ASC_AMP: /* '&' */ - if (DUK__L1() == DUK_ASC_AMP) { - advtok = DUK__ADVTOK(2, DUK_TOK_LAND); - } else if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_BAND_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_BAND); - } - break; - case DUK_ASC_PIPE: /* '|' */ - if (DUK__L1() == DUK_ASC_PIPE) { - advtok = DUK__ADVTOK(2, DUK_TOK_LOR); - } else if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_BOR_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_BOR); - } - break; - case DUK_ASC_CARET: /* '^' */ - if (DUK__L1() == DUK_ASC_EQUALS) { - advtok = DUK__ADVTOK(2, DUK_TOK_BXOR_EQ); - } else { - advtok = DUK__ADVTOK(1, DUK_TOK_BXOR); - } - break; - case DUK_ASC_TILDE: /* '~' */ - advtok = DUK__ADVTOK(1, DUK_TOK_BNOT); - break; - case DUK_ASC_QUESTION: /* '?' */ - advtok = DUK__ADVTOK(1, DUK_TOK_QUESTION); - break; - case DUK_ASC_COLON: /* ':' */ - advtok = DUK__ADVTOK(1, DUK_TOK_COLON); - break; - case DUK_ASC_DOUBLEQUOTE: /* '"' */ - case DUK_ASC_SINGLEQUOTE: { /* '\'' */ - DUK__INITBUFFER(lex_ctx); - duk__lexer_parse_string_literal(lex_ctx, out_token, x /*quote*/, strict_mode); - duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - out_token->str1 = duk_known_hstring(lex_ctx->thr, lex_ctx->slot1_idx); - - DUK__INITBUFFER(lex_ctx); /* free some memory */ - - advtok = DUK__ADVTOK(0, DUK_TOK_STRING); - break; - } - default: - goto slow_path; - } /* switch */ - - goto skip_slow_path; - - slow_path: - if (duk_unicode_is_line_terminator(x)) { - if (x == 0x000d && DUK__L1() == 0x000a) { - /* - * E5 Section 7.3: CR LF is detected as a single line terminator for - * line numbers. Here we also detect it as a single line terminator - * token. - */ - DUK__ADVANCECHARS(lex_ctx, 2); - } else { - DUK__ADVANCECHARS(lex_ctx, 1); - } - got_lineterm = 1; - goto restart_lineupdate; - } else if (duk_unicode_is_identifier_start(x) || x == DUK_ASC_BACKSLASH) { - /* - * Parse an identifier and then check whether it is: - * - reserved word (keyword or other reserved word) - * - "null" (NullLiteral) - * - "true" (BooleanLiteral) - * - "false" (BooleanLiteral) - * - anything else => identifier - * - * This does not follow the E5 productions cleanly, but is - * useful and compact. - * - * Note that identifiers may contain Unicode escapes, - * see E5 Sections 6 and 7.6. They must be decoded first, - * and the result checked against allowed characters. - * The above if-clause accepts an identifier start and an - * '\' character -- no other token can begin with a '\'. - * - * Note that "get" and "set" are not reserved words in E5 - * specification so they are recognized as plain identifiers - * (the tokens DUK_TOK_GET and DUK_TOK_SET are actually not - * used now). The compiler needs to work around this. - * - * Strictly speaking, following Ecmascript longest match - * specification, an invalid escape for the first character - * should cause a syntax error. However, an invalid escape - * for IdentifierParts should just terminate the identifier - * early (longest match), and let the next tokenization - * fail. For instance Rhino croaks with 'foo\z' when - * parsing the identifier. This has little practical impact. - */ - - duk_small_uint_t i, i_end; - duk_bool_t first = 1; - duk_hstring *str; - - DUK__INITBUFFER(lex_ctx); - for (;;) { - /* re-lookup first char on first loop */ - if (DUK__L0() == DUK_ASC_BACKSLASH) { - duk_codepoint_t esc_cp; - if (DUK__L1() != DUK_ASC_LC_U) { - goto fail_escape; - } - esc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/); - DUK__APPENDBUFFER(lex_ctx, esc_cp); - - /* IdentifierStart is stricter than IdentifierPart, so if the first - * character is escaped, must have a stricter check here. - */ - if (!(first ? duk_unicode_is_identifier_start(esc_cp) : duk_unicode_is_identifier_part(esc_cp))) { - goto fail_escape; - } - - /* Track number of escapes: necessary for proper keyword - * detection. - */ - out_token->num_escapes++; - } else { - /* Note: first character is checked against this. But because - * IdentifierPart includes all IdentifierStart characters, and - * the first character (if unescaped) has already been checked - * in the if condition, this is OK. - */ - if (!duk_unicode_is_identifier_part(DUK__L0())) { - break; - } - DUK__APPENDBUFFER(lex_ctx, DUK__L0()); - DUK__ADVANCECHARS(lex_ctx, 1); - } - first = 0; - } - - out_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - str = out_token->str1; - out_token->t_nores = DUK_TOK_IDENTIFIER; - - DUK__INITBUFFER(lex_ctx); /* free some memory */ - - /* - * Interned identifier is compared against reserved words, which are - * currently interned into the heap context. See genbuiltins.py. - * - * Note that an escape in the identifier disables recognition of - * keywords; e.g. "\u0069f = 1;" is a valid statement (assigns to - * identifier named "if"). This is not necessarily compliant, - * see test-dec-escaped-char-in-keyword.js. - * - * Note: "get" and "set" are awkward. They are not officially - * ReservedWords (and indeed e.g. "var set = 1;" is valid), and - * must come out as DUK_TOK_IDENTIFIER. The compiler needs to - * work around this a bit. - */ - - /* XXX: optimize by adding the token numbers directly into the - * always interned duk_hstring objects (there should be enough - * flag bits free for that)? - */ - - i_end = (strict_mode ? DUK_STRIDX_END_RESERVED : DUK_STRIDX_START_STRICT_RESERVED); - - advtok = DUK__ADVTOK(0, DUK_TOK_IDENTIFIER); - if (out_token->num_escapes == 0) { - for (i = DUK_STRIDX_START_RESERVED; i < i_end; i++) { - DUK_ASSERT_DISABLE(i >= 0); /* unsigned */ - DUK_ASSERT(i < DUK_HEAP_NUM_STRINGS); - if (DUK_HTHREAD_GET_STRING(lex_ctx->thr, i) == str) { - advtok = DUK__ADVTOK(0, DUK_STRIDX_TO_TOK(i)); - break; - } - } - } - } else if (DUK__ISDIGIT(x) || (x == DUK_ASC_PERIOD)) { - /* Note: decimal number may start with a period, but must be followed by a digit */ - - /* - * Pre-parsing for decimal, hex, octal (both legacy and ES2015), - * and binary literals, followed by an actual parser step - * provided by numconv. - * - * Note: the leading sign character ('+' or '-') is -not- part of - * the production in E5 grammar, and that the a DecimalLiteral - * starting with a '0' must be followed by a non-digit. - * - * XXX: the two step parsing process is quite awkward, it would - * be more straightforward to allow numconv to parse the longest - * valid prefix (it already does that, it only needs to indicate - * where the input ended). However, the lexer decodes characters - * using a limited lookup window, so this is not a trivial change. - */ - - /* XXX: because of the final check below (that the literal is not - * followed by a digit), this could maybe be simplified, if we bail - * out early from a leading zero (and if there are no periods etc). - * Maybe too complex. - */ - - duk_double_t val; - duk_bool_t legacy_oct = 0; - duk_small_int_t state; /* 0=before period/exp, - * 1=after period, before exp - * 2=after exp, allow '+' or '-' - * 3=after exp and exp sign - */ - duk_small_uint_t s2n_flags; - duk_codepoint_t y, z; - duk_small_int_t s2n_radix = 10; - duk_small_uint_t pre_adv = 0; - - DUK__INITBUFFER(lex_ctx); - y = DUK__L1(); - - if (x == DUK_ASC_0) { - z = DUK_LOWERCASE_CHAR_ASCII(y); - - pre_adv = 2; /* default for 0xNNN, 0oNNN, 0bNNN. */ - if (z == DUK_ASC_LC_X) { - s2n_radix = 16; - } else if (z == DUK_ASC_LC_O) { - s2n_radix = 8; - } else if (z == DUK_ASC_LC_B) { - s2n_radix = 2; - } else { - pre_adv = 0; - if (DUK__ISDIGIT(y)) { - if (strict_mode) { - /* Reject octal like \07 but also octal-lookalike - * decimal like \08 in strict mode. - */ - goto fail_number_literal; - } else { - /* Legacy OctalIntegerLiteral or octal-lookalice - * decimal. Deciding between the two happens below - * in digit scanning. - */ - DUK__APPENDBUFFER(lex_ctx, x); - pre_adv = 1; - legacy_oct = 1; - s2n_radix = 8; /* tentative unless conflicting digits found */ - } - } - } - } - - DUK__ADVANCECHARS(lex_ctx, pre_adv); - - /* XXX: we could parse integers here directly, and fall back - * to numconv only when encountering a fractional expression - * or when an octal literal turned out to be decimal (0778 etc). - */ - state = 0; - for (;;) { - x = DUK__L0(); /* re-lookup curr char on first round */ - if (DUK__ISDIGIT(x)) { - /* Note: intentionally allow leading zeroes here, as the - * actual parser will check for them. - */ - if (state == 0 && legacy_oct && (x == DUK_ASC_8 || x == DUK_ASC_9)) { - /* Started out as an octal-lookalike - * but interpreted as decimal, e.g. - * '0779' -> 779. This also means - * that fractions are allowed, e.g. - * '0779.123' is allowed but '0777.123' - * is not! - */ - s2n_radix = 10; - } - if (state == 2) { - state = 3; - } - } else if (s2n_radix == 16 && DUK__ISHEXDIGIT(x)) { - /* Note: 'e' and 'E' are also accepted here. */ - ; - } else if (x == DUK_ASC_PERIOD) { - if (state >= 1 || s2n_radix != 10) { - break; - } else { - state = 1; - } - } else if (x == DUK_ASC_LC_E || x == DUK_ASC_UC_E) { - if (state >= 2 || s2n_radix != 10) { - break; - } else { - state = 2; - } - } else if (x == DUK_ASC_MINUS || x == DUK_ASC_PLUS) { - if (state != 2) { - break; - } else { - state = 3; - } - } else { - break; - } - DUK__APPENDBUFFER(lex_ctx, x); - DUK__ADVANCECHARS(lex_ctx, 1); - } - - /* XXX: better coercion */ - (void) duk__internbuffer(lex_ctx, lex_ctx->slot1_idx); - - if (s2n_radix != 10) { - /* For bases other than 10, integer only. */ - s2n_flags = DUK_S2N_FLAG_ALLOW_LEADING_ZERO; - } else { - s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | - DUK_S2N_FLAG_ALLOW_FRAC | - DUK_S2N_FLAG_ALLOW_NAKED_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | - DUK_S2N_FLAG_ALLOW_LEADING_ZERO; - } - - duk_dup(lex_ctx->thr, lex_ctx->slot1_idx); - duk_numconv_parse(lex_ctx->thr, s2n_radix, s2n_flags); - val = duk_to_number_m1(lex_ctx->thr); - if (DUK_ISNAN(val)) { - goto fail_number_literal; - } - duk_replace(lex_ctx->thr, lex_ctx->slot1_idx); /* could also just pop? */ - - DUK__INITBUFFER(lex_ctx); /* free some memory */ - - /* Section 7.8.3 (note): NumericLiteral must be followed by something other than - * IdentifierStart or DecimalDigit. - */ - - if (DUK__ISDIGIT(DUK__L0()) || duk_unicode_is_identifier_start(DUK__L0())) { - goto fail_number_literal; - } - - out_token->num = val; - advtok = DUK__ADVTOK(0, DUK_TOK_NUMBER); - } else if (duk_unicode_is_whitespace(DUK__LOOKUP(lex_ctx, 0))) { - DUK__ADVANCECHARS(lex_ctx, 1); - goto restart; - } else if (x < 0) { - advtok = DUK__ADVTOK(0, DUK_TOK_EOF); - } else { - goto fail_token; - } - skip_slow_path: - - /* - * Shared exit path - */ - - DUK__ADVANCEBYTES(lex_ctx, advtok >> 8); - out_token->t = advtok & 0xff; - if (out_token->t_nores == DUK_TOK_INVALID) { - out_token->t_nores = out_token->t; - } - out_token->lineterm = got_lineterm; - - /* Automatic semicolon insertion is allowed if a token is preceded - * by line terminator(s), or terminates a statement list (right curly - * or EOF). - */ - if (got_lineterm || out_token->t == DUK_TOK_RCURLY || out_token->t == DUK_TOK_EOF) { - out_token->allow_auto_semi = 1; - } else { - out_token->allow_auto_semi = 0; - } - - return; - - fail_token_limit: - DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); - return; - - fail_token: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_TOKEN); - return; - - fail_number_literal: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_NUMBER_LITERAL); - return; - - fail_escape: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE); - return; - - fail_unterm_regexp: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_REGEXP); - return; - - fail_unterm_comment: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_COMMENT); - return; - -#if !defined(DUK_USE_REGEXP_SUPPORT) - fail_regexp_support: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_REGEXP_SUPPORT_DISABLED); - return; -#endif -} - -#if defined(DUK_USE_REGEXP_SUPPORT) - -/* - * Parse a RegExp token. The grammar is described in E5 Section 15.10. - * Terminal constructions (such as quantifiers) are parsed directly here. - * - * 0xffffffffU is used as a marker for "infinity" in quantifiers. Further, - * DUK__MAX_RE_QUANT_DIGITS limits the maximum number of digits that - * will be accepted for a quantifier. - */ - -DUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token) { - duk_small_uint_t advtok = 0; /* init is unnecessary but suppresses "may be used uninitialized" warnings */ - duk_codepoint_t x, y; - - if (++lex_ctx->token_count >= lex_ctx->token_limit) { - goto fail_token_limit; - } - - DUK_MEMZERO(out_token, sizeof(*out_token)); - - x = DUK__L0(); - y = DUK__L1(); - - DUK_DDD(DUK_DDDPRINT("parsing regexp token, L0=%ld, L1=%ld", (long) x, (long) y)); - - switch (x) { - case DUK_ASC_PIPE: { - advtok = DUK__ADVTOK(1, DUK_RETOK_DISJUNCTION); - break; - } - case DUK_ASC_CARET: { - advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_START); - break; - } - case DUK_ASC_DOLLAR: { - advtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_END); - break; - } - case DUK_ASC_QUESTION: { - out_token->qmin = 0; - out_token->qmax = 1; - if (y == DUK_ASC_QUESTION) { - advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); - out_token->greedy = 0; - } else { - advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); - out_token->greedy = 1; - } - break; - } - case DUK_ASC_STAR: { - out_token->qmin = 0; - out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; - if (y == DUK_ASC_QUESTION) { - advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); - out_token->greedy = 0; - } else { - advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); - out_token->greedy = 1; - } - break; - } - case DUK_ASC_PLUS: { - out_token->qmin = 1; - out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; - if (y == DUK_ASC_QUESTION) { - advtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER); - out_token->greedy = 0; - } else { - advtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER); - out_token->greedy = 1; - } - break; - } - case DUK_ASC_LCURLY: { - /* Production allows 'DecimalDigits', including leading zeroes */ - duk_uint32_t val1 = 0; - duk_uint32_t val2 = DUK_RE_QUANTIFIER_INFINITE; - duk_small_int_t digits = 0; -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - duk_lexer_point lex_pt; -#endif - -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - /* Store lexer position, restoring if quantifier is invalid. */ - DUK_LEXER_GETPOINT(lex_ctx, &lex_pt); -#endif - - for (;;) { - DUK__ADVANCECHARS(lex_ctx, 1); /* eat '{' on entry */ - x = DUK__L0(); - if (DUK__ISDIGIT(x)) { - digits++; - val1 = val1 * 10 + (duk_uint32_t) duk__hexval(x); - } else if (x == DUK_ASC_COMMA) { - if (digits > DUK__MAX_RE_QUANT_DIGITS) { - goto invalid_quantifier; - } - if (val2 != DUK_RE_QUANTIFIER_INFINITE) { - goto invalid_quantifier; - } - if (DUK__L1() == DUK_ASC_RCURLY) { - /* form: { DecimalDigits , }, val1 = min count */ - if (digits == 0) { - goto invalid_quantifier; - } - out_token->qmin = val1; - out_token->qmax = DUK_RE_QUANTIFIER_INFINITE; - DUK__ADVANCECHARS(lex_ctx, 2); - break; - } - val2 = val1; - val1 = 0; - digits = 0; /* not strictly necessary because of lookahead '}' above */ - } else if (x == DUK_ASC_RCURLY) { - if (digits > DUK__MAX_RE_QUANT_DIGITS) { - goto invalid_quantifier; - } - if (digits == 0) { - goto invalid_quantifier; - } - if (val2 != DUK_RE_QUANTIFIER_INFINITE) { - /* val2 = min count, val1 = max count */ - out_token->qmin = val2; - out_token->qmax = val1; - } else { - /* val1 = count */ - out_token->qmin = val1; - out_token->qmax = val1; - } - DUK__ADVANCECHARS(lex_ctx, 1); - break; - } else { - goto invalid_quantifier; - } - } - if (DUK__L0() == DUK_ASC_QUESTION) { - out_token->greedy = 0; - DUK__ADVANCECHARS(lex_ctx, 1); - } else { - out_token->greedy = 1; - } - advtok = DUK__ADVTOK(0, DUK_RETOK_QUANTIFIER); - break; - invalid_quantifier: -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - /* Failed to match the quantifier, restore lexer and parse - * opening brace as a literal. - */ - DUK_LEXER_SETPOINT(lex_ctx, &lex_pt); - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR); - out_token->num = DUK_ASC_LCURLY; -#else - goto fail_quantifier; -#endif - break; - } - case DUK_ASC_PERIOD: { - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_PERIOD); - break; - } - case DUK_ASC_BACKSLASH: { - /* The E5.1 specification does not seem to allow IdentifierPart characters - * to be used as identity escapes. Unfortunately this includes '$', which - * cannot be escaped as '\$'; it needs to be escaped e.g. as '\u0024'. - * Many other implementations (including V8 and Rhino, for instance) do - * accept '\$' as a valid identity escape, which is quite pragmatic, and - * ES2015 Annex B relaxes the rules to allow these (and other) real world forms. - */ - - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); /* default: char escape (two chars) */ - if (y == DUK_ASC_LC_B) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_WORD_BOUNDARY); - } else if (y == DUK_ASC_UC_B) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY); - } else if (y == DUK_ASC_LC_F) { - out_token->num = 0x000c; - } else if (y == DUK_ASC_LC_N) { - out_token->num = 0x000a; - } else if (y == DUK_ASC_LC_T) { - out_token->num = 0x0009; - } else if (y == DUK_ASC_LC_R) { - out_token->num = 0x000d; - } else if (y == DUK_ASC_LC_V) { - out_token->num = 0x000b; - } else if (y == DUK_ASC_LC_C) { - x = DUK__L2(); - if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || - (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { - out_token->num = (duk_uint32_t) (x % 32); - advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_CHAR); - } else { - goto fail_escape; - } - } else if (y == DUK_ASC_LC_X || y == DUK_ASC_LC_U) { - /* The token value is the Unicode codepoint without - * it being decode into surrogate pair characters - * here. The \u{H+} is only allowed in Unicode mode - * which we don't support yet. - */ - out_token->num = (duk_uint32_t) duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); - advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_CHAR); - } else if (y == DUK_ASC_LC_D) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_DIGIT); - } else if (y == DUK_ASC_UC_D) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_DIGIT); - } else if (y == DUK_ASC_LC_S) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WHITE); - } else if (y == DUK_ASC_UC_S) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WHITE); - } else if (y == DUK_ASC_LC_W) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WORD_CHAR); - } else if (y == DUK_ASC_UC_W) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WORD_CHAR); - } else if (DUK__ISDIGIT(y)) { - /* E5 Section 15.10.2.11 */ - if (y == DUK_ASC_0) { - if (DUK__ISDIGIT(DUK__L2())) { - goto fail_escape; - } - out_token->num = 0x0000; - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR); - } else { - /* XXX: shared parsing? */ - duk_uint32_t val = 0; - duk_small_int_t i; - for (i = 0; ; i++) { - if (i >= DUK__MAX_RE_DECESC_DIGITS) { - goto fail_escape; - } - DUK__ADVANCECHARS(lex_ctx, 1); /* eat backslash on entry */ - x = DUK__L0(); - if (!DUK__ISDIGIT(x)) { - break; - } - val = val * 10 + (duk_uint32_t) duk__hexval(x); - } - /* DUK__L0() cannot be a digit, because the loop doesn't terminate if it is */ - advtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_BACKREFERENCE); - out_token->num = val; - } -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - } else if (y >= 0) { - /* For ES2015 Annex B, accept any source character as identity - * escape except 'c' which is used for control characters. - * http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns - * Careful not to match end-of-buffer (<0) here. - * This is not yet full ES2015 Annex B because cases above - * (like hex escape) won't backtrack. - */ - DUK_ASSERT(y != DUK_ASC_LC_C); /* covered above */ -#else /* DUK_USE_ES6_REGEXP_SYNTAX */ - } else if ((y >= 0 && !duk_unicode_is_identifier_part(y)) || - y == DUK_UNICODE_CP_ZWNJ || - y == DUK_UNICODE_CP_ZWJ) { - /* For ES5.1 identity escapes are not allowed for identifier - * parts. This conflicts with a lot of real world code as this - * doesn't e.g. allow escaping a dollar sign as /\$/, see - * test-regexp-identity-escape-dollar.js. - */ -#endif /* DUK_USE_ES6_REGEXP_SYNTAX */ - out_token->num = (duk_uint32_t) y; - } else { - goto fail_escape; - } - break; - } - case DUK_ASC_LPAREN: { - /* XXX: naming is inconsistent: ATOM_END_GROUP ends an ASSERT_START_LOOKAHEAD */ - - if (y == DUK_ASC_QUESTION) { - if (DUK__L2() == DUK_ASC_EQUALS) { - /* (?= */ - advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_POS_LOOKAHEAD); - } else if (DUK__L2() == DUK_ASC_EXCLAMATION) { - /* (?! */ - advtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD); - } else if (DUK__L2() == DUK_ASC_COLON) { - /* (?: */ - advtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_START_NONCAPTURE_GROUP); - } else { - goto fail_group; - } - } else { - /* ( */ - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CAPTURE_GROUP); - } - break; - } - case DUK_ASC_RPAREN: { - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_END_GROUP); - break; - } - case DUK_ASC_LBRACKET: { - /* - * To avoid creating a heavy intermediate value for the list of ranges, - * only the start token ('[' or '[^') is parsed here. The regexp - * compiler parses the ranges itself. - */ - - /* XXX: with DUK_USE_ES6_REGEXP_SYNTAX we should allow left bracket - * literal too, but it's not easy to parse without backtracking. - */ - - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CHARCLASS); - if (y == DUK_ASC_CARET) { - advtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_START_CHARCLASS_INVERTED); - } - break; - } -#if !defined(DUK_USE_ES6_REGEXP_SYNTAX) - case DUK_ASC_RCURLY: - case DUK_ASC_RBRACKET: { - /* Although these could be parsed as PatternCharacters unambiguously (here), - * E5 Section 15.10.1 grammar explicitly forbids these as PatternCharacters. - */ - goto fail_invalid_char; - break; - } -#endif - case -1: { - /* EOF */ - advtok = DUK__ADVTOK(0, DUK_TOK_EOF); - break; - } - default: { - /* PatternCharacter, all excluded characters are matched by cases above */ - advtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR); - out_token->num = (duk_uint32_t) x; - break; - } - } - - /* - * Shared exit path - */ - - DUK__ADVANCEBYTES(lex_ctx, advtok >> 8); - out_token->t = advtok & 0xff; - return; - - fail_token_limit: - DUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT); - return; - - fail_escape: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); - return; - - fail_group: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_GROUP); - return; - -#if !defined(DUK_USE_ES6_REGEXP_SYNTAX) - fail_invalid_char: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_CHARACTER); - return; - - fail_quantifier: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_QUANTIFIER); - return; -#endif -} - -/* - * Special parser for character classes; calls callback for every - * range parsed and returns the number of ranges present. - */ - -/* XXX: this duplicates functionality in duk_regexp.c where a similar loop is - * required anyway. We could use that BUT we need to update the regexp compiler - * 'nranges' too. Work this out a bit more cleanly to save space. - */ - -/* XXX: the handling of character range detection is a bit convoluted. - * Try to simplify and make smaller. - */ - -/* XXX: logic for handling character ranges is now incorrect, it will accept - * e.g. [\d-z] whereas it should croak from it? SMJS accepts this too, though. - * - * Needs a read through and a lot of additional tests. - */ - -DUK_LOCAL -void duk__emit_u16_direct_ranges(duk_lexer_ctx *lex_ctx, - duk_re_range_callback gen_range, - void *userdata, - const duk_uint16_t *ranges, - duk_small_int_t num) { - const duk_uint16_t *ranges_end; - - DUK_UNREF(lex_ctx); - - ranges_end = ranges + num; - while (ranges < ranges_end) { - /* mark range 'direct', bypass canonicalization (see Wiki) */ - gen_range(userdata, (duk_codepoint_t) ranges[0], (duk_codepoint_t) ranges[1], 1); - ranges += 2; - } -} - -DUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata) { - duk_codepoint_t start = -1; - duk_codepoint_t ch; - duk_codepoint_t x; - duk_bool_t dash = 0; - duk_small_uint_t adv = 0; - - DUK_DD(DUK_DDPRINT("parsing regexp ranges")); - - for (;;) { - DUK__ADVANCECHARS(lex_ctx, adv); - adv = 1; - - x = DUK__L0(); - - ch = -1; /* not strictly necessary, but avoids "uninitialized variable" warnings */ - DUK_UNREF(ch); - - if (x < 0) { - goto fail_unterm_charclass; - } else if (x == DUK_ASC_RBRACKET) { - if (start >= 0) { - gen_range(userdata, start, start, 0); - } - DUK__ADVANCECHARS(lex_ctx, 1); /* eat ']' before finishing */ - break; - } else if (x == DUK_ASC_MINUS) { - if (start >= 0 && !dash && DUK__L1() != DUK_ASC_RBRACKET) { - /* '-' as a range indicator */ - dash = 1; - continue; - } else { - /* '-' verbatim */ - ch = x; - } - } else if (x == DUK_ASC_BACKSLASH) { - /* - * The escapes are same as outside a character class, except that \b has a - * different meaning, and \B and backreferences are prohibited (see E5 - * Section 15.10.2.19). However, it's difficult to share code because we - * handle e.g. "\n" very differently: here we generate a single character - * range for it. - */ - - /* XXX: ES2015 surrogate pair handling. */ - - x = DUK__L1(); - - adv = 2; - - if (x == DUK_ASC_LC_B) { - /* Note: '\b' in char class is different than outside (assertion), - * '\B' is not allowed and is caught by the duk_unicode_is_identifier_part() - * check below. - */ - ch = 0x0008; - } else if (x == DUK_ASC_LC_F) { - ch = 0x000c; - } else if (x == DUK_ASC_LC_N) { - ch = 0x000a; - } else if (x == DUK_ASC_LC_T) { - ch = 0x0009; - } else if (x == DUK_ASC_LC_R) { - ch = 0x000d; - } else if (x == DUK_ASC_LC_V) { - ch = 0x000b; - } else if (x == DUK_ASC_LC_C) { - x = DUK__L2(); - adv = 3; - if ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) || - (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) { - ch = (x % 32); - } else { - goto fail_escape; - } - } else if (x == DUK_ASC_LC_X || x == DUK_ASC_LC_U) { - /* The \u{H+} form is only allowed in Unicode mode which - * we don't support yet. - */ - ch = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/); - adv = 0; - } else if (x == DUK_ASC_LC_D) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_digit, - sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t)); - ch = -1; - } else if (x == DUK_ASC_UC_D) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_not_digit, - sizeof(duk_unicode_re_ranges_not_digit) / sizeof(duk_uint16_t)); - ch = -1; - } else if (x == DUK_ASC_LC_S) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_white, - sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t)); - ch = -1; - } else if (x == DUK_ASC_UC_S) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_not_white, - sizeof(duk_unicode_re_ranges_not_white) / sizeof(duk_uint16_t)); - ch = -1; - } else if (x == DUK_ASC_LC_W) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_wordchar, - sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t)); - ch = -1; - } else if (x == DUK_ASC_UC_W) { - duk__emit_u16_direct_ranges(lex_ctx, - gen_range, - userdata, - duk_unicode_re_ranges_not_wordchar, - sizeof(duk_unicode_re_ranges_not_wordchar) / sizeof(duk_uint16_t)); - ch = -1; - } else if (DUK__ISDIGIT(x)) { - /* DecimalEscape, only \0 is allowed, no leading - * zeroes are allowed. - * - * ES2015 Annex B also allows (maximal match) legacy - * octal escapes up to \377 and \8 and \9 are - * accepted as literal '8' and '9', also in strict mode. - */ - -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - ch = duk__lexer_parse_legacy_octal(lex_ctx, &adv, 0 /*reject_annex_b*/); - DUK_ASSERT(ch >= 0); /* no rejections */ -#else - if (x == DUK_ASC_0 && !DUK__ISDIGIT(DUK__L2())) { - ch = 0x0000; - } else { - goto fail_escape; - } -#endif -#if defined(DUK_USE_ES6_REGEXP_SYNTAX) - } else if (x >= 0) { - /* IdentityEscape: ES2015 Annex B allows almost all - * source characters here. Match anything except - * EOF here. - */ - ch = x; -#else /* DUK_USE_ES6_REGEXP_SYNTAX */ - } else if (!duk_unicode_is_identifier_part(x)) { - /* IdentityEscape: ES5.1 doesn't allow identity escape - * for identifier part characters, which conflicts with - * some real world code. For example, it doesn't allow - * /[\$]/ which is awkward. - */ - ch = x; -#endif /* DUK_USE_ES6_REGEXP_SYNTAX */ - } else { - goto fail_escape; - } - } else { - /* character represents itself */ - ch = x; - } - - /* ch is a literal character here or -1 if parsed entity was - * an escape such as "\s". - */ - - if (ch < 0) { - /* multi-character sets not allowed as part of ranges, see - * E5 Section 15.10.2.15, abstract operation CharacterRange. - */ - if (start >= 0) { - if (dash) { - goto fail_range; - } else { - gen_range(userdata, start, start, 0); - start = -1; - /* dash is already 0 */ - } - } - } else { - if (start >= 0) { - if (dash) { - if (start > ch) { - goto fail_range; - } - gen_range(userdata, start, ch, 0); - start = -1; - dash = 0; - } else { - gen_range(userdata, start, start, 0); - start = ch; - /* dash is already 0 */ - } - } else { - start = ch; - } - } - } - - return; - - fail_escape: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE); - return; - - fail_range: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_RANGE); - return; - - fail_unterm_charclass: - DUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_CHARCLASS); - return; -} - -#endif /* DUK_USE_REGEXP_SUPPORT */ - -/* automatic undefs */ -#undef DUK__ADVANCEBYTES -#undef DUK__ADVANCECHARS -#undef DUK__ADVTOK -#undef DUK__APPENDBUFFER -#undef DUK__APPENDBUFFER_ASCII -#undef DUK__INITBUFFER -#undef DUK__ISDIGIT -#undef DUK__ISDIGIT03 -#undef DUK__ISDIGIT47 -#undef DUK__ISHEXDIGIT -#undef DUK__ISOCTDIGIT -#undef DUK__L0 -#undef DUK__L1 -#undef DUK__L2 -#undef DUK__L3 -#undef DUK__L4 -#undef DUK__L5 -#undef DUK__LOOKUP -#undef DUK__MAX_RE_DECESC_DIGITS -#undef DUK__MAX_RE_QUANT_DIGITS -#line 1 "duk_numconv.c" -/* - * Number-to-string and string-to-number conversions. - * - * Slow path number-to-string and string-to-number conversion is based on - * a Dragon4 variant, with fast paths for small integers. Big integer - * arithmetic is needed for guaranteeing that the conversion is correct - * and uses a minimum number of digits. The big number arithmetic has a - * fixed maximum size and does not require dynamic allocations. - * - * See: doc/number-conversion.rst. - */ - -/* #include duk_internal.h -> already included */ - -#define DUK__IEEE_DOUBLE_EXP_BIAS 1023 -#define DUK__IEEE_DOUBLE_EXP_MIN (-1022) /* biased exp == 0 -> denormal, exp -1022 */ - -#define DUK__DIGITCHAR(x) duk_lc_digits[(x)] - -/* - * Tables generated with util/gennumdigits.py. - * - * duk__str2num_digits_for_radix indicates, for each radix, how many input - * digits should be considered significant for string-to-number conversion. - * The input is also padded to this many digits to give the Dragon4 - * conversion enough (apparent) precision to work with. - * - * duk__str2num_exp_limits indicates, for each radix, the radix-specific - * minimum/maximum exponent values (for a Dragon4 integer mantissa) - * below and above which the number is guaranteed to underflow to zero - * or overflow to Infinity. This allows parsing to keep bigint values - * bounded. - */ - -DUK_LOCAL const duk_uint8_t duk__str2num_digits_for_radix[] = { - 69, 44, 35, 30, 27, 25, 23, 22, 20, 20, /* 2 to 11 */ - 20, 19, 19, 18, 18, 17, 17, 17, 16, 16, /* 12 to 21 */ - 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, /* 22 to 31 */ - 14, 14, 14, 14, 14 /* 31 to 36 */ -}; - -typedef struct { - duk_int16_t upper; - duk_int16_t lower; -} duk__exp_limits; - -DUK_LOCAL const duk__exp_limits duk__str2num_exp_limits[] = { - { 957, -1147 }, { 605, -725 }, { 479, -575 }, { 414, -496 }, - { 372, -446 }, { 342, -411 }, { 321, -384 }, { 304, -364 }, - { 291, -346 }, { 279, -334 }, { 268, -323 }, { 260, -312 }, - { 252, -304 }, { 247, -296 }, { 240, -289 }, { 236, -283 }, - { 231, -278 }, { 227, -273 }, { 223, -267 }, { 220, -263 }, - { 216, -260 }, { 213, -256 }, { 210, -253 }, { 208, -249 }, - { 205, -246 }, { 203, -244 }, { 201, -241 }, { 198, -239 }, - { 196, -237 }, { 195, -234 }, { 193, -232 }, { 191, -230 }, - { 190, -228 }, { 188, -226 }, { 187, -225 }, -}; - -/* - * Limited functionality bigint implementation. - * - * Restricted to non-negative numbers with less than 32 * DUK__BI_MAX_PARTS bits, - * with the caller responsible for ensuring this is never exceeded. No memory - * allocation (except stack) is needed for bigint computation. Operations - * have been tailored for number conversion needs. - * - * Argument order is "assignment order", i.e. target first, then arguments: - * x <- y * z --> duk__bi_mul(x, y, z); - */ - -/* This upper value has been experimentally determined; debug build will check - * bigint size with assertions. - */ -#define DUK__BI_MAX_PARTS 37 /* 37x32 = 1184 bits */ - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -#define DUK__BI_PRINT(name,x) duk__bi_print((name),(x)) -#else -#define DUK__BI_PRINT(name,x) -#endif - -/* Current size is about 152 bytes. */ -typedef struct { - duk_small_int_t n; - duk_uint32_t v[DUK__BI_MAX_PARTS]; /* low to high */ -} duk__bigint; - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) -DUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) { - /* Overestimate required size; debug code so not critical to be tight. */ - char buf[DUK__BI_MAX_PARTS * 9 + 64]; - char *p = buf; - duk_small_int_t i; - - /* No NUL term checks in this debug code. */ - p += DUK_SPRINTF(p, "%p n=%ld", (void *) x, (long) x->n); - if (x->n == 0) { - p += DUK_SPRINTF(p, " 0"); - } - for (i = x->n - 1; i >= 0; i--) { - p += DUK_SPRINTF(p, " %08lx", (unsigned long) x->v[i]); - } - - DUK_DDD(DUK_DDDPRINT("%s: %s", (const char *) name, (const char *) buf)); -} -#endif - -#if defined(DUK_USE_ASSERTIONS) -DUK_LOCAL duk_small_int_t duk__bi_is_valid(duk__bigint *x) { - return (duk_small_int_t) - ( ((x->n >= 0) && (x->n <= DUK__BI_MAX_PARTS)) /* is valid size */ && - ((x->n == 0) || (x->v[x->n - 1] != 0)) /* is normalized */ ); -} -#endif - -DUK_LOCAL void duk__bi_normalize(duk__bigint *x) { - duk_small_int_t i; - - for (i = x->n - 1; i >= 0; i--) { - if (x->v[i] != 0) { - break; - } - } - - /* Note: if 'x' is zero, x->n becomes 0 here */ - x->n = i + 1; - DUK_ASSERT(duk__bi_is_valid(x)); -} - -/* x <- y */ -DUK_LOCAL void duk__bi_copy(duk__bigint *x, duk__bigint *y) { - duk_small_int_t n; - - n = y->n; - x->n = n; - if (n == 0) { - return; - } - DUK_MEMCPY((void *) x->v, (const void *) y->v, (size_t) (sizeof(duk_uint32_t) * (size_t) n)); -} - -DUK_LOCAL void duk__bi_set_small(duk__bigint *x, duk_uint32_t v) { - if (v == 0U) { - x->n = 0; - } else { - x->n = 1; - x->v[0] = v; - } - DUK_ASSERT(duk__bi_is_valid(x)); -} - -/* Return value: <0 <=> x < y - * 0 <=> x == y - * >0 <=> x > y - */ -DUK_LOCAL int duk__bi_compare(duk__bigint *x, duk__bigint *y) { - duk_small_int_t i, nx, ny; - duk_uint32_t tx, ty; - - DUK_ASSERT(duk__bi_is_valid(x)); - DUK_ASSERT(duk__bi_is_valid(y)); - - nx = x->n; - ny = y->n; - if (nx > ny) { - goto ret_gt; - } - if (nx < ny) { - goto ret_lt; - } - for (i = nx - 1; i >= 0; i--) { - tx = x->v[i]; - ty = y->v[i]; - - if (tx > ty) { - goto ret_gt; - } - if (tx < ty) { - goto ret_lt; - } - } - - return 0; - - ret_gt: - return 1; - - ret_lt: - return -1; -} - -/* x <- y + z */ -#if defined(DUK_USE_64BIT_OPS) -DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) { - duk_uint64_t tmp; - duk_small_int_t i, ny, nz; - - DUK_ASSERT(duk__bi_is_valid(y)); - DUK_ASSERT(duk__bi_is_valid(z)); - - if (z->n > y->n) { - duk__bigint *t; - t = y; y = z; z = t; - } - DUK_ASSERT(y->n >= z->n); - - ny = y->n; nz = z->n; - tmp = 0U; - for (i = 0; i < ny; i++) { - DUK_ASSERT(i < DUK__BI_MAX_PARTS); - tmp += y->v[i]; - if (i < nz) { - tmp += z->v[i]; - } - x->v[i] = (duk_uint32_t) (tmp & 0xffffffffUL); - tmp = tmp >> 32; - } - if (tmp != 0U) { - DUK_ASSERT(i < DUK__BI_MAX_PARTS); - x->v[i++] = (duk_uint32_t) tmp; - } - x->n = i; - DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS); - - /* no need to normalize */ - DUK_ASSERT(duk__bi_is_valid(x)); -} -#else /* DUK_USE_64BIT_OPS */ -DUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) { - duk_uint32_t carry, tmp1, tmp2; - duk_small_int_t i, ny, nz; - - DUK_ASSERT(duk__bi_is_valid(y)); - DUK_ASSERT(duk__bi_is_valid(z)); - - if (z->n > y->n) { - duk__bigint *t; - t = y; y = z; z = t; - } - DUK_ASSERT(y->n >= z->n); - - ny = y->n; nz = z->n; - carry = 0U; - for (i = 0; i < ny; i++) { - /* Carry is detected based on wrapping which relies on exact 32-bit - * types. - */ - DUK_ASSERT(i < DUK__BI_MAX_PARTS); - tmp1 = y->v[i]; - tmp2 = tmp1; - if (i < nz) { - tmp2 += z->v[i]; - } - - /* Careful with carry condition: - * - If carry not added: 0x12345678 + 0 + 0xffffffff = 0x12345677 (< 0x12345678) - * - If carry added: 0x12345678 + 1 + 0xffffffff = 0x12345678 (== 0x12345678) - */ - if (carry) { - tmp2++; - carry = (tmp2 <= tmp1 ? 1U : 0U); - } else { - carry = (tmp2 < tmp1 ? 1U : 0U); - } - - x->v[i] = tmp2; - } - if (carry) { - DUK_ASSERT(i < DUK__BI_MAX_PARTS); - DUK_ASSERT(carry == 1U); - x->v[i++] = carry; - } - x->n = i; - DUK_ASSERT(x->n <= DUK__BI_MAX_PARTS); - - /* no need to normalize */ - DUK_ASSERT(duk__bi_is_valid(x)); -} -#endif /* DUK_USE_64BIT_OPS */ - -/* x <- y + z */ -DUK_LOCAL void duk__bi_add_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { - duk__bigint tmp; - - DUK_ASSERT(duk__bi_is_valid(y)); - - /* XXX: this could be optimized; there is only one call site now though */ - duk__bi_set_small(&tmp, z); - duk__bi_add(x, y, &tmp); - - DUK_ASSERT(duk__bi_is_valid(x)); -} - -#if 0 /* unused */ -/* x <- x + y, use t as temp */ -DUK_LOCAL void duk__bi_add_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { - duk__bi_add(t, x, y); - duk__bi_copy(x, t); -} -#endif - -/* x <- y - z, require x >= y => z >= 0, i.e. y >= z */ -#if defined(DUK_USE_64BIT_OPS) -DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) { - duk_small_int_t i, ny, nz; - duk_uint32_t ty, tz; - duk_int64_t tmp; - - DUK_ASSERT(duk__bi_is_valid(y)); - DUK_ASSERT(duk__bi_is_valid(z)); - DUK_ASSERT(duk__bi_compare(y, z) >= 0); - DUK_ASSERT(y->n >= z->n); - - ny = y->n; nz = z->n; - tmp = 0; - for (i = 0; i < ny; i++) { - ty = y->v[i]; - if (i < nz) { - tz = z->v[i]; - } else { - tz = 0; - } - tmp = (duk_int64_t) ty - (duk_int64_t) tz + tmp; - x->v[i] = (duk_uint32_t) ((duk_uint64_t) tmp & 0xffffffffUL); - tmp = tmp >> 32; /* 0 or -1 */ - } - DUK_ASSERT(tmp == 0); - - x->n = i; - duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */ - DUK_ASSERT(duk__bi_is_valid(x)); -} -#else -DUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) { - duk_small_int_t i, ny, nz; - duk_uint32_t tmp1, tmp2, borrow; - - DUK_ASSERT(duk__bi_is_valid(y)); - DUK_ASSERT(duk__bi_is_valid(z)); - DUK_ASSERT(duk__bi_compare(y, z) >= 0); - DUK_ASSERT(y->n >= z->n); - - ny = y->n; nz = z->n; - borrow = 0U; - for (i = 0; i < ny; i++) { - /* Borrow is detected based on wrapping which relies on exact 32-bit - * types. - */ - tmp1 = y->v[i]; - tmp2 = tmp1; - if (i < nz) { - tmp2 -= z->v[i]; - } - - /* Careful with borrow condition: - * - If borrow not subtracted: 0x12345678 - 0 - 0xffffffff = 0x12345679 (> 0x12345678) - * - If borrow subtracted: 0x12345678 - 1 - 0xffffffff = 0x12345678 (== 0x12345678) - */ - if (borrow) { - tmp2--; - borrow = (tmp2 >= tmp1 ? 1U : 0U); - } else { - borrow = (tmp2 > tmp1 ? 1U : 0U); - } - - x->v[i] = tmp2; - } - DUK_ASSERT(borrow == 0U); - - x->n = i; - duk__bi_normalize(x); /* need to normalize, may even cancel to 0 */ - DUK_ASSERT(duk__bi_is_valid(x)); -} -#endif - -#if 0 /* unused */ -/* x <- y - z */ -DUK_LOCAL void duk__bi_sub_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { - duk__bigint tmp; - - DUK_ASSERT(duk__bi_is_valid(y)); - - /* XXX: this could be optimized */ - duk__bi_set_small(&tmp, z); - duk__bi_sub(x, y, &tmp); - - DUK_ASSERT(duk__bi_is_valid(x)); -} -#endif - -/* x <- x - y, use t as temp */ -DUK_LOCAL void duk__bi_sub_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { - duk__bi_sub(t, x, y); - duk__bi_copy(x, t); -} - -/* x <- y * z */ -DUK_LOCAL void duk__bi_mul(duk__bigint *x, duk__bigint *y, duk__bigint *z) { - duk_small_int_t i, j, nx, nz; - - DUK_ASSERT(duk__bi_is_valid(y)); - DUK_ASSERT(duk__bi_is_valid(z)); - - nx = y->n + z->n; /* max possible */ - DUK_ASSERT(nx <= DUK__BI_MAX_PARTS); - - if (nx == 0) { - /* Both inputs are zero; cases where only one is zero can go - * through main algorithm. - */ - x->n = 0; - return; - } - - DUK_MEMZERO((void *) x->v, (size_t) (sizeof(duk_uint32_t) * (size_t) nx)); - x->n = nx; - - nz = z->n; - for (i = 0; i < y->n; i++) { -#if defined(DUK_USE_64BIT_OPS) - duk_uint64_t tmp = 0U; - for (j = 0; j < nz; j++) { - tmp += (duk_uint64_t) y->v[i] * (duk_uint64_t) z->v[j] + x->v[i+j]; - x->v[i+j] = (duk_uint32_t) (tmp & 0xffffffffUL); - tmp = tmp >> 32; - } - if (tmp > 0) { - DUK_ASSERT(i + j < nx); - DUK_ASSERT(i + j < DUK__BI_MAX_PARTS); - DUK_ASSERT(x->v[i+j] == 0U); - x->v[i+j] = (duk_uint32_t) tmp; - } -#else - /* - * Multiply + add + carry for 32-bit components using only 16x16->32 - * multiplies and carry detection based on unsigned overflow. - * - * 1st mult, 32-bit: (A*2^16 + B) - * 2nd mult, 32-bit: (C*2^16 + D) - * 3rd add, 32-bit: E - * 4th add, 32-bit: F - * - * (AC*2^16 + B) * (C*2^16 + D) + E + F - * = AC*2^32 + AD*2^16 + BC*2^16 + BD + E + F - * = AC*2^32 + (AD + BC)*2^16 + (BD + E + F) - * = AC*2^32 + AD*2^16 + BC*2^16 + (BD + E + F) - */ - duk_uint32_t a, b, c, d, e, f; - duk_uint32_t r, s, t; - - a = y->v[i]; b = a & 0xffffUL; a = a >> 16; - - f = 0; - for (j = 0; j < nz; j++) { - c = z->v[j]; d = c & 0xffffUL; c = c >> 16; - e = x->v[i+j]; - - /* build result as: (r << 32) + s: start with (BD + E + F) */ - r = 0; - s = b * d; - - /* add E */ - t = s + e; - if (t < s) { r++; } /* carry */ - s = t; - - /* add F */ - t = s + f; - if (t < s) { r++; } /* carry */ - s = t; - - /* add BC*2^16 */ - t = b * c; - r += (t >> 16); - t = s + ((t & 0xffffUL) << 16); - if (t < s) { r++; } /* carry */ - s = t; - - /* add AD*2^16 */ - t = a * d; - r += (t >> 16); - t = s + ((t & 0xffffUL) << 16); - if (t < s) { r++; } /* carry */ - s = t; - - /* add AC*2^32 */ - t = a * c; - r += t; - - DUK_DDD(DUK_DDDPRINT("ab=%08lx cd=%08lx ef=%08lx -> rs=%08lx %08lx", - (unsigned long) y->v[i], (unsigned long) z->v[j], - (unsigned long) x->v[i+j], (unsigned long) r, - (unsigned long) s)); - - x->v[i+j] = s; - f = r; - } - if (f > 0U) { - DUK_ASSERT(i + j < nx); - DUK_ASSERT(i + j < DUK__BI_MAX_PARTS); - DUK_ASSERT(x->v[i+j] == 0U); - x->v[i+j] = (duk_uint32_t) f; - } -#endif /* DUK_USE_64BIT_OPS */ - } - - duk__bi_normalize(x); - DUK_ASSERT(duk__bi_is_valid(x)); -} - -/* x <- y * z */ -DUK_LOCAL void duk__bi_mul_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) { - duk__bigint tmp; - - DUK_ASSERT(duk__bi_is_valid(y)); - - /* XXX: this could be optimized */ - duk__bi_set_small(&tmp, z); - duk__bi_mul(x, y, &tmp); - - DUK_ASSERT(duk__bi_is_valid(x)); -} - -/* x <- x * y, use t as temp */ -DUK_LOCAL void duk__bi_mul_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) { - duk__bi_mul(t, x, y); - duk__bi_copy(x, t); -} - -/* x <- x * y, use t as temp */ -DUK_LOCAL void duk__bi_mul_small_copy(duk__bigint *x, duk_uint32_t y, duk__bigint *t) { - duk__bi_mul_small(t, x, y); - duk__bi_copy(x, t); -} - -DUK_LOCAL int duk__bi_is_even(duk__bigint *x) { - DUK_ASSERT(duk__bi_is_valid(x)); - return (x->n == 0) || ((x->v[0] & 0x01) == 0); -} - -DUK_LOCAL int duk__bi_is_zero(duk__bigint *x) { - DUK_ASSERT(duk__bi_is_valid(x)); - return (x->n == 0); /* this is the case for normalized numbers */ -} - -/* Bigint is 2^52. Used to detect normalized IEEE double mantissa values - * which are at the lowest edge (next floating point value downwards has - * a different exponent). The lowest mantissa has the form: - * - * 1000........000 (52 zeroes; only "hidden bit" is set) - */ -DUK_LOCAL duk_small_int_t duk__bi_is_2to52(duk__bigint *x) { - DUK_ASSERT(duk__bi_is_valid(x)); - return (duk_small_int_t) - (x->n == 2) && (x->v[0] == 0U) && (x->v[1] == (1U << (52-32))); -} - -/* x <- (1< 0); - r = y % 32; - DUK_MEMZERO((void *) x->v, sizeof(duk_uint32_t) * (size_t) n); - x->n = n; - x->v[n - 1] = (((duk_uint32_t) 1) << r); -} - -/* x <- b^y; use t1 and t2 as temps */ -DUK_LOCAL void duk__bi_exp_small(duk__bigint *x, duk_small_int_t b, duk_small_int_t y, duk__bigint *t1, duk__bigint *t2) { - /* Fast path the binary case */ - - DUK_ASSERT(x != t1 && x != t2 && t1 != t2); /* distinct bignums, easy mistake to make */ - DUK_ASSERT(b >= 0); - DUK_ASSERT(y >= 0); - - if (b == 2) { - duk__bi_twoexp(x, y); - return; - } - - /* http://en.wikipedia.org/wiki/Exponentiation_by_squaring */ - - DUK_DDD(DUK_DDDPRINT("exp_small: b=%ld, y=%ld", (long) b, (long) y)); - - duk__bi_set_small(x, 1); - duk__bi_set_small(t1, (duk_uint32_t) b); - for (;;) { - /* Loop structure ensures that we don't compute t1^2 unnecessarily - * on the final round, as that might create a bignum exceeding the - * current DUK__BI_MAX_PARTS limit. - */ - if (y & 0x01) { - duk__bi_mul_copy(x, t1, t2); - } - y = y >> 1; - if (y == 0) { - break; - } - duk__bi_mul_copy(t1, t1, t2); - } - - DUK__BI_PRINT("exp_small result", x); -} - -/* - * A Dragon4 number-to-string variant, based on: - * - * Guy L. Steele Jr., Jon L. White: "How to Print Floating-Point Numbers - * Accurately" - * - * Robert G. Burger, R. Kent Dybvig: "Printing Floating-Point Numbers - * Quickly and Accurately" - * - * The current algorithm is based on Figure 1 of the Burger-Dybvig paper, - * i.e. the base implementation without logarithm estimation speedups - * (these would increase code footprint considerably). Fixed-format output - * does not follow the suggestions in the paper; instead, we generate an - * extra digit and round-with-carry. - * - * The same algorithm is used for number parsing (with b=10 and B=2) - * by generating one extra digit and doing rounding manually. - * - * See doc/number-conversion.rst for limitations. - */ - -/* Maximum number of digits generated. */ -#define DUK__MAX_OUTPUT_DIGITS 1040 /* (Number.MAX_VALUE).toString(2).length == 1024, + slack */ - -/* Maximum number of characters in formatted value. */ -#define DUK__MAX_FORMATTED_LENGTH 1040 /* (-Number.MAX_VALUE).toString(2).length == 1025, + slack */ - -/* Number and (minimum) size of bigints in the nc_ctx structure. */ -#define DUK__NUMCONV_CTX_NUM_BIGINTS 7 -#define DUK__NUMCONV_CTX_BIGINTS_SIZE (sizeof(duk__bigint) * DUK__NUMCONV_CTX_NUM_BIGINTS) - -typedef struct { - /* Currently about 7*152 = 1064 bytes. The space for these - * duk__bigints is used also as a temporary buffer for generating - * the final string. This is a bit awkard; a union would be - * more correct. - */ - duk__bigint f, r, s, mp, mm, t1, t2; - - duk_small_int_t is_s2n; /* if 1, doing a string-to-number; else doing a number-to-string */ - duk_small_int_t is_fixed; /* if 1, doing a fixed format output (not free format) */ - duk_small_int_t req_digits; /* requested number of output digits; 0 = free-format */ - duk_small_int_t abs_pos; /* digit position is absolute, not relative */ - duk_small_int_t e; /* exponent for 'f' */ - duk_small_int_t b; /* input radix */ - duk_small_int_t B; /* output radix */ - duk_small_int_t k; /* see algorithm */ - duk_small_int_t low_ok; /* see algorithm */ - duk_small_int_t high_ok; /* see algorithm */ - duk_small_int_t unequal_gaps; /* m+ != m- (very rarely) */ - - /* Buffer used for generated digits, values are in the range [0,B-1]. */ - duk_uint8_t digits[DUK__MAX_OUTPUT_DIGITS]; - duk_small_int_t count; /* digit count */ -} duk__numconv_stringify_ctx; - -/* Note: computes with 'idx' in assertions, so caller beware. - * 'idx' is preincremented, i.e. '1' on first call, because it - * is more convenient for the caller. - */ -#define DUK__DRAGON4_OUTPUT_PREINC(nc_ctx,preinc_idx,x) do { \ - DUK_ASSERT((preinc_idx) - 1 >= 0); \ - DUK_ASSERT((preinc_idx) - 1 < DUK__MAX_OUTPUT_DIGITS); \ - ((nc_ctx)->digits[(preinc_idx) - 1]) = (duk_uint8_t) (x); \ - } while (0) - -DUK_LOCAL duk_size_t duk__dragon4_format_uint32(duk_uint8_t *buf, duk_uint32_t x, duk_small_int_t radix) { - duk_uint8_t *p; - duk_size_t len; - duk_small_int_t dig; - duk_uint32_t t; - - DUK_ASSERT(radix >= 2 && radix <= 36); - - /* A 32-bit unsigned integer formats to at most 32 digits (the - * worst case happens with radix == 2). Output the digits backwards, - * and use a memmove() to get them in the right place. - */ - - p = buf + 32; - for (;;) { - t = x / (duk_uint32_t) radix; - dig = (duk_small_int_t) (x - t * (duk_uint32_t) radix); - x = t; - - DUK_ASSERT(dig >= 0 && dig < 36); - *(--p) = DUK__DIGITCHAR(dig); - - if (x == 0) { - break; - } - } - len = (duk_size_t) ((buf + 32) - p); - - DUK_MEMMOVE((void *) buf, (const void *) p, (size_t) len); - - return len; -} - -DUK_LOCAL void duk__dragon4_prepare(duk__numconv_stringify_ctx *nc_ctx) { - duk_small_int_t lowest_mantissa; - -#if 1 - /* Assume IEEE round-to-even, so that shorter encoding can be used - * when round-to-even would produce correct result. By removing - * this check (and having low_ok == high_ok == 0) the results would - * still be accurate but in some cases longer than necessary. - */ - if (duk__bi_is_even(&nc_ctx->f)) { - DUK_DDD(DUK_DDDPRINT("f is even")); - nc_ctx->low_ok = 1; - nc_ctx->high_ok = 1; - } else { - DUK_DDD(DUK_DDDPRINT("f is odd")); - nc_ctx->low_ok = 0; - nc_ctx->high_ok = 0; - } -#else - /* Note: not honoring round-to-even should work but now generates incorrect - * results. For instance, 1e23 serializes to "a000...", i.e. the first digit - * equals the radix (10). Scaling stops one step too early in this case. - * Don't know why this is the case, but since this code path is unused, it - * doesn't matter. - */ - nc_ctx->low_ok = 0; - nc_ctx->high_ok = 0; -#endif - - /* For string-to-number, pretend we never have the lowest mantissa as there - * is no natural "precision" for inputs. Having lowest_mantissa == 0, we'll - * fall into the base cases for both e >= 0 and e < 0. - */ - if (nc_ctx->is_s2n) { - lowest_mantissa = 0; - } else { - lowest_mantissa = duk__bi_is_2to52(&nc_ctx->f); - } - - nc_ctx->unequal_gaps = 0; - if (nc_ctx->e >= 0) { - /* exponent non-negative (and thus not minimum exponent) */ - - if (lowest_mantissa) { - /* (>= e 0) AND (= f (expt b (- p 1))) - * - * be <- (expt b e) == b^e - * be1 <- (* be b) == (expt b (+ e 1)) == b^(e+1) - * r <- (* f be1 2) == 2 * f * b^(e+1) [if b==2 -> f * b^(e+2)] - * s <- (* b 2) [if b==2 -> 4] - * m+ <- be1 == b^(e+1) - * m- <- be == b^e - * k <- 0 - * B <- B - * low_ok <- round - * high_ok <- round - */ - - DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); " - "lowest mantissa value for this exponent -> " - "unequal gaps")); - - duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */ - duk__bi_mul_small(&nc_ctx->mp, &nc_ctx->mm, (duk_uint32_t) nc_ctx->b); /* mp <- b^(e+1) */ - duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2); - duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^(e+1) */ - duk__bi_set_small(&nc_ctx->s, (duk_uint32_t) (nc_ctx->b * 2)); /* s <- 2 * b */ - nc_ctx->unequal_gaps = 1; - } else { - /* (>= e 0) AND (not (= f (expt b (- p 1)))) - * - * be <- (expt b e) == b^e - * r <- (* f be 2) == 2 * f * b^e [if b==2 -> f * b^(e+1)] - * s <- 2 - * m+ <- be == b^e - * m- <- be == b^e - * k <- 0 - * B <- B - * low_ok <- round - * high_ok <- round - */ - - DUK_DDD(DUK_DDDPRINT("non-negative exponent (not smallest exponent); " - "not lowest mantissa for this exponent -> " - "equal gaps")); - - duk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2); /* mm <- b^e */ - duk__bi_copy(&nc_ctx->mp, &nc_ctx->mm); /* mp <- b^e */ - duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2); - duk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp); /* r <- (2 * f) * b^e */ - duk__bi_set_small(&nc_ctx->s, 2); /* s <- 2 */ - } - } else { - /* When doing string-to-number, lowest_mantissa is always 0 so - * the exponent check, while incorrect, won't matter. - */ - if (nc_ctx->e > DUK__IEEE_DOUBLE_EXP_MIN /*not minimum exponent*/ && - lowest_mantissa /* lowest mantissa for this exponent*/) { - /* r <- (* f b 2) [if b==2 -> (* f 4)] - * s <- (* (expt b (- 1 e)) 2) == b^(1-e) * 2 [if b==2 -> b^(2-e)] - * m+ <- b == 2 - * m- <- 1 - * k <- 0 - * B <- B - * low_ok <- round - * high_ok <- round - */ - - DUK_DDD(DUK_DDDPRINT("negative exponent; not minimum exponent and " - "lowest mantissa for this exponent -> " - "unequal gaps")); - - duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, (duk_uint32_t) (nc_ctx->b * 2)); /* r <- (2 * b) * f */ - duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, 1 - nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */ - duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(1-e) * 2 */ - duk__bi_set_small(&nc_ctx->mp, 2); - duk__bi_set_small(&nc_ctx->mm, 1); - nc_ctx->unequal_gaps = 1; - } else { - /* r <- (* f 2) - * s <- (* (expt b (- e)) 2) == b^(-e) * 2 [if b==2 -> b^(1-e)] - * m+ <- 1 - * m- <- 1 - * k <- 0 - * B <- B - * low_ok <- round - * high_ok <- round - */ - - DUK_DDD(DUK_DDDPRINT("negative exponent; minimum exponent or not " - "lowest mantissa for this exponent -> " - "equal gaps")); - - duk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, 2); /* r <- 2 * f */ - duk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, -nc_ctx->e, &nc_ctx->s, &nc_ctx->t2); /* NB: use 's' as temp on purpose */ - duk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2); /* s <- b^(-e) * 2 */ - duk__bi_set_small(&nc_ctx->mp, 1); - duk__bi_set_small(&nc_ctx->mm, 1); - } - } -} - -DUK_LOCAL void duk__dragon4_scale(duk__numconv_stringify_ctx *nc_ctx) { - duk_small_int_t k = 0; - - /* This is essentially the 'scale' algorithm, with recursion removed. - * Note that 'k' is either correct immediately, or will move in one - * direction in the loop. There's no need to do the low/high checks - * on every round (like the Scheme algorithm does). - * - * The scheme algorithm finds 'k' and updates 's' simultaneously, - * while the logical algorithm finds 'k' with 's' having its initial - * value, after which 's' is updated separately (see the Burger-Dybvig - * paper, Section 3.1, steps 2 and 3). - * - * The case where m+ == m- (almost always) is optimized for, because - * it reduces the bigint operations considerably and almost always - * applies. The scale loop only needs to work with m+, so this works. - */ - - /* XXX: this algorithm could be optimized quite a lot by using e.g. - * a logarithm based estimator for 'k' and performing B^n multiplication - * using a lookup table or using some bit-representation based exp - * algorithm. Currently we just loop, with significant performance - * impact for very large and very small numbers. - */ - - DUK_DDD(DUK_DDDPRINT("scale: B=%ld, low_ok=%ld, high_ok=%ld", - (long) nc_ctx->B, (long) nc_ctx->low_ok, (long) nc_ctx->high_ok)); - DUK__BI_PRINT("r(init)", &nc_ctx->r); - DUK__BI_PRINT("s(init)", &nc_ctx->s); - DUK__BI_PRINT("mp(init)", &nc_ctx->mp); - DUK__BI_PRINT("mm(init)", &nc_ctx->mm); - - for (;;) { - DUK_DDD(DUK_DDDPRINT("scale loop (inc k), k=%ld", (long) k)); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("m+", &nc_ctx->mp); - DUK__BI_PRINT("m-", &nc_ctx->mm); - - duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */ - if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)) { - DUK_DDD(DUK_DDDPRINT("k is too low")); - /* r <- r - * s <- (* s B) - * m+ <- m+ - * m- <- m- - * k <- (+ k 1) - */ - - duk__bi_mul_small_copy(&nc_ctx->s, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); - k++; - } else { - break; - } - } - - /* k > 0 -> k was too low, and cannot be too high */ - if (k > 0) { - goto skip_dec_k; - } - - for (;;) { - DUK_DDD(DUK_DDDPRINT("scale loop (dec k), k=%ld", (long) k)); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("m+", &nc_ctx->mp); - DUK__BI_PRINT("m-", &nc_ctx->mm); - - duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 = (+ r m+) */ - duk__bi_mul_small(&nc_ctx->t2, &nc_ctx->t1, (duk_uint32_t) nc_ctx->B); /* t2 = (* (+ r m+) B) */ - if (duk__bi_compare(&nc_ctx->t2, &nc_ctx->s) <= (nc_ctx->high_ok ? -1 : 0)) { - DUK_DDD(DUK_DDDPRINT("k is too high")); - /* r <- (* r B) - * s <- s - * m+ <- (* m+ B) - * m- <- (* m- B) - * k <- (- k 1) - */ - duk__bi_mul_small_copy(&nc_ctx->r, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); - duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); - if (nc_ctx->unequal_gaps) { - DUK_DDD(DUK_DDDPRINT("m+ != m- -> need to update m- too")); - duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1); - } - k--; - } else { - break; - } - } - - skip_dec_k: - - if (!nc_ctx->unequal_gaps) { - DUK_DDD(DUK_DDDPRINT("equal gaps, copy m- from m+")); - duk__bi_copy(&nc_ctx->mm, &nc_ctx->mp); /* mm <- mp */ - } - nc_ctx->k = k; - - DUK_DDD(DUK_DDDPRINT("final k: %ld", (long) k)); - DUK__BI_PRINT("r(final)", &nc_ctx->r); - DUK__BI_PRINT("s(final)", &nc_ctx->s); - DUK__BI_PRINT("mp(final)", &nc_ctx->mp); - DUK__BI_PRINT("mm(final)", &nc_ctx->mm); -} - -DUK_LOCAL void duk__dragon4_generate(duk__numconv_stringify_ctx *nc_ctx) { - duk_small_int_t tc1, tc2; /* terminating conditions */ - duk_small_int_t d; /* current digit */ - duk_small_int_t count = 0; /* digit count */ - - /* - * Digit generation loop. - * - * Different termination conditions: - * - * 1. Free format output. Terminate when shortest accurate - * representation found. - * - * 2. Fixed format output, with specific number of digits. - * Ignore termination conditions, terminate when digits - * generated. Caller requests an extra digit and rounds. - * - * 3. Fixed format output, with a specific absolute cut-off - * position (e.g. 10 digits after decimal point). Note - * that we always generate at least one digit, even if - * the digit is below the cut-off point already. - */ - - for (;;) { - DUK_DDD(DUK_DDDPRINT("generate loop, count=%ld, k=%ld, B=%ld, low_ok=%ld, high_ok=%ld", - (long) count, (long) nc_ctx->k, (long) nc_ctx->B, - (long) nc_ctx->low_ok, (long) nc_ctx->high_ok)); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("m+", &nc_ctx->mp); - DUK__BI_PRINT("m-", &nc_ctx->mm); - - /* (quotient-remainder (* r B) s) using a dummy subtraction loop */ - duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, (duk_uint32_t) nc_ctx->B); /* t1 <- (* r B) */ - d = 0; - for (;;) { - if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) { - break; - } - duk__bi_sub_copy(&nc_ctx->t1, &nc_ctx->s, &nc_ctx->t2); /* t1 <- t1 - s */ - d++; - } - duk__bi_copy(&nc_ctx->r, &nc_ctx->t1); /* r <- (remainder (* r B) s) */ - /* d <- (quotient (* r B) s) (in range 0...B-1) */ - DUK_DDD(DUK_DDDPRINT("-> d(quot)=%ld", (long) d)); - DUK__BI_PRINT("r(rem)", &nc_ctx->r); - - duk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m+ <- (* m+ B) */ - duk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m- <- (* m- B) */ - DUK__BI_PRINT("mp(upd)", &nc_ctx->mp); - DUK__BI_PRINT("mm(upd)", &nc_ctx->mm); - - /* Terminating conditions. For fixed width output, we just ignore the - * terminating conditions (and pretend that tc1 == tc2 == false). The - * the current shortcut for fixed-format output is to generate a few - * extra digits and use rounding (with carry) to finish the output. - */ - - if (nc_ctx->is_fixed == 0) { - /* free-form */ - tc1 = (duk__bi_compare(&nc_ctx->r, &nc_ctx->mm) <= (nc_ctx->low_ok ? 0 : -1)); - - duk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp); /* t1 <- (+ r m+) */ - tc2 = (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)); - - DUK_DDD(DUK_DDDPRINT("tc1=%ld, tc2=%ld", (long) tc1, (long) tc2)); - } else { - /* fixed-format */ - tc1 = 0; - tc2 = 0; - } - - /* Count is incremented before DUK__DRAGON4_OUTPUT_PREINC() call - * on purpose, which is taken into account by the macro. - */ - count++; - - if (tc1) { - if (tc2) { - /* tc1 = true, tc2 = true */ - duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, 2); - if (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) { /* (< (* r 2) s) */ - DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r > s: output d --> %ld (k=%ld)", - (long) d, (long) nc_ctx->k)); - DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); - } else { - DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=true, 2r <= s: output d+1 --> %ld (k=%ld)", - (long) (d + 1), (long) nc_ctx->k)); - DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1); - } - break; - } else { - /* tc1 = true, tc2 = false */ - DUK_DDD(DUK_DDDPRINT("tc1=true, tc2=false: output d --> %ld (k=%ld)", - (long) d, (long) nc_ctx->k)); - DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); - break; - } - } else { - if (tc2) { - /* tc1 = false, tc2 = true */ - DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=true: output d+1 --> %ld (k=%ld)", - (long) (d + 1), (long) nc_ctx->k)); - DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1); - break; - } else { - /* tc1 = false, tc2 = false */ - DUK_DDD(DUK_DDDPRINT("tc1=false, tc2=false: output d --> %ld (k=%ld)", - (long) d, (long) nc_ctx->k)); - DUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d); - - /* r <- r (updated above: r <- (remainder (* r B) s) - * s <- s - * m+ <- m+ (updated above: m+ <- (* m+ B) - * m- <- m- (updated above: m- <- (* m- B) - * B, low_ok, high_ok are fixed - */ - - /* fall through and continue for-loop */ - } - } - - /* fixed-format termination conditions */ - if (nc_ctx->is_fixed) { - if (nc_ctx->abs_pos) { - int pos = nc_ctx->k - count + 1; /* count is already incremented, take into account */ - DUK_DDD(DUK_DDDPRINT("fixed format, absolute: abs pos=%ld, k=%ld, count=%ld, req=%ld", - (long) pos, (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits)); - if (pos <= nc_ctx->req_digits) { - DUK_DDD(DUK_DDDPRINT("digit position reached req_digits, end generate loop")); - break; - } - } else { - DUK_DDD(DUK_DDDPRINT("fixed format, relative: k=%ld, count=%ld, req=%ld", - (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits)); - if (count >= nc_ctx->req_digits) { - DUK_DDD(DUK_DDDPRINT("digit count reached req_digits, end generate loop")); - break; - } - } - } - } /* for */ - - nc_ctx->count = count; - - DUK_DDD(DUK_DDDPRINT("generate finished")); - -#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2) - { - duk_uint8_t buf[2048]; - duk_small_int_t i, t; - DUK_MEMZERO(buf, sizeof(buf)); - for (i = 0; i < nc_ctx->count; i++) { - t = nc_ctx->digits[i]; - if (t < 0 || t > 36) { - buf[i] = (duk_uint8_t) '?'; - } else { - buf[i] = (duk_uint8_t) DUK__DIGITCHAR(t); - } - } - DUK_DDD(DUK_DDDPRINT("-> generated digits; k=%ld, digits='%s'", - (long) nc_ctx->k, (const char *) buf)); - } -#endif -} - -/* Round up digits to a given position. If position is out-of-bounds, - * does nothing. If carry propagates over the first digit, a '1' is - * prepended to digits and 'k' will be updated. Return value indicates - * whether carry propagated over the first digit. - * - * Note that nc_ctx->count is NOT updated based on the rounding position - * (it is updated only if carry overflows over the first digit and an - * extra digit is prepended). - */ -DUK_LOCAL duk_small_int_t duk__dragon4_fixed_format_round(duk__numconv_stringify_ctx *nc_ctx, duk_small_int_t round_idx) { - duk_small_int_t t; - duk_uint8_t *p; - duk_uint8_t roundup_limit; - duk_small_int_t ret = 0; - - /* - * round_idx points to the digit which is considered for rounding; the - * digit to its left is the final digit of the rounded value. If round_idx - * is zero, rounding will be performed; the result will either be an empty - * rounded value or if carry happens a '1' digit is generated. - */ - - if (round_idx >= nc_ctx->count) { - DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld >= %ld (count)) -> no rounding", - (long) round_idx, (long) nc_ctx->count)); - return 0; - } else if (round_idx < 0) { - DUK_DDD(DUK_DDDPRINT("round_idx out of bounds (%ld < 0) -> no rounding", - (long) round_idx)); - return 0; - } - - /* - * Round-up limit. - * - * For even values, divides evenly, e.g. 10 -> roundup_limit=5. - * - * For odd values, rounds up, e.g. 3 -> roundup_limit=2. - * If radix is 3, 0/3 -> down, 1/3 -> down, 2/3 -> up. - */ - roundup_limit = (duk_uint8_t) ((nc_ctx->B + 1) / 2); - - p = &nc_ctx->digits[round_idx]; - if (*p >= roundup_limit) { - DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry required")); - /* carry */ - for (;;) { - *p = 0; - if (p == &nc_ctx->digits[0]) { - DUK_DDD(DUK_DDDPRINT("carry propagated to first digit -> special case handling")); - DUK_MEMMOVE((void *) (&nc_ctx->digits[1]), - (const void *) (&nc_ctx->digits[0]), - (size_t) (sizeof(char) * (size_t) nc_ctx->count)); - nc_ctx->digits[0] = 1; /* don't increase 'count' */ - nc_ctx->k++; /* position of highest digit changed */ - nc_ctx->count++; /* number of digits changed */ - ret = 1; - break; - } - - DUK_DDD(DUK_DDDPRINT("fixed-format rounding carry: B=%ld, roundup_limit=%ld, p=%p, digits=%p", - (long) nc_ctx->B, (long) roundup_limit, (void *) p, (void *) nc_ctx->digits)); - p--; - t = *p; - DUK_DDD(DUK_DDDPRINT("digit before carry: %ld", (long) t)); - if (++t < nc_ctx->B) { - DUK_DDD(DUK_DDDPRINT("rounding carry terminated")); - *p = (duk_uint8_t) t; - break; - } - - DUK_DDD(DUK_DDDPRINT("wraps, carry to next digit")); - } - } - - return ret; -} - -#define DUK__NO_EXP (65536) /* arbitrary marker, outside valid exp range */ - -DUK_LOCAL void duk__dragon4_convert_and_push(duk__numconv_stringify_ctx *nc_ctx, - duk_hthread *thr, - duk_small_int_t radix, - duk_small_int_t digits, - duk_small_uint_t flags, - duk_small_int_t neg) { - duk_small_int_t k; - duk_small_int_t pos, pos_end; - duk_small_int_t expt; - duk_small_int_t dig; - duk_uint8_t *q; - duk_uint8_t *buf; - - /* - * The string conversion here incorporates all the necessary Ecmascript - * semantics without attempting to be generic. nc_ctx->digits contains - * nc_ctx->count digits (>= 1), with the topmost digit's 'position' - * indicated by nc_ctx->k as follows: - * - * digits="123" count=3 k=0 --> 0.123 - * digits="123" count=3 k=1 --> 1.23 - * digits="123" count=3 k=5 --> 12300 - * digits="123" count=3 k=-1 --> 0.0123 - * - * Note that the identifier names used for format selection are different - * in Burger-Dybvig paper and Ecmascript specification (quite confusingly - * so, because e.g. 'k' has a totally different meaning in each). See - * documentation for discussion. - * - * Ecmascript doesn't specify any specific behavior for format selection - * (e.g. when to use exponent notation) for non-base-10 numbers. - * - * The bigint space in the context is reused for string output, as there - * is more than enough space for that (>1kB at the moment), and we avoid - * allocating even more stack. - */ - - DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= DUK__MAX_FORMATTED_LENGTH); - DUK_ASSERT(nc_ctx->count >= 1); - - k = nc_ctx->k; - buf = (duk_uint8_t *) &nc_ctx->f; /* XXX: union would be more correct */ - q = buf; - - /* Exponent handling: if exponent format is used, record exponent value and - * fake k such that one leading digit is generated (e.g. digits=123 -> "1.23"). - * - * toFixed() prevents exponent use; otherwise apply a set of criteria to - * match the other API calls (toString(), toPrecision, etc). - */ - - expt = DUK__NO_EXP; - if (!nc_ctx->abs_pos /* toFixed() */) { - if ((flags & DUK_N2S_FLAG_FORCE_EXP) || /* exponential notation forced */ - ((flags & DUK_N2S_FLAG_NO_ZERO_PAD) && /* fixed precision and zero padding would be required */ - (k - digits >= 1)) || /* (e.g. k=3, digits=2 -> "12X") */ - ((k > 21 || k <= -6) && (radix == 10))) { /* toString() conditions */ - DUK_DDD(DUK_DDDPRINT("use exponential notation: k=%ld -> expt=%ld", - (long) k, (long) (k - 1))); - expt = k - 1; /* e.g. 12.3 -> digits="123" k=2 -> 1.23e1 */ - k = 1; /* generate mantissa with a single leading whole number digit */ - } - } - - if (neg) { - *q++ = '-'; - } - - /* Start position (inclusive) and end position (exclusive) */ - pos = (k >= 1 ? k : 1); - if (nc_ctx->is_fixed) { - if (nc_ctx->abs_pos) { - /* toFixed() */ - pos_end = -digits; - } else { - pos_end = k - digits; - } - } else { - pos_end = k - nc_ctx->count; - } - if (pos_end > 0) { - pos_end = 0; - } - - DUK_DDD(DUK_DDDPRINT("expt=%ld, k=%ld, count=%ld, pos=%ld, pos_end=%ld, is_fixed=%ld, " - "digits=%ld, abs_pos=%ld", - (long) expt, (long) k, (long) nc_ctx->count, (long) pos, (long) pos_end, - (long) nc_ctx->is_fixed, (long) digits, (long) nc_ctx->abs_pos)); - - /* Digit generation */ - while (pos > pos_end) { - DUK_DDD(DUK_DDDPRINT("digit generation: pos=%ld, pos_end=%ld", - (long) pos, (long) pos_end)); - if (pos == 0) { - *q++ = (duk_uint8_t) '.'; - } - if (pos > k) { - *q++ = (duk_uint8_t) '0'; - } else if (pos <= k - nc_ctx->count) { - *q++ = (duk_uint8_t) '0'; - } else { - dig = nc_ctx->digits[k - pos]; - DUK_ASSERT(dig >= 0 && dig < nc_ctx->B); - *q++ = (duk_uint8_t) DUK__DIGITCHAR(dig); - } - - pos--; - } - DUK_ASSERT(pos <= 1); - - /* Exponent */ - if (expt != DUK__NO_EXP) { - /* - * Exponent notation for non-base-10 numbers isn't specified in Ecmascript - * specification, as it never explicitly turns up: non-decimal numbers can - * only be formatted with Number.prototype.toString([radix]) and for that, - * behavior is not explicitly specified. - * - * Logical choices include formatting the exponent as decimal (e.g. binary - * 100000 as 1e+5) or in current radix (e.g. binary 100000 as 1e+101). - * The Dragon4 algorithm (in the original paper) prints the exponent value - * in the target radix B. However, for radix values 15 and above, the - * exponent separator 'e' is no longer easily parseable. Consider, for - * instance, the number "1.faecee+1c". - */ - - duk_size_t len; - char expt_sign; - - *q++ = 'e'; - if (expt >= 0) { - expt_sign = '+'; - } else { - expt_sign = '-'; - expt = -expt; - } - *q++ = (duk_uint8_t) expt_sign; - len = duk__dragon4_format_uint32(q, (duk_uint32_t) expt, radix); - q += len; - } - - duk_push_lstring(thr, (const char *) buf, (size_t) (q - buf)); -} - -/* - * Conversion helpers - */ - -DUK_LOCAL void duk__dragon4_double_to_ctx(duk__numconv_stringify_ctx *nc_ctx, duk_double_t x) { - duk_double_union u; - duk_uint32_t tmp; - duk_small_int_t expt; - - /* - * seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff - * A B C D E F G H - * - * s sign bit - * eee... exponent field - * fff... fraction - * - * ieee value = 1.ffff... * 2^(e - 1023) (normal) - * = 0.ffff... * 2^(-1022) (denormal) - * - * algorithm v = f * b^e - */ - - DUK_DBLUNION_SET_DOUBLE(&u, x); - - nc_ctx->f.n = 2; - - tmp = DUK_DBLUNION_GET_LOW32(&u); - nc_ctx->f.v[0] = tmp; - tmp = DUK_DBLUNION_GET_HIGH32(&u); - nc_ctx->f.v[1] = tmp & 0x000fffffUL; - expt = (duk_small_int_t) ((tmp >> 20) & 0x07ffUL); - - if (expt == 0) { - /* denormal */ - expt = DUK__IEEE_DOUBLE_EXP_MIN - 52; - duk__bi_normalize(&nc_ctx->f); - } else { - /* normal: implicit leading 1-bit */ - nc_ctx->f.v[1] |= 0x00100000UL; - expt = expt - DUK__IEEE_DOUBLE_EXP_BIAS - 52; - DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f)); /* true, because v[1] has at least one bit set */ - } - - DUK_ASSERT(duk__bi_is_valid(&nc_ctx->f)); - - nc_ctx->e = expt; -} - -DUK_LOCAL void duk__dragon4_ctx_to_double(duk__numconv_stringify_ctx *nc_ctx, duk_double_t *x) { - duk_double_union u; - duk_small_int_t expt; - duk_small_int_t i; - duk_small_int_t bitstart; - duk_small_int_t bitround; - duk_small_int_t bitidx; - duk_small_int_t skip_round; - duk_uint32_t t, v; - - DUK_ASSERT(nc_ctx->count == 53 + 1); - - /* Sometimes this assert is not true right now; it will be true after - * rounding. See: test-bug-numconv-mantissa-assert.js. - */ - DUK_ASSERT_DISABLE(nc_ctx->digits[0] == 1); /* zero handled by caller */ - - /* Should not be required because the code below always sets both high - * and low parts, but at least gcc-4.4.5 fails to deduce this correctly - * (perhaps because the low part is set (seemingly) conditionally in a - * loop), so this is here to avoid the bogus warning. - */ - DUK_MEMZERO((void *) &u, sizeof(u)); - - /* - * Figure out how generated digits match up with the mantissa, - * and then perform rounding. If mantissa overflows, need to - * recompute the exponent (it is bumped and may overflow to - * infinity). - * - * For normal numbers the leading '1' is hidden and ignored, - * and the last bit is used for rounding: - * - * rounding pt - * <--------52------->| - * 1 x x x x ... x x x x|y ==> x x x x ... x x x x - * - * For denormals, the leading '1' is included in the number, - * and the rounding point is different: - * - * rounding pt - * <--52 or less--->| - * 1 x x x x ... x x|x x y ==> 0 0 ... 1 x x ... x x - * - * The largest denormals will have a mantissa beginning with - * a '1' (the explicit leading bit); smaller denormals will - * have leading zero bits. - * - * If the exponent would become too high, the result becomes - * Infinity. If the exponent is so small that the entire - * mantissa becomes zero, the result becomes zero. - * - * Note: the Dragon4 'k' is off-by-one with respect to the IEEE - * exponent. For instance, k==0 indicates that the leading '1' - * digit is at the first binary fraction position (0.1xxx...); - * the corresponding IEEE exponent would be -1. - */ - - skip_round = 0; - - recheck_exp: - - expt = nc_ctx->k - 1; /* IEEE exp without bias */ - if (expt > 1023) { - /* Infinity */ - bitstart = -255; /* needed for inf: causes mantissa to become zero, - * and rounding to be skipped. - */ - expt = 2047; - } else if (expt >= -1022) { - /* normal */ - bitstart = 1; /* skip leading digit */ - expt += DUK__IEEE_DOUBLE_EXP_BIAS; - DUK_ASSERT(expt >= 1 && expt <= 2046); - } else { - /* denormal or zero */ - bitstart = 1023 + expt; /* expt==-1023 -> bitstart=0 (leading 1); - * expt==-1024 -> bitstart=-1 (one left of leading 1), etc - */ - expt = 0; - } - bitround = bitstart + 52; - - DUK_DDD(DUK_DDDPRINT("ieee expt=%ld, bitstart=%ld, bitround=%ld", - (long) expt, (long) bitstart, (long) bitround)); - - if (!skip_round) { - if (duk__dragon4_fixed_format_round(nc_ctx, bitround)) { - /* Corner case: see test-numconv-parse-mant-carry.js. We could - * just bump the exponent and update bitstart, but it's more robust - * to recompute (but avoid rounding twice). - */ - DUK_DDD(DUK_DDDPRINT("rounding caused exponent to be bumped, recheck exponent")); - skip_round = 1; - goto recheck_exp; - } - } - - /* - * Create mantissa - */ - - t = 0; - for (i = 0; i < 52; i++) { - bitidx = bitstart + 52 - 1 - i; - if (bitidx >= nc_ctx->count) { - v = 0; - } else if (bitidx < 0) { - v = 0; - } else { - v = nc_ctx->digits[bitidx]; - } - DUK_ASSERT(v == 0 || v == 1); - t += v << (i % 32); - if (i == 31) { - /* low 32 bits is complete */ - DUK_DBLUNION_SET_LOW32(&u, t); - t = 0; - } - } - /* t has high mantissa */ - - DUK_DDD(DUK_DDDPRINT("mantissa is complete: %08lx %08lx", - (unsigned long) t, - (unsigned long) DUK_DBLUNION_GET_LOW32(&u))); - - DUK_ASSERT(expt >= 0 && expt <= 0x7ffL); - t += ((duk_uint32_t) expt) << 20; -#if 0 /* caller handles sign change */ - if (negative) { - t |= 0x80000000U; - } -#endif - DUK_DBLUNION_SET_HIGH32(&u, t); - - DUK_DDD(DUK_DDDPRINT("number is complete: %08lx %08lx", - (unsigned long) DUK_DBLUNION_GET_HIGH32(&u), - (unsigned long) DUK_DBLUNION_GET_LOW32(&u))); - - *x = DUK_DBLUNION_GET_DOUBLE(&u); -} - -/* - * Exposed number-to-string API - * - * Input: [ number ] - * Output: [ string ] - */ - -DUK_INTERNAL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags) { - duk_double_t x; - duk_small_int_t c; - duk_small_int_t neg; - duk_uint32_t uval; - duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */ - duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc; - - x = (duk_double_t) duk_require_number(thr, -1); - duk_pop(thr); - - /* - * Handle special cases (NaN, infinity, zero). - */ - - c = (duk_small_int_t) DUK_FPCLASSIFY(x); - if (DUK_SIGNBIT((double) x)) { - x = -x; - neg = 1; - } else { - neg = 0; - } - - /* NaN sign bit is platform specific with unpacked, un-normalized NaNs */ - DUK_ASSERT(c == DUK_FP_NAN || DUK_SIGNBIT((double) x) == 0); - - if (c == DUK_FP_NAN) { - duk_push_hstring_stridx(thr, DUK_STRIDX_NAN); - return; - } else if (c == DUK_FP_INFINITE) { - if (neg) { - /* -Infinity */ - duk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_INFINITY); - } else { - /* Infinity */ - duk_push_hstring_stridx(thr, DUK_STRIDX_INFINITY); - } - return; - } else if (c == DUK_FP_ZERO) { - /* We can't shortcut zero here if it goes through special formatting - * (such as forced exponential notation). - */ - ; - } - - /* - * Handle integers in 32-bit range (that is, [-(2**32-1),2**32-1]) - * specially, as they're very likely for embedded programs. This - * is now done for all radix values. We must be careful not to use - * the fast path when special formatting (e.g. forced exponential) - * is in force. - * - * XXX: could save space by supporting radix 10 only and using - * sprintf "%lu" for the fast path and for exponent formatting. - */ - - uval = (unsigned int) x; - if (((double) uval) == x && /* integer number in range */ - flags == 0) { /* no special formatting */ - /* use bigint area as a temp */ - duk_uint8_t *buf = (duk_uint8_t *) (&nc_ctx->f); - duk_uint8_t *p = buf; - - DUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= 32 + 1); /* max size: radix=2 + sign */ - if (neg && uval != 0) { - /* no negative sign for zero */ - *p++ = (duk_uint8_t) '-'; - } - p += duk__dragon4_format_uint32(p, uval, radix); - duk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf)); - return; - } - - /* - * Dragon4 setup. - * - * Convert double from IEEE representation for conversion; - * normal finite values have an implicit leading 1-bit. The - * slow path algorithm doesn't handle zero, so zero is special - * cased here but still creates a valid nc_ctx, and goes - * through normal formatting in case special formatting has - * been requested (e.g. forced exponential format: 0 -> "0e+0"). - */ - - /* Would be nice to bulk clear the allocation, but the context - * is 1-2 kilobytes and nothing should rely on it being zeroed. - */ -#if 0 - DUK_MEMZERO((void *) nc_ctx, sizeof(*nc_ctx)); /* slow init, do only for slow path cases */ -#endif - - nc_ctx->is_s2n = 0; - nc_ctx->b = 2; - nc_ctx->B = radix; - nc_ctx->abs_pos = 0; - if (flags & DUK_N2S_FLAG_FIXED_FORMAT) { - nc_ctx->is_fixed = 1; - if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) { - /* absolute req_digits; e.g. digits = 1 -> last digit is 0, - * but add an extra digit for rounding. - */ - nc_ctx->abs_pos = 1; - nc_ctx->req_digits = (-digits + 1) - 1; - } else { - nc_ctx->req_digits = digits + 1; - } - } else { - nc_ctx->is_fixed = 0; - nc_ctx->req_digits = 0; - } - - if (c == DUK_FP_ZERO) { - /* Zero special case: fake requested number of zero digits; ensure - * no sign bit is printed. Relative and absolute fixed format - * require separate handling. - */ - duk_small_int_t count; - if (nc_ctx->is_fixed) { - if (nc_ctx->abs_pos) { - count = digits + 2; /* lead zero + 'digits' fractions + 1 for rounding */ - } else { - count = digits + 1; /* + 1 for rounding */ - } - } else { - count = 1; - } - DUK_DDD(DUK_DDDPRINT("count=%ld", (long) count)); - DUK_ASSERT(count >= 1); - DUK_MEMZERO((void *) nc_ctx->digits, (size_t) count); - nc_ctx->count = count; - nc_ctx->k = 1; /* 0.000... */ - neg = 0; - goto zero_skip; - } - - duk__dragon4_double_to_ctx(nc_ctx, x); /* -> sets 'f' and 'e' */ - DUK__BI_PRINT("f", &nc_ctx->f); - DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e)); - - /* - * Dragon4 slow path digit generation. - */ - - duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */ - - DUK_DDD(DUK_DDDPRINT("after prepare:")); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("mp", &nc_ctx->mp); - DUK__BI_PRINT("mm", &nc_ctx->mm); - - duk__dragon4_scale(nc_ctx); - - DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k)); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("mp", &nc_ctx->mp); - DUK__BI_PRINT("mm", &nc_ctx->mm); - - duk__dragon4_generate(nc_ctx); - - /* - * Convert and push final string. - */ - - zero_skip: - - if (flags & DUK_N2S_FLAG_FIXED_FORMAT) { - /* Perform fixed-format rounding. */ - duk_small_int_t roundpos; - if (flags & DUK_N2S_FLAG_FRACTION_DIGITS) { - /* 'roundpos' is relative to nc_ctx->k and increases to the right - * (opposite of how 'k' changes). - */ - roundpos = -digits; /* absolute position for digit considered for rounding */ - roundpos = nc_ctx->k - roundpos; - } else { - roundpos = digits; - } - DUK_DDD(DUK_DDDPRINT("rounding: k=%ld, count=%ld, digits=%ld, roundpos=%ld", - (long) nc_ctx->k, (long) nc_ctx->count, (long) digits, (long) roundpos)); - (void) duk__dragon4_fixed_format_round(nc_ctx, roundpos); - - /* Note: 'count' is currently not adjusted by rounding (i.e. the - * digits are not "chopped off". That shouldn't matter because - * the digit position (absolute or relative) is passed on to the - * convert-and-push function. - */ - } - - duk__dragon4_convert_and_push(nc_ctx, thr, radix, digits, flags, neg); -} - -/* - * Exposed string-to-number API - * - * Input: [ string ] - * Output: [ number ] - * - * If number parsing fails, a NaN is pushed as the result. If number parsing - * fails due to an internal error, an InternalError is thrown. - */ - -DUK_INTERNAL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags) { - duk__numconv_stringify_ctx nc_ctx_alloc; /* large context; around 2kB now */ - duk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc; - duk_double_t res; - duk_hstring *h_str; - duk_small_int_t expt; - duk_small_int_t expt_neg; - duk_small_int_t expt_adj; - duk_small_int_t neg; - duk_small_int_t dig; - duk_small_int_t dig_whole; - duk_small_int_t dig_lzero; - duk_small_int_t dig_frac; - duk_small_int_t dig_expt; - duk_small_int_t dig_prec; - const duk__exp_limits *explim; - const duk_uint8_t *p; - duk_small_int_t ch; - - DUK_DDD(DUK_DDDPRINT("parse number: %!T, radix=%ld, flags=0x%08lx", - (duk_tval *) duk_get_tval(thr, -1), - (long) radix, (unsigned long) flags)); - - DUK_ASSERT(radix >= 2 && radix <= 36); - DUK_ASSERT(radix - 2 < (duk_small_int_t) sizeof(duk__str2num_digits_for_radix)); - - /* - * Preliminaries: trim, sign, Infinity check - * - * We rely on the interned string having a NUL terminator, which will - * cause a parse failure wherever it is encountered. As a result, we - * don't need separate pointer checks. - * - * There is no special parsing for 'NaN' in the specification although - * 'Infinity' (with an optional sign) is allowed in some contexts. - * Some contexts allow plus/minus sign, while others only allow the - * minus sign (like JSON.parse()). - * - * Automatic hex number detection (leading '0x' or '0X') and octal - * number detection (leading '0' followed by at least one octal digit) - * is done here too. - * - * Symbols are not explicitly rejected here (that's up to the caller). - * If a symbol were passed here, it should ultimately safely fail - * parsing due to a syntax error. - */ - - if (flags & DUK_S2N_FLAG_TRIM_WHITE) { - /* Leading / trailing whitespace is sometimes accepted and - * sometimes not. After white space trimming, all valid input - * characters are pure ASCII. - */ - duk_trim(thr, -1); - } - h_str = duk_require_hstring(thr, -1); - DUK_ASSERT(h_str != NULL); - p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_str); - - neg = 0; - ch = *p; - if (ch == (duk_small_int_t) '+') { - if ((flags & DUK_S2N_FLAG_ALLOW_PLUS) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: leading plus sign not allowed")); - goto parse_fail; - } - p++; - } else if (ch == (duk_small_int_t) '-') { - if ((flags & DUK_S2N_FLAG_ALLOW_MINUS) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: leading minus sign not allowed")); - goto parse_fail; - } - p++; - neg = 1; - } - - if ((flags & DUK_S2N_FLAG_ALLOW_INF) && DUK_STRNCMP((const char *) p, "Infinity", 8) == 0) { - /* Don't check for Infinity unless the context allows it. - * 'Infinity' is a valid integer literal in e.g. base-36: - * - * parseInt('Infinity', 36) - * 1461559270678 - */ - - if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0 && p[8] != DUK_ASC_NUL) { - DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage after matching 'Infinity' not allowed")); - goto parse_fail; - } else { - res = DUK_DOUBLE_INFINITY; - goto negcheck_and_ret; - } - } - ch = *p; - if (ch == (duk_small_int_t) '0') { - duk_small_int_t detect_radix = 0; - ch = DUK_LOWERCASE_CHAR_ASCII(p[1]); /* 'x' or 'X' -> 'x' */ - if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT) && ch == DUK_ASC_LC_X) { - DUK_DDD(DUK_DDDPRINT("detected 0x/0X hex prefix, changing radix and preventing fractions and exponent")); - detect_radix = 16; -#if 0 - } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT) && - (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) { - DUK_DDD(DUK_DDDPRINT("detected 0n oct prefix, changing radix and preventing fractions and exponent")); - detect_radix = 8; - - /* NOTE: if this legacy octal case is added back, it has - * different flags and 'p' advance so this needs to be - * reworked. - */ - flags |= DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO; /* interpret e.g. '09' as '0', not NaN */ - p += 1; -#endif - } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) && ch == DUK_ASC_LC_O) { - DUK_DDD(DUK_DDDPRINT("detected 0o oct prefix, changing radix and preventing fractions and exponent")); - detect_radix = 8; - } else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT) && ch == DUK_ASC_LC_B) { - DUK_DDD(DUK_DDDPRINT("detected 0b bin prefix, changing radix and preventing fractions and exponent")); - detect_radix = 2; - } - if (detect_radix > 0) { - radix = detect_radix; - /* Clear empty as zero flag: interpret e.g. '0x' and '0xg' as a NaN (= parse error) */ - flags &= ~(DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | - DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC | - DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO); - flags |= DUK_S2N_FLAG_ALLOW_LEADING_ZERO; /* allow e.g. '0x0009' and '0b00010001' */ - p += 2; - } - } - - /* - * Scan number and setup for Dragon4. - * - * The fast path case is detected during setup: an integer which - * can be converted without rounding, no net exponent. The fast - * path could be implemented as a separate scan, but may not really - * be worth it: the multiplications for building 'f' are not - * expensive when 'f' is small. - * - * The significand ('f') must contain enough bits of (apparent) - * accuracy, so that Dragon4 will generate enough binary output digits. - * For decimal numbers, this means generating a 20-digit significand, - * which should yield enough practical accuracy to parse IEEE doubles. - * In fact, the Ecmascript specification explicitly allows an - * implementation to treat digits beyond 20 as zeroes (and even - * to round the 20th digit upwards). For non-decimal numbers, the - * appropriate number of digits has been precomputed for comparable - * accuracy. - * - * Digit counts: - * - * [ dig_lzero ] - * | - * .+-..---[ dig_prec ]----. - * | || | - * 0000123.456789012345678901234567890e+123456 - * | | | | | | - * `--+--' `------[ dig_frac ]-------' `-+--' - * | | - * [ dig_whole ] [ dig_expt ] - * - * dig_frac and dig_expt are -1 if not present - * dig_lzero is only computed for whole number part - * - * Parsing state - * - * Parsing whole part dig_frac < 0 AND dig_expt < 0 - * Parsing fraction part dig_frac >= 0 AND dig_expt < 0 - * Parsing exponent part dig_expt >= 0 (dig_frac may be < 0 or >= 0) - * - * Note: in case we hit an implementation limit (like exponent range), - * we should throw an error, NOT return NaN or Infinity. Even with - * very large exponent (or significand) values the final result may be - * finite, so NaN/Infinity would be incorrect. - */ - - duk__bi_set_small(&nc_ctx->f, 0); - dig_prec = 0; - dig_lzero = 0; - dig_whole = 0; - dig_frac = -1; - dig_expt = -1; - expt = 0; - expt_adj = 0; /* essentially tracks digit position of lowest 'f' digit */ - expt_neg = 0; - for (;;) { - ch = *p++; - - DUK_DDD(DUK_DDDPRINT("parse digits: p=%p, ch='%c' (%ld), expt=%ld, expt_adj=%ld, " - "dig_whole=%ld, dig_frac=%ld, dig_expt=%ld, dig_lzero=%ld, dig_prec=%ld", - (const void *) p, (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : '?'), (long) ch, - (long) expt, (long) expt_adj, (long) dig_whole, (long) dig_frac, - (long) dig_expt, (long) dig_lzero, (long) dig_prec)); - DUK__BI_PRINT("f", &nc_ctx->f); - - /* Most common cases first. */ - if (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9') { - dig = (duk_small_int_t) ch - '0' + 0; - } else if (ch == (duk_small_int_t) '.') { - /* A leading digit is not required in some cases, e.g. accept ".123". - * In other cases (JSON.parse()) a leading digit is required. This - * is checked for after the loop. - */ - if (dig_frac >= 0 || dig_expt >= 0) { - if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { - DUK_DDD(DUK_DDDPRINT("garbage termination (invalid period)")); - break; - } else { - DUK_DDD(DUK_DDDPRINT("parse failed: period not allowed")); - goto parse_fail; - } - } - - if ((flags & DUK_S2N_FLAG_ALLOW_FRAC) == 0) { - /* Some contexts don't allow fractions at all; this can't be a - * post-check because the state ('f' and expt) would be incorrect. - */ - if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { - DUK_DDD(DUK_DDDPRINT("garbage termination (invalid first period)")); - break; - } else { - DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed")); - } - } - - DUK_DDD(DUK_DDDPRINT("start fraction part")); - dig_frac = 0; - continue; - } else if (ch == (duk_small_int_t) 0) { - DUK_DDD(DUK_DDDPRINT("NUL termination")); - break; - } else if ((flags & DUK_S2N_FLAG_ALLOW_EXP) && - dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) { - /* Note: we don't parse back exponent notation for anything else - * than radix 10, so this is not an ambiguous check (e.g. hex - * exponent values may have 'e' either as a significand digit - * or as an exponent separator). - * - * If the exponent separator occurs twice, 'e' will be interpreted - * as a digit (= 14) and will be rejected as an invalid decimal - * digit. - */ - - DUK_DDD(DUK_DDDPRINT("start exponent part")); - - /* Exponent without a sign or with a +/- sign is accepted - * by all call sites (even JSON.parse()). - */ - ch = *p; - if (ch == (duk_small_int_t) '-') { - expt_neg = 1; - p++; - } else if (ch == (duk_small_int_t) '+') { - p++; - } - dig_expt = 0; - continue; - } else if (ch >= (duk_small_int_t) 'a' && ch <= (duk_small_int_t) 'z') { - dig = (duk_small_int_t) (ch - (duk_small_int_t) 'a' + 0x0a); - } else if (ch >= (duk_small_int_t) 'A' && ch <= (duk_small_int_t) 'Z') { - dig = (duk_small_int_t) (ch - (duk_small_int_t) 'A' + 0x0a); - } else { - dig = 255; /* triggers garbage digit check below */ - } - DUK_ASSERT((dig >= 0 && dig <= 35) || dig == 255); - - if (dig >= radix) { - if (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) { - DUK_DDD(DUK_DDDPRINT("garbage termination")); - break; - } else { - DUK_DDD(DUK_DDDPRINT("parse failed: trailing garbage or invalid digit")); - goto parse_fail; - } - } - - if (dig_expt < 0) { - /* whole or fraction digit */ - - if (dig_prec < duk__str2num_digits_for_radix[radix - 2]) { - /* significant from precision perspective */ - - duk_small_int_t f_zero = duk__bi_is_zero(&nc_ctx->f); - if (f_zero && dig == 0) { - /* Leading zero is not counted towards precision digits; not - * in the integer part, nor in the fraction part. - */ - if (dig_frac < 0) { - dig_lzero++; - } - } else { - /* XXX: join these ops (multiply-accumulate), but only if - * code footprint decreases. - */ - duk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, (duk_uint32_t) radix); - duk__bi_add_small(&nc_ctx->f, &nc_ctx->t1, (duk_uint32_t) dig); - dig_prec++; - } - } else { - /* Ignore digits beyond a radix-specific limit, but note them - * in expt_adj. - */ - expt_adj++; - } - - if (dig_frac >= 0) { - dig_frac++; - expt_adj--; - } else { - dig_whole++; - } - } else { - /* exponent digit */ - - expt = expt * radix + dig; - if (expt > DUK_S2N_MAX_EXPONENT) { - /* impose a reasonable exponent limit, so that exp - * doesn't need to get tracked using a bigint. - */ - DUK_DDD(DUK_DDDPRINT("parse failed: exponent too large")); - goto parse_explimit_error; - } - dig_expt++; - } - } - - /* Leading zero. */ - - if (dig_lzero > 0 && dig_whole > 1) { - if ((flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: leading zeroes not allowed in integer part")); - goto parse_fail; - } - } - - /* Validity checks for various fraction formats ("0.1", ".1", "1.", "."). */ - - if (dig_whole == 0) { - if (dig_frac == 0) { - /* "." is not accepted in any format */ - DUK_DDD(DUK_DDDPRINT("parse failed: plain period without leading or trailing digits")); - goto parse_fail; - } else if (dig_frac > 0) { - /* ".123" */ - if ((flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: fraction part not allowed without " - "leading integer digit(s)")); - goto parse_fail; - } - } else { - /* empty ("") is allowed in some formats (e.g. Number(''), as zero */ - if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: empty string not allowed (as zero)")); - goto parse_fail; - } - } - } else { - if (dig_frac == 0) { - /* "123." is allowed in some formats */ - if ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: empty fractions")); - goto parse_fail; - } - } else if (dig_frac > 0) { - /* "123.456" */ - ; - } else { - /* "123" */ - ; - } - } - - /* Exponent without digits (e.g. "1e" or "1e+"). If trailing garbage is - * allowed, ignore exponent part as garbage (= parse as "1", i.e. exp 0). - */ - - if (dig_expt == 0) { - if ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0) { - DUK_DDD(DUK_DDDPRINT("parse failed: empty exponent")); - goto parse_fail; - } - DUK_ASSERT(expt == 0); - } - - if (expt_neg) { - expt = -expt; - } - DUK_DDD(DUK_DDDPRINT("expt=%ld, expt_adj=%ld, net exponent -> %ld", - (long) expt, (long) expt_adj, (long) (expt + expt_adj))); - expt += expt_adj; - - /* Fast path check. */ - - if (nc_ctx->f.n <= 1 && /* 32-bit value */ - expt == 0 /* no net exponent */) { - /* Fast path is triggered for no exponent and also for balanced exponent - * and fraction parts, e.g. for "1.23e2" == "123". Remember to respect - * zero sign. - */ - - /* XXX: could accept numbers larger than 32 bits, e.g. up to 53 bits? */ - DUK_DDD(DUK_DDDPRINT("fast path number parse")); - if (nc_ctx->f.n == 1) { - res = (double) nc_ctx->f.v[0]; - } else { - res = 0.0; - } - goto negcheck_and_ret; - } - - /* Significand ('f') padding. */ - - while (dig_prec < duk__str2num_digits_for_radix[radix - 2]) { - /* Pad significand with "virtual" zero digits so that Dragon4 will - * have enough (apparent) precision to work with. - */ - DUK_DDD(DUK_DDDPRINT("dig_prec=%ld, pad significand with zero", (long) dig_prec)); - duk__bi_mul_small_copy(&nc_ctx->f, (duk_uint32_t) radix, &nc_ctx->t1); - DUK__BI_PRINT("f", &nc_ctx->f); - expt--; - dig_prec++; - } - - DUK_DDD(DUK_DDDPRINT("final exponent: %ld", (long) expt)); - - /* Detect zero special case. */ - - if (nc_ctx->f.n == 0) { - /* This may happen even after the fast path check, if exponent is - * not balanced (e.g. "0e1"). Remember to respect zero sign. - */ - DUK_DDD(DUK_DDDPRINT("significand is zero")); - res = 0.0; - goto negcheck_and_ret; - } - - - /* Quick reject of too large or too small exponents. This check - * would be incorrect for zero (e.g. "0e1000" is zero, not Infinity) - * so zero check must be above. - */ - - explim = &duk__str2num_exp_limits[radix - 2]; - if (expt > explim->upper) { - DUK_DDD(DUK_DDDPRINT("exponent too large -> infinite")); - res = (duk_double_t) DUK_DOUBLE_INFINITY; - goto negcheck_and_ret; - } else if (expt < explim->lower) { - DUK_DDD(DUK_DDDPRINT("exponent too small -> zero")); - res = (duk_double_t) 0.0; - goto negcheck_and_ret; - } - - nc_ctx->is_s2n = 1; - nc_ctx->e = expt; - nc_ctx->b = radix; - nc_ctx->B = 2; - nc_ctx->is_fixed = 1; - nc_ctx->abs_pos = 0; - nc_ctx->req_digits = 53 + 1; - - DUK__BI_PRINT("f", &nc_ctx->f); - DUK_DDD(DUK_DDDPRINT("e=%ld", (long) nc_ctx->e)); - - /* - * Dragon4 slow path (binary) digit generation. - * An extra digit is generated for rounding. - */ - - duk__dragon4_prepare(nc_ctx); /* setup many variables in nc_ctx */ - - DUK_DDD(DUK_DDDPRINT("after prepare:")); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("mp", &nc_ctx->mp); - DUK__BI_PRINT("mm", &nc_ctx->mm); - - duk__dragon4_scale(nc_ctx); - - DUK_DDD(DUK_DDDPRINT("after scale; k=%ld", (long) nc_ctx->k)); - DUK__BI_PRINT("r", &nc_ctx->r); - DUK__BI_PRINT("s", &nc_ctx->s); - DUK__BI_PRINT("mp", &nc_ctx->mp); - DUK__BI_PRINT("mm", &nc_ctx->mm); - - duk__dragon4_generate(nc_ctx); - - DUK_ASSERT(nc_ctx->count == 53 + 1); - - /* - * Convert binary digits into an IEEE double. Need to handle - * denormals and rounding correctly. - * - * Some call sites currently assume the result is always a - * non-fastint double. If this is changed, check all call - * sites. - */ - - duk__dragon4_ctx_to_double(nc_ctx, &res); - goto negcheck_and_ret; - - negcheck_and_ret: - if (neg) { - res = -res; - } - duk_pop(thr); - duk_push_number(thr, (double) res); - DUK_DDD(DUK_DDDPRINT("result: %!T", (duk_tval *) duk_get_tval(thr, -1))); - return; - - parse_fail: - DUK_DDD(DUK_DDDPRINT("parse failed")); - duk_pop(thr); - duk_push_nan(thr); - return; - - parse_explimit_error: - DUK_DDD(DUK_DDDPRINT("parse failed, internal error, can't return a value")); - DUK_ERROR_RANGE(thr, "exponent too large"); - return; -} - -/* automatic undefs */ -#undef DUK__BI_MAX_PARTS -#undef DUK__BI_PRINT -#undef DUK__DIGITCHAR -#undef DUK__DRAGON4_OUTPUT_PREINC -#undef DUK__IEEE_DOUBLE_EXP_BIAS -#undef DUK__IEEE_DOUBLE_EXP_MIN -#undef DUK__MAX_FORMATTED_LENGTH -#undef DUK__MAX_OUTPUT_DIGITS -#undef DUK__NO_EXP -#undef DUK__NUMCONV_CTX_BIGINTS_SIZE -#undef DUK__NUMCONV_CTX_NUM_BIGINTS -#line 1 "duk_regexp_compiler.c" -/* - * Regexp compilation. - * - * See doc/regexp.rst for a discussion of the compilation approach and - * current limitations. - * - * Regexp bytecode assumes jumps can be expressed with signed 32-bit - * integers. Consequently the bytecode size must not exceed 0x7fffffffL. - * The implementation casts duk_size_t (buffer size) to duk_(u)int32_t - * in many places. Although this could be changed, the bytecode format - * limit would still prevent regexps exceeding the signed 32-bit limit - * from working. - * - * XXX: The implementation does not prevent bytecode from exceeding the - * maximum supported size. This could be done by limiting the maximum - * input string size (assuming an upper bound can be computed for number - * of bytecode bytes emitted per input byte) or checking buffer maximum - * size when emitting bytecode (slower). - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_REGEXP_SUPPORT) - -/* - * Helper macros - */ - -#define DUK__RE_INITIAL_BUFSIZE 64 - -#define DUK__RE_BUFLEN(re_ctx) \ - DUK_BW_GET_SIZE(re_ctx->thr, &re_ctx->bw) - -/* - * Disjunction struct: result of parsing a disjunction - */ - -typedef struct { - /* Number of characters that the atom matches (e.g. 3 for 'abc'), - * -1 if atom is complex and number of matched characters either - * varies or is not known. - */ - duk_int32_t charlen; - -#if 0 - /* These are not needed to implement quantifier capture handling, - * but might be needed at some point. - */ - - /* re_ctx->captures at start and end of atom parsing. - * Since 'captures' indicates highest capture number emitted - * so far in a DUK_REOP_SAVE, the captures numbers saved by - * the atom are: ]start_captures,end_captures]. - */ - duk_uint32_t start_captures; - duk_uint32_t end_captures; -#endif -} duk__re_disjunction_info; - -/* - * Encoding helpers - * - * Some of the typing is bytecode based, e.g. slice sizes are unsigned 32-bit - * even though the buffer operations will use duk_size_t. - */ - -/* XXX: the insert helpers should ensure that the bytecode result is not - * larger than expected (or at least assert for it). Many things in the - * bytecode, like skip offsets, won't work correctly if the bytecode is - * larger than say 2G. - */ - -DUK_LOCAL duk_uint32_t duk__encode_i32(duk_int32_t x) { - if (x < 0) { - return ((duk_uint32_t) (-x)) * 2 + 1; - } else { - return ((duk_uint32_t) x) * 2; - } -} - -/* XXX: return type should probably be duk_size_t, or explicit checks are needed for - * maximum size. - */ -DUK_LOCAL duk_uint32_t duk__insert_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t x) { - duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; - duk_small_int_t len; - - len = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf); - DUK_ASSERT(len >= 0); - DUK_BW_INSERT_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, offset, buf, (duk_size_t) len); - return (duk_uint32_t) len; -} - -DUK_LOCAL void duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { - DUK_BW_WRITE_ENSURE_XUTF8(re_ctx->thr, &re_ctx->bw, x); -} - -DUK_LOCAL void duk__append_7bit(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { -#if defined(DUK_USE_PREFER_SIZE) - duk__append_u32(re_ctx, x); -#else - DUK_ASSERT(x <= 0x7fU); - DUK_BW_WRITE_ENSURE_U8(re_ctx->thr, &re_ctx->bw, (duk_uint8_t) x); -#endif -} - -#if 0 -DUK_LOCAL void duk__append_2bytes(duk_re_compiler_ctx *re_ctx, duk_uint8_t x, duk_uint8_t y) { - DUK_BW_WRITE_ENSURE_U8_2(re_ctx->thr, &re_ctx->bw, x, y); -} -#endif - -DUK_LOCAL duk_uint32_t duk__insert_i32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t x) { - return duk__insert_u32(re_ctx, offset, duk__encode_i32(x)); -} - -DUK_LOCAL void duk__append_reop(duk_re_compiler_ctx *re_ctx, duk_uint32_t reop) { - DUK_ASSERT(reop <= 0x7fU); - (void) duk__append_7bit(re_ctx, reop); -} - -#if 0 /* unused */ -DUK_LOCAL void duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) { - duk__append_u32(re_ctx, duk__encode_i32(x)); -} -#endif - -/* special helper for emitting u16 lists (used for character ranges for built-in char classes) */ -DUK_LOCAL void duk__append_u16_list(duk_re_compiler_ctx *re_ctx, const duk_uint16_t *values, duk_uint32_t count) { - /* Call sites don't need the result length so it's not accumulated. */ - while (count-- > 0) { - duk__append_u32(re_ctx, (duk_uint32_t) (*values++)); - } -} - -DUK_LOCAL void duk__insert_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t data_offset, duk_uint32_t data_length) { - DUK_BW_INSERT_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, offset, data_offset, data_length); -} - -DUK_LOCAL void duk__append_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) { - DUK_BW_WRITE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length); -} - -DUK_LOCAL void duk__remove_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) { - DUK_BW_REMOVE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length); -} - -/* - * Insert a jump offset at 'offset' to complete an instruction - * (the jump offset is always the last component of an instruction). - * The 'skip' argument must be computed relative to 'offset', - * -without- taking into account the skip field being inserted. - * - * ... A B C ins X Y Z ... (ins may be a JUMP, SPLIT1/SPLIT2, etc) - * => ... A B C ins SKIP X Y Z - * - * Computing the final (adjusted) skip value, which is relative to the - * first byte of the next instruction, is a bit tricky because of the - * variable length UTF-8 encoding. See doc/regexp.rst for discussion. - */ -DUK_LOCAL duk_uint32_t duk__insert_jump_offset(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t skip) { -#if 0 - /* Iterative solution. */ - if (skip < 0) { - duk_small_int_t len; - /* two encoding attempts suffices */ - len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip)); - len = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip - (duk_int32_t) len)); - DUK_ASSERT(duk_unicode_get_xutf8_length(duk__encode_i32(skip - (duk_int32_t) len)) == len); /* no change */ - skip -= (duk_int32_t) len; - } -#endif - -#if defined(DUK_USE_PREFER_SIZE) - /* Closed form solution, this produces smallest code. - * See re_neg_jump_offset (closed2). - */ - if (skip < 0) { - skip--; - if (skip < -0x3fL) { - skip--; - } - if (skip < -0x3ffL) { - skip--; - } - if (skip < -0x7fffL) { - skip--; - } - if (skip < -0xfffffL) { - skip--; - } - if (skip < -0x1ffffffL) { - skip--; - } - if (skip < -0x3fffffffL) { - skip--; - } - } -#else /* DUK_USE_PREFER_SIZE */ - /* Closed form solution, this produces fastest code. - * See re_neg_jump_offset (closed1). - */ - if (skip < 0) { - if (skip >= -0x3eL) { - skip -= 1; - } else if (skip >= -0x3fdL) { - skip -= 2; - } else if (skip >= -0x7ffcL) { - skip -= 3; - } else if (skip >= -0xffffbL) { - skip -= 4; - } else if (skip >= -0x1fffffaL) { - skip -= 5; - } else if (skip >= -0x3ffffff9L) { - skip -= 6; - } else { - skip -= 7; - } - } -#endif /* DUK_USE_PREFER_SIZE */ - - return duk__insert_i32(re_ctx, offset, skip); -} - -DUK_LOCAL duk_uint32_t duk__append_jump_offset(duk_re_compiler_ctx *re_ctx, duk_int32_t skip) { - return (duk_uint32_t) duk__insert_jump_offset(re_ctx, (duk_uint32_t) DUK__RE_BUFLEN(re_ctx), skip); -} - -/* - * duk_re_range_callback for generating character class ranges. - * - * When ignoreCase is false, the range is simply emitted as is. We don't, - * for instance, eliminate duplicates or overlapping ranges in a character - * class. - * - * When ignoreCase is true but the 'direct' flag is set, the caller knows - * that the range canonicalizes to itself for case insensitive matching, - * so the range is emitted as is. This is mainly useful for built-in ranges - * like \W. - * - * Otherwise, when ignoreCase is true, the range needs to be normalized - * through canonicalization. Unfortunately a canonicalized version of a - * continuous range is not necessarily continuous (e.g. [x-{] is continuous - * but [X-{] is not). As a result, a single input range may expand to a lot - * of output ranges. The current algorithm creates the canonicalized ranges - * footprint efficiently at the cost of compile time execution time; see - * doc/regexp.rst for discussion, and some more details below. - * - * Note that the ctx->nranges is a context-wide temporary value. This is OK - * because there cannot be multiple character classes being parsed - * simultaneously. - * - * More detail on canonicalization: - * - * Conceptually, a range is canonicalized by scanning the entire range, - * normalizing each codepoint by converting it to uppercase, and generating - * a set of result ranges. - * - * Ideally a minimal set of output ranges would be emitted by merging all - * possible ranges even if they're emitted out of sequence. Because the - * input string is also case normalized during matching, some codepoints - * never occur at runtime; these "don't care" codepoints can be included or - * excluded from ranges when merging/optimizing ranges. - * - * The current algorithm does not do optimal range merging. Rather, output - * codepoints are generated in sequence, and when the output codepoints are - * continuous (CP, CP+1, CP+2, ...), they are merged locally into as large a - * range as possible. A small canonicalization bitmap is used to reduce - * actual codepoint canonicalizations which are quite slow at present. The - * bitmap provides a "codepoint block is continuous with respect to - * canonicalization" for N-codepoint blocks. This allows blocks to be - * skipped quickly. - * - * There are a number of shortcomings and future work here: - * - * - Individual codepoint normalizations are slow because they involve - * walking bit-packed rules without a lookup index. - * - * - The conceptual algorithm needs to canonicalize every codepoint in the - * input range to figure out the output range(s). Even with the small - * canonicalization bitmap the algorithm runs quite slowly for worst case - * inputs. There are many data structure alternatives to improve this. - * - * - While the current algorithm generates maximal output ranges when the - * output codepoints are emitted linearly, output ranges are not sorted or - * merged otherwise. In the worst case a lot of ranges are emitted when - * most of the ranges could be merged. In this process one could take - * advantage of "don't care" codepoints, which are never matched against at - * runtime due to canonicalization of input codepoints before comparison, - * to merge otherwise discontinuous output ranges. - * - * - The runtime data structure is just a linear list of ranges to match - * against. This can be quite slow if there are a lot of output ranges. - * There are various ways to make matching against the ranges faster, - * e.g. sorting the ranges and using a binary search; skip lists; tree - * based representations; full or approximate codepoint bitmaps, etc. - * - * - Only BMP is supported, codepoints above BMP are assumed to canonicalize - * to themselves. For now this is one place where we don't want to - * support chars outside the BMP, because the exhaustive search would be - * massively larger. It would be possible to support non-BMP with a - * different algorithm, or perhaps doing case normalization only at match - * time. - */ - -DUK_LOCAL void duk__regexp_emit_range(duk_re_compiler_ctx *re_ctx, duk_codepoint_t r1, duk_codepoint_t r2) { - DUK_ASSERT(r2 >= r1); - duk__append_u32(re_ctx, (duk_uint32_t) r1); - duk__append_u32(re_ctx, (duk_uint32_t) r2); - re_ctx->nranges++; -} - -#if defined(DUK_USE_REGEXP_CANON_BITMAP) -/* Find next canonicalization discontinuity (conservative estimate) starting - * from 'start', not exceeding 'end'. If continuity is fine up to 'end' - * inclusive, returns end. Minimum possible return value is start. - */ -DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) { - duk_uint_t start_blk; - duk_uint_t end_blk; - duk_uint_t blk; - duk_uint_t offset; - duk_uint8_t mask; - - /* Inclusive block range. */ - DUK_ASSERT(start >= 0); - DUK_ASSERT(end >= 0); - DUK_ASSERT(end >= start); - start_blk = (duk_uint_t) (start >> DUK_CANON_BITMAP_BLKSHIFT); - end_blk = (duk_uint_t) (end >> DUK_CANON_BITMAP_BLKSHIFT); - - for (blk = start_blk; blk <= end_blk; blk++) { - offset = blk >> 3; - mask = 1U << (blk & 0x07); - if (offset >= sizeof(duk_unicode_re_canon_bitmap)) { - /* Reached non-BMP range which is assumed continuous. */ - return end; - } - DUK_ASSERT(offset < sizeof(duk_unicode_re_canon_bitmap)); - if ((duk_unicode_re_canon_bitmap[offset] & mask) == 0) { - /* Block is discontinuous, continuity is guaranteed - * only up to end of previous block (+1 for exclusive - * return value => start of current block). Start - * block requires special handling. - */ - if (blk > start_blk) { - return (duk_codepoint_t) (blk << DUK_CANON_BITMAP_BLKSHIFT); - } else { - return start; - } - } - } - DUK_ASSERT(blk == end_blk + 1); /* Reached end block which is continuous. */ - return end; -} -#else /* DUK_USE_REGEXP_CANON_BITMAP */ -DUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) { - DUK_ASSERT(start >= 0); - DUK_ASSERT(end >= 0); - DUK_ASSERT(end >= start); - if (start >= 0x10000) { - /* Even without the bitmap, treat non-BMP as continuous. */ - return end; - } - return start; -} -#endif /* DUK_USE_REGEXP_CANON_BITMAP */ - -DUK_LOCAL void duk__regexp_generate_ranges(void *userdata, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct) { - duk_re_compiler_ctx *re_ctx = (duk_re_compiler_ctx *) userdata; - duk_codepoint_t r_start; - duk_codepoint_t r_end; - duk_codepoint_t i; - duk_codepoint_t t; - duk_codepoint_t r_disc; - - DUK_DD(DUK_DDPRINT("duk__regexp_generate_ranges(): re_ctx=%p, range=[%ld,%ld] direct=%ld", - (void *) re_ctx, (long) r1, (long) r2, (long) direct)); - - DUK_ASSERT(r2 >= r1); /* SyntaxError for out of order range. */ - - if (direct || (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) == 0) { - DUK_DD(DUK_DDPRINT("direct or not case sensitive, emit range: [%ld,%ld]", (long) r1, (long) r2)); - duk__regexp_emit_range(re_ctx, r1, r2); - return; - } - - DUK_DD(DUK_DDPRINT("case sensitive, process range: [%ld,%ld]", (long) r1, (long) r2)); - - r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1); - r_end = r_start; - - for (i = r1 + 1; i <= r2;) { - /* Input codepoint space processed up to i-1, and - * current range in r_{start,end} is up-to-date - * (inclusive) and may either break or continue. - */ - r_disc = duk__re_canon_next_discontinuity(i, r2); - DUK_ASSERT(r_disc >= i); - DUK_ASSERT(r_disc <= r2); - - r_end += r_disc - i; /* May be zero. */ - t = duk_unicode_re_canonicalize_char(re_ctx->thr, r_disc); - if (t == r_end + 1) { - /* Not actually a discontinuity, continue range - * to r_disc and recheck. - */ - r_end = t; - } else { - duk__regexp_emit_range(re_ctx, r_start, r_end); - r_start = t; - r_end = t; - } - i = r_disc + 1; /* Guarantees progress. */ - } - duk__regexp_emit_range(re_ctx, r_start, r_end); - -#if 0 /* Exhaustive search, very slow. */ - r_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1); - r_end = r_start; - for (i = r1 + 1; i <= r2; i++) { - t = duk_unicode_re_canonicalize_char(re_ctx->thr, i); - if (t == r_end + 1) { - r_end = t; - } else { - DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end)); - duk__append_u32(re_ctx, (duk_uint32_t) r_start); - duk__append_u32(re_ctx, (duk_uint32_t) r_end); - re_ctx->nranges++; - r_start = t; - r_end = t; - } - } - DUK_DD(DUK_DDPRINT("canonicalized, emit range: [%ld,%ld]", (long) r_start, (long) r_end)); - duk__append_u32(re_ctx, (duk_uint32_t) r_start); - duk__append_u32(re_ctx, (duk_uint32_t) r_end); - re_ctx->nranges++; -#endif -} - -/* - * Parse regexp Disjunction. Most of regexp compilation happens here. - * - * Handles Disjunction, Alternative, and Term productions directly without - * recursion. The only constructs requiring recursion are positive/negative - * lookaheads, capturing parentheses, and non-capturing parentheses. - * - * The function determines whether the entire disjunction is a 'simple atom' - * (see doc/regexp.rst discussion on 'simple quantifiers') and if so, - * returns the atom character length which is needed by the caller to keep - * track of its own atom character length. A disjunction with more than one - * alternative is never considered a simple atom (although in some cases - * that might be the case). - * - * Return value: simple atom character length or < 0 if not a simple atom. - * Appends the bytecode for the disjunction matcher to the end of the temp - * buffer. - * - * Regexp top level structure is: - * - * Disjunction = Term* - * | Term* | Disjunction - * - * Term = Assertion - * | Atom - * | Atom Quantifier - * - * An empty Term sequence is a valid disjunction alternative (e.g. /|||c||/). - * - * Notes: - * - * * Tracking of the 'simple-ness' of the current atom vs. the entire - * disjunction are separate matters. For instance, the disjunction - * may be complex, but individual atoms may be simple. Furthermore, - * simple quantifiers are used whenever possible, even if the - * disjunction as a whole is complex. - * - * * The estimate of whether an atom is simple is conservative now, - * and it would be possible to expand it. For instance, captures - * cause the disjunction to be marked complex, even though captures - * -can- be handled by simple quantifiers with some minor modifications. - * - * * Disjunction 'tainting' as 'complex' is handled at the end of the - * main for loop collectively for atoms. Assertions, quantifiers, - * and '|' tokens need to taint the result manually if necessary. - * Assertions cannot add to result char length, only atoms (and - * quantifiers) can; currently quantifiers will taint the result - * as complex though. - */ - -DUK_LOCAL const duk_uint16_t * const duk__re_range_lookup1[3] = { - duk_unicode_re_ranges_digit, - duk_unicode_re_ranges_white, - duk_unicode_re_ranges_wordchar -}; -DUK_LOCAL const duk_uint8_t duk__re_range_lookup2[3] = { - sizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t)), - sizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t)), - sizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t)) -}; - -DUK_LOCAL void duk__append_range_atom_matcher(duk_re_compiler_ctx *re_ctx, duk_small_uint_t re_op, const duk_uint16_t *ranges, duk_small_uint_t count) { -#if 0 - DUK_ASSERT(re_op <= 0x7fUL); - DUK_ASSERT(count <= 0x7fUL); - duk__append_2bytes(re_ctx, (duk_uint8_t) re_op, (duk_uint8_t) count); -#endif - duk__append_reop(re_ctx, re_op); - duk__append_7bit(re_ctx, count); - duk__append_u16_list(re_ctx, ranges, count * 2); -} - -DUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t expect_eof, duk__re_disjunction_info *out_atom_info) { - duk_int32_t atom_start_offset = -1; /* negative -> no atom matched on previous round */ - duk_int32_t atom_char_length = 0; /* negative -> complex atom */ - duk_uint32_t atom_start_captures = re_ctx->captures; /* value of re_ctx->captures at start of atom */ - duk_int32_t unpatched_disjunction_split = -1; - duk_int32_t unpatched_disjunction_jump = -1; - duk_uint32_t entry_offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); - duk_int32_t res_charlen = 0; /* -1 if disjunction is complex, char length if simple */ - duk__re_disjunction_info tmp_disj; - - DUK_ASSERT(out_atom_info != NULL); - - if (re_ctx->recursion_depth >= re_ctx->recursion_limit) { - DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT); - } - re_ctx->recursion_depth++; - -#if 0 - out_atom_info->start_captures = re_ctx->captures; -#endif - - for (;;) { - /* atom_char_length, atom_start_offset, atom_start_offset reflect the - * atom matched on the previous loop. If a quantifier is encountered - * on this loop, these are needed to handle the quantifier correctly. - * new_atom_char_length etc are for the atom parsed on this round; - * they're written to atom_char_length etc at the end of the round. - */ - duk_int32_t new_atom_char_length; /* char length of the atom parsed in this loop */ - duk_int32_t new_atom_start_offset; /* bytecode start offset of the atom parsed in this loop - * (allows quantifiers to copy the atom bytecode) - */ - duk_uint32_t new_atom_start_captures; /* re_ctx->captures at the start of the atom parsed in this loop */ - - duk_lexer_parse_re_token(&re_ctx->lex, &re_ctx->curr_token); - - DUK_DD(DUK_DDPRINT("re token: %ld (num=%ld, char=%c)", - (long) re_ctx->curr_token.t, - (long) re_ctx->curr_token.num, - (re_ctx->curr_token.num >= 0x20 && re_ctx->curr_token.num <= 0x7e) ? - (int) re_ctx->curr_token.num : (int) '?')); - - /* set by atom case clauses */ - new_atom_start_offset = -1; - new_atom_char_length = -1; - new_atom_start_captures = re_ctx->captures; - - switch (re_ctx->curr_token.t) { - case DUK_RETOK_DISJUNCTION: { - /* - * The handling here is a bit tricky. If a previous '|' has been processed, - * we have a pending split1 and a pending jump (for a previous match). These - * need to be back-patched carefully. See docs for a detailed example. - */ - - /* patch pending jump and split */ - if (unpatched_disjunction_jump >= 0) { - duk_uint32_t offset; - - DUK_ASSERT(unpatched_disjunction_split >= 0); - offset = (duk_uint32_t) unpatched_disjunction_jump; - offset += duk__insert_jump_offset(re_ctx, - offset, - (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset)); - /* offset is now target of the pending split (right after jump) */ - duk__insert_jump_offset(re_ctx, - (duk_uint32_t) unpatched_disjunction_split, - (duk_int32_t) offset - unpatched_disjunction_split); - } - - /* add a new pending split to the beginning of the entire disjunction */ - (void) duk__insert_u32(re_ctx, - entry_offset, - DUK_REOP_SPLIT1); /* prefer direct execution */ - unpatched_disjunction_split = (duk_int32_t) (entry_offset + 1); /* +1 for opcode */ - - /* add a new pending match jump for latest finished alternative */ - duk__append_reop(re_ctx, DUK_REOP_JUMP); - unpatched_disjunction_jump = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - - /* 'taint' result as complex */ - res_charlen = -1; - break; - } - case DUK_RETOK_QUANTIFIER: { - if (atom_start_offset < 0) { - DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_NO_ATOM); - } - if (re_ctx->curr_token.qmin > re_ctx->curr_token.qmax) { - DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_VALUES); - } - if (atom_char_length >= 0) { - /* - * Simple atom - * - * If atom_char_length is zero, we'll have unbounded execution time for e.g. - * /()*x/.exec('x'). We can't just skip the match because it might have some - * side effects (for instance, if we allowed captures in simple atoms, the - * capture needs to happen). The simple solution below is to force the - * quantifier to match at most once, since the additional matches have no effect. - * - * With a simple atom there can be no capture groups, so no captures need - * to be reset. - */ - duk_int32_t atom_code_length; - duk_uint32_t offset; - duk_uint32_t qmin, qmax; - - qmin = re_ctx->curr_token.qmin; - qmax = re_ctx->curr_token.qmax; - if (atom_char_length == 0) { - /* qmin and qmax will be 0 or 1 */ - if (qmin > 1) { - qmin = 1; - } - if (qmax > 1) { - qmax = 1; - } - } - - duk__append_reop(re_ctx, DUK_REOP_MATCH); /* complete 'sub atom' */ - atom_code_length = (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (duk_size_t) atom_start_offset); - - offset = (duk_uint32_t) atom_start_offset; - if (re_ctx->curr_token.greedy) { - offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQGREEDY); - offset += duk__insert_u32(re_ctx, offset, qmin); - offset += duk__insert_u32(re_ctx, offset, qmax); - offset += duk__insert_u32(re_ctx, offset, (duk_uint32_t) atom_char_length); - offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length); - } else { - offset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQMINIMAL); - offset += duk__insert_u32(re_ctx, offset, qmin); - offset += duk__insert_u32(re_ctx, offset, qmax); - offset += duk__insert_jump_offset(re_ctx, offset, atom_code_length); - } - DUK_UNREF(offset); /* silence scan-build warning */ - } else { - /* - * Complex atom - * - * The original code is used as a template, and removed at the end - * (this differs from the handling of simple quantifiers). - * - * NOTE: there is no current solution for empty atoms in complex - * quantifiers. This would need some sort of a 'progress' instruction. - * - * XXX: impose limit on maximum result size, i.e. atom_code_len * atom_copies? - */ - duk_int32_t atom_code_length; - duk_uint32_t atom_copies; - duk_uint32_t tmp_qmin, tmp_qmax; - - /* pre-check how many atom copies we're willing to make (atom_copies not needed below) */ - atom_copies = (re_ctx->curr_token.qmax == DUK_RE_QUANTIFIER_INFINITE) ? - re_ctx->curr_token.qmin : re_ctx->curr_token.qmax; - if (atom_copies > DUK_RE_MAX_ATOM_COPIES) { - DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_QUANTIFIER_TOO_MANY_COPIES); - } - - /* wipe the capture range made by the atom (if any) */ - DUK_ASSERT(atom_start_captures <= re_ctx->captures); - if (atom_start_captures != re_ctx->captures) { - DUK_ASSERT(atom_start_captures < re_ctx->captures); - DUK_DDD(DUK_DDDPRINT("must wipe ]atom_start_captures,re_ctx->captures]: ]%ld,%ld]", - (long) atom_start_captures, (long) re_ctx->captures)); - - /* insert (DUK_REOP_WIPERANGE, start, count) in reverse order so the order ends up right */ - duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (re_ctx->captures - atom_start_captures) * 2U); - duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (atom_start_captures + 1) * 2); - duk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, DUK_REOP_WIPERANGE); - } else { - DUK_DDD(DUK_DDDPRINT("no need to wipe captures: atom_start_captures == re_ctx->captures == %ld", - (long) atom_start_captures)); - } - - atom_code_length = (duk_int32_t) DUK__RE_BUFLEN(re_ctx) - atom_start_offset; - - /* insert the required matches (qmin) by copying the atom */ - tmp_qmin = re_ctx->curr_token.qmin; - tmp_qmax = re_ctx->curr_token.qmax; - while (tmp_qmin > 0) { - duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); - tmp_qmin--; - if (tmp_qmax != DUK_RE_QUANTIFIER_INFINITE) { - tmp_qmax--; - } - } - DUK_ASSERT(tmp_qmin == 0); - - /* insert code for matching the remainder - infinite or finite */ - if (tmp_qmax == DUK_RE_QUANTIFIER_INFINITE) { - /* reuse last emitted atom for remaining 'infinite' quantifier */ - - if (re_ctx->curr_token.qmin == 0) { - /* Special case: original qmin was zero so there is nothing - * to repeat. Emit an atom copy but jump over it here. - */ - duk__append_reop(re_ctx, DUK_REOP_JUMP); - duk__append_jump_offset(re_ctx, atom_code_length); - duk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); - } - if (re_ctx->curr_token.greedy) { - duk__append_reop(re_ctx, DUK_REOP_SPLIT2); /* prefer jump */ - } else { - duk__append_reop(re_ctx, DUK_REOP_SPLIT1); /* prefer direct */ - } - duk__append_jump_offset(re_ctx, -atom_code_length - 1); /* -1 for opcode */ - } else { - /* - * The remaining matches are emitted as sequence of SPLITs and atom - * copies; the SPLITs skip the remaining copies and match the sequel. - * This sequence needs to be emitted starting from the last copy - * because the SPLITs are variable length due to the variable length - * skip offset. This causes a lot of memory copying now. - * - * Example structure (greedy, match maximum # atoms): - * - * SPLIT1 LSEQ - * (atom) - * SPLIT1 LSEQ ; <- the byte length of this instruction is needed - * (atom) ; to encode the above SPLIT1 correctly - * ... - * LSEQ: - */ - duk_uint32_t offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); - while (tmp_qmax > 0) { - duk__insert_slice(re_ctx, offset, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); - if (re_ctx->curr_token.greedy) { - duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT1); /* prefer direct */ - } else { - duk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT2); /* prefer jump */ - } - duk__insert_jump_offset(re_ctx, - offset + 1, /* +1 for opcode */ - (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1))); - tmp_qmax--; - } - } - - /* remove the original 'template' atom */ - duk__remove_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length); - } - - /* 'taint' result as complex */ - res_charlen = -1; - break; - } - case DUK_RETOK_ASSERT_START: { - duk__append_reop(re_ctx, DUK_REOP_ASSERT_START); - break; - } - case DUK_RETOK_ASSERT_END: { - duk__append_reop(re_ctx, DUK_REOP_ASSERT_END); - break; - } - case DUK_RETOK_ASSERT_WORD_BOUNDARY: { - duk__append_reop(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY); - break; - } - case DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY: { - duk__append_reop(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); - break; - } - case DUK_RETOK_ASSERT_START_POS_LOOKAHEAD: - case DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD: { - duk_uint32_t offset; - duk_uint32_t opcode = (re_ctx->curr_token.t == DUK_RETOK_ASSERT_START_POS_LOOKAHEAD) ? - DUK_REOP_LOOKPOS : DUK_REOP_LOOKNEG; - - offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); - duk__parse_disjunction(re_ctx, 0, &tmp_disj); - duk__append_reop(re_ctx, DUK_REOP_MATCH); - - (void) duk__insert_u32(re_ctx, offset, opcode); - (void) duk__insert_jump_offset(re_ctx, - offset + 1, /* +1 for opcode */ - (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1))); - - /* 'taint' result as complex -- this is conservative, - * as lookaheads do not backtrack. - */ - res_charlen = -1; - break; - } - case DUK_RETOK_ATOM_PERIOD: { - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_reop(re_ctx, DUK_REOP_PERIOD); - break; - } - case DUK_RETOK_ATOM_CHAR: { - /* Note: successive characters could be joined into string matches - * but this is not trivial (consider e.g. '/xyz+/); see docs for - * more discussion. - * - * No support for \u{H+} yet. While only BMP Unicode escapes are - * supported for RegExps at present, 'ch' may still be a non-BMP - * codepoint if it is decoded straight from source text UTF-8. - * There's no non-BMP support yet so this is handled simply by - * matching the non-BMP character (which is custom behavior). - */ - duk_uint32_t ch; - - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_reop(re_ctx, DUK_REOP_CHAR); - ch = re_ctx->curr_token.num; - if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { - ch = (duk_uint32_t) duk_unicode_re_canonicalize_char(re_ctx->thr, (duk_codepoint_t) ch); - } - duk__append_u32(re_ctx, ch); - break; - } - case DUK_RETOK_ATOM_DIGIT: - case DUK_RETOK_ATOM_NOT_DIGIT: - case DUK_RETOK_ATOM_WHITE: - case DUK_RETOK_ATOM_NOT_WHITE: - case DUK_RETOK_ATOM_WORD_CHAR: - case DUK_RETOK_ATOM_NOT_WORD_CHAR: { - duk_small_uint_t re_op; - duk_small_uint_t idx; - - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - - DUK_ASSERT((DUK_RETOK_ATOM_DIGIT & 0x01) != 0); - DUK_ASSERT((DUK_RETOK_ATOM_WHITE & 0x01) != 0); - DUK_ASSERT((DUK_RETOK_ATOM_WORD_CHAR & 0x01) != 0); - DUK_ASSERT((DUK_RETOK_ATOM_NOT_DIGIT & 0x01) == 0); - DUK_ASSERT((DUK_RETOK_ATOM_NOT_WHITE & 0x01) == 0); - DUK_ASSERT((DUK_RETOK_ATOM_NOT_WORD_CHAR & 0x01) == 0); - re_op = (re_ctx->curr_token.t & 0x01) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES; - - DUK_ASSERT(DUK_RETOK_ATOM_WHITE == DUK_RETOK_ATOM_DIGIT + 2); - DUK_ASSERT(DUK_RETOK_ATOM_WORD_CHAR == DUK_RETOK_ATOM_DIGIT + 4); - idx = (duk_small_uint_t) ((re_ctx->curr_token.t - DUK_RETOK_ATOM_DIGIT) >> 1U); - DUK_ASSERT(idx <= 2U); /* Assume continuous token numbers; also checks negative underflow. */ - - duk__append_range_atom_matcher(re_ctx, re_op, duk__re_range_lookup1[idx], duk__re_range_lookup2[idx]); - break; - } - case DUK_RETOK_ATOM_BACKREFERENCE: { - duk_uint32_t backref = (duk_uint32_t) re_ctx->curr_token.num; - if (backref > re_ctx->highest_backref) { - re_ctx->highest_backref = backref; - } - new_atom_char_length = -1; /* mark as complex */ - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_reop(re_ctx, DUK_REOP_BACKREFERENCE); - duk__append_u32(re_ctx, backref); - break; - } - case DUK_RETOK_ATOM_START_CAPTURE_GROUP: { - duk_uint32_t cap; - - new_atom_char_length = -1; /* mark as complex (capture handling) */ - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - cap = ++re_ctx->captures; - duk__append_reop(re_ctx, DUK_REOP_SAVE); - duk__append_u32(re_ctx, cap * 2); - duk__parse_disjunction(re_ctx, 0, &tmp_disj); /* retval (sub-atom char length) unused, tainted as complex above */ - duk__append_reop(re_ctx, DUK_REOP_SAVE); - duk__append_u32(re_ctx, cap * 2 + 1); - break; - } - case DUK_RETOK_ATOM_START_NONCAPTURE_GROUP: { - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__parse_disjunction(re_ctx, 0, &tmp_disj); - new_atom_char_length = tmp_disj.charlen; - break; - } - case DUK_RETOK_ATOM_START_CHARCLASS: - case DUK_RETOK_ATOM_START_CHARCLASS_INVERTED: { - /* - * Range parsing is done with a special lexer function which calls - * us for every range parsed. This is different from how rest of - * the parsing works, but avoids a heavy, arbitrary size intermediate - * value type to hold the ranges. - * - * Another complication is the handling of character ranges when - * case insensitive matching is used (see docs for discussion). - * The range handler callback given to the lexer takes care of this - * as well. - * - * Note that duplicate ranges are not eliminated when parsing character - * classes, so that canonicalization of - * - * [0-9a-fA-Fx-{] - * - * creates the result (note the duplicate ranges): - * - * [0-9A-FA-FX-Z{-{] - * - * where [x-{] is split as a result of canonicalization. The duplicate - * ranges are not a semantics issue: they work correctly. - */ - - duk_uint32_t offset; - - DUK_DD(DUK_DDPRINT("character class")); - - /* insert ranges instruction, range count patched in later */ - new_atom_char_length = 1; - new_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx); - duk__append_reop(re_ctx, - (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ? - DUK_REOP_RANGES : DUK_REOP_INVRANGES); - offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx); /* patch in range count later */ - - /* parse ranges until character class ends */ - re_ctx->nranges = 0; /* note: ctx-wide temporary */ - duk_lexer_parse_re_ranges(&re_ctx->lex, duk__regexp_generate_ranges, (void *) re_ctx); - - /* insert range count */ - duk__insert_u32(re_ctx, offset, re_ctx->nranges); - break; - } - case DUK_RETOK_ATOM_END_GROUP: { - if (expect_eof) { - DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_CLOSING_PAREN); - } - goto done; - } - case DUK_RETOK_EOF: { - if (!expect_eof) { - DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_END_OF_PATTERN); - } - goto done; - } - default: { - DUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_REGEXP_TOKEN); - } - } - - /* a complex (new) atom taints the result */ - if (new_atom_start_offset >= 0) { - if (new_atom_char_length < 0) { - res_charlen = -1; - } else if (res_charlen >= 0) { - /* only advance if not tainted */ - res_charlen += new_atom_char_length; - } - } - - /* record previous atom info in case next token is a quantifier */ - atom_start_offset = new_atom_start_offset; - atom_char_length = new_atom_char_length; - atom_start_captures = new_atom_start_captures; - } - - done: - - /* finish up pending jump and split for last alternative */ - if (unpatched_disjunction_jump >= 0) { - duk_uint32_t offset; - - DUK_ASSERT(unpatched_disjunction_split >= 0); - offset = (duk_uint32_t) unpatched_disjunction_jump; - offset += duk__insert_jump_offset(re_ctx, - offset, - (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset)); - /* offset is now target of the pending split (right after jump) */ - duk__insert_jump_offset(re_ctx, - (duk_uint32_t) unpatched_disjunction_split, - (duk_int32_t) offset - unpatched_disjunction_split); - } - -#if 0 - out_atom_info->end_captures = re_ctx->captures; -#endif - out_atom_info->charlen = res_charlen; - DUK_DDD(DUK_DDDPRINT("parse disjunction finished: charlen=%ld", - (long) out_atom_info->charlen)); - - re_ctx->recursion_depth--; -} - -/* - * Flags parsing (see E5 Section 15.10.4.1). - */ - -DUK_LOCAL duk_uint32_t duk__parse_regexp_flags(duk_hthread *thr, duk_hstring *h) { - const duk_uint8_t *p; - const duk_uint8_t *p_end; - duk_uint32_t flags = 0; - - p = DUK_HSTRING_GET_DATA(h); - p_end = p + DUK_HSTRING_GET_BYTELEN(h); - - /* Note: can be safely scanned as bytes (undecoded) */ - - while (p < p_end) { - duk_uint8_t c = *p++; - switch (c) { - case (duk_uint8_t) 'g': { - if (flags & DUK_RE_FLAG_GLOBAL) { - goto flags_error; - } - flags |= DUK_RE_FLAG_GLOBAL; - break; - } - case (duk_uint8_t) 'i': { - if (flags & DUK_RE_FLAG_IGNORE_CASE) { - goto flags_error; - } - flags |= DUK_RE_FLAG_IGNORE_CASE; - break; - } - case (duk_uint8_t) 'm': { - if (flags & DUK_RE_FLAG_MULTILINE) { - goto flags_error; - } - flags |= DUK_RE_FLAG_MULTILINE; - break; - } - default: { - goto flags_error; - } - } - } - - return flags; - - flags_error: - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_REGEXP_FLAGS); - return 0; /* never here */ -} - -/* - * Create escaped RegExp source (E5 Section 15.10.3). - * - * The current approach is to special case the empty RegExp - * ('' -> '(?:)') and otherwise replace unescaped '/' characters - * with '\/' regardless of where they occur in the regexp. - * - * Note that normalization does not seem to be necessary for - * RegExp literals (e.g. '/foo/') because to be acceptable as - * a RegExp literal, the text between forward slashes must - * already match the escaping requirements (e.g. must not contain - * unescaped forward slashes or be empty). Escaping IS needed - * for expressions like 'new Regexp("...", "")' however. - * Currently, we re-escape in either case. - * - * Also note that we process the source here in UTF-8 encoded - * form. This is correct, because any non-ASCII characters are - * passed through without change. - */ - -DUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) { - duk_hstring *h; - const duk_uint8_t *p; - duk_bufwriter_ctx bw_alloc; - duk_bufwriter_ctx *bw; - duk_uint8_t *q; - duk_size_t i, n; - duk_uint_fast8_t c_prev, c; - - h = duk_known_hstring(thr, idx_pattern); - p = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h); - n = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); - - if (n == 0) { - duk_push_string(thr, "(?:)"); - return; - } - - bw = &bw_alloc; - DUK_BW_INIT_PUSHBUF(thr, bw, n); - q = DUK_BW_GET_PTR(thr, bw); - - c_prev = (duk_uint_fast8_t) 0; - - for (i = 0; i < n; i++) { - c = p[i]; - - q = DUK_BW_ENSURE_RAW(thr, bw, 2, q); - - if (c == (duk_uint_fast8_t) '/' && c_prev != (duk_uint_fast8_t) '\\') { - /* Unescaped '/' ANYWHERE in the regexp (in disjunction, - * inside a character class, ...) => same escape works. - */ - *q++ = DUK_ASC_BACKSLASH; - } - *q++ = (duk_uint8_t) c; - - c_prev = c; - } - - DUK_BW_SETPTR_AND_COMPACT(thr, bw, q); - (void) duk_buffer_to_string(thr, -1); /* Safe if input is safe. */ - - /* [ ... escaped_source ] */ -} - -/* - * Exposed regexp compilation primitive. - * - * Sets up a regexp compilation context, and calls duk__parse_disjunction() to do the - * actual parsing. Handles generation of the compiled regexp header and the - * "boilerplate" capture of the matching substring (save 0 and 1). Also does some - * global level regexp checks after recursive compilation has finished. - * - * An escaped version of the regexp source, suitable for use as a RegExp instance - * 'source' property (see E5 Section 15.10.3), is also left on the stack. - * - * Input stack: [ pattern flags ] - * Output stack: [ bytecode escaped_source ] (both as strings) - */ - -DUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) { - duk_re_compiler_ctx re_ctx; - duk_lexer_point lex_point; - duk_hstring *h_pattern; - duk_hstring *h_flags; - duk__re_disjunction_info ign_disj; - - DUK_ASSERT(thr != NULL); - - /* - * Args validation - */ - - /* TypeError if fails */ - h_pattern = duk_require_hstring_notsymbol(thr, -2); - h_flags = duk_require_hstring_notsymbol(thr, -1); - - /* - * Create normalized 'source' property (E5 Section 15.10.3). - */ - - /* [ ... pattern flags ] */ - - duk__create_escaped_source(thr, -2); - - /* [ ... pattern flags escaped_source ] */ - - /* - * Init compilation context - */ - - /* [ ... pattern flags escaped_source buffer ] */ - - DUK_MEMZERO(&re_ctx, sizeof(re_ctx)); - DUK_LEXER_INITCTX(&re_ctx.lex); /* duplicate zeroing, expect for (possible) NULL inits */ - re_ctx.thr = thr; - re_ctx.lex.thr = thr; - re_ctx.lex.input = DUK_HSTRING_GET_DATA(h_pattern); - re_ctx.lex.input_length = DUK_HSTRING_GET_BYTELEN(h_pattern); - re_ctx.lex.token_limit = DUK_RE_COMPILE_TOKEN_LIMIT; - re_ctx.recursion_limit = DUK_USE_REGEXP_COMPILER_RECLIMIT; - re_ctx.re_flags = duk__parse_regexp_flags(thr, h_flags); - - DUK_BW_INIT_PUSHBUF(thr, &re_ctx.bw, DUK__RE_INITIAL_BUFSIZE); - - DUK_DD(DUK_DDPRINT("regexp compiler ctx initialized, flags=0x%08lx, recursion_limit=%ld", - (unsigned long) re_ctx.re_flags, (long) re_ctx.recursion_limit)); - - /* - * Init lexer - */ - - lex_point.offset = 0; /* expensive init, just want to fill window */ - lex_point.line = 1; - DUK_LEXER_SETPOINT(&re_ctx.lex, &lex_point); - - /* - * Compilation - */ - - DUK_DD(DUK_DDPRINT("starting regexp compilation")); - - duk__append_reop(&re_ctx, DUK_REOP_SAVE); - duk__append_7bit(&re_ctx, 0); - duk__parse_disjunction(&re_ctx, 1 /*expect_eof*/, &ign_disj); - duk__append_reop(&re_ctx, DUK_REOP_SAVE); - duk__append_7bit(&re_ctx, 1); - duk__append_reop(&re_ctx, DUK_REOP_MATCH); - - /* - * Check for invalid backreferences; note that it is NOT an error - * to back-reference a capture group which has not yet been introduced - * in the pattern (as in /\1(foo)/); in fact, the backreference will - * always match! It IS an error to back-reference a capture group - * which will never be introduced in the pattern. Thus, we can check - * for such references only after parsing is complete. - */ - - if (re_ctx.highest_backref > re_ctx.captures) { - DUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BACKREFS); - } - - /* - * Emit compiled regexp header: flags, ncaptures - * (insertion order inverted on purpose) - */ - - duk__insert_u32(&re_ctx, 0, (re_ctx.captures + 1) * 2); - duk__insert_u32(&re_ctx, 0, re_ctx.re_flags); - - /* [ ... pattern flags escaped_source buffer ] */ - - DUK_BW_COMPACT(thr, &re_ctx.bw); - (void) duk_buffer_to_string(thr, -1); /* Safe because flags is at most 7 bit. */ - - /* [ ... pattern flags escaped_source bytecode ] */ - - /* - * Finalize stack - */ - - duk_remove(thr, -4); /* -> [ ... flags escaped_source bytecode ] */ - duk_remove(thr, -3); /* -> [ ... escaped_source bytecode ] */ - - DUK_DD(DUK_DDPRINT("regexp compilation successful, bytecode: %!T, escaped source: %!T", - (duk_tval *) duk_get_tval(thr, -1), (duk_tval *) duk_get_tval(thr, -2))); -} - -/* - * Create a RegExp instance (E5 Section 15.10.7). - * - * Note: the output stack left by duk_regexp_compile() is directly compatible - * with the input here. - * - * Input stack: [ escaped_source bytecode ] (both as strings) - * Output stack: [ RegExp ] - */ - -DUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) { - duk_hobject *h; - - /* [ ... escaped_source bytecode ] */ - - duk_push_object(thr); - h = duk_known_hobject(thr, -1); - duk_insert(thr, -3); - - /* [ ... regexp_object escaped_source bytecode ] */ - - DUK_HOBJECT_SET_CLASS_NUMBER(h, DUK_HOBJECT_CLASS_REGEXP); - DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]); - - duk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE); - - /* [ ... regexp_object escaped_source ] */ - - /* In ES2015 .source, and the .global, .multiline, etc flags are - * inherited getters. Store the escaped source as an internal - * property for the getter. - */ - - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE); - - /* [ ... regexp_object ] */ - - duk_push_int(thr, 0); - duk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W); - - /* [ ... regexp_object ] */ -} - -#else /* DUK_USE_REGEXP_SUPPORT */ - -/* regexp support disabled */ - -#endif /* DUK_USE_REGEXP_SUPPORT */ - -/* automatic undefs */ -#undef DUK__RE_BUFLEN -#undef DUK__RE_INITIAL_BUFSIZE -#line 1 "duk_regexp_executor.c" -/* - * Regexp executor. - * - * Safety: the Ecmascript executor should prevent user from reading and - * replacing regexp bytecode. Even so, the executor must validate all - * memory accesses etc. When an invalid access is detected (e.g. a 'save' - * opcode to invalid, unallocated index) it should fail with an internal - * error but not cause a segmentation fault. - * - * Notes: - * - * - Backtrack counts are limited to unsigned 32 bits but should - * technically be duk_size_t for strings longer than 4G chars. - * This also requires a regexp bytecode change. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_REGEXP_SUPPORT) - -/* - * Helpers for UTF-8 handling - * - * For bytecode readers the duk_uint32_t and duk_int32_t types are correct - * because they're used for more than just codepoints. - */ - -DUK_LOCAL duk_uint32_t duk__bc_get_u32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) { - return (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end); -} - -DUK_LOCAL duk_int32_t duk__bc_get_i32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) { - duk_uint32_t t; - - /* signed integer encoding needed to work with UTF-8 */ - t = (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end); - if (t & 1) { - return -((duk_int32_t) (t >> 1)); - } else { - return (duk_int32_t) (t >> 1); - } -} - -DUK_LOCAL const duk_uint8_t *duk__utf8_backtrack(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) { - const duk_uint8_t *p; - - /* Note: allow backtracking from p == ptr_end */ - p = *ptr; - if (p < ptr_start || p > ptr_end) { - goto fail; - } - - while (count > 0) { - for (;;) { - p--; - if (p < ptr_start) { - goto fail; - } - if ((*p & 0xc0) != 0x80) { - /* utf-8 continuation bytes have the form 10xx xxxx */ - break; - } - } - count--; - } - *ptr = p; - return p; - - fail: - DUK_ERROR_INTERNAL(thr); - return NULL; /* never here */ -} - -DUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) { - const duk_uint8_t *p; - - p = *ptr; - if (p < ptr_start || p >= ptr_end) { - goto fail; - } - - while (count > 0) { - for (;;) { - p++; - - /* Note: if encoding ends by hitting end of input, we don't check that - * the encoding is valid, we just assume it is. - */ - if (p >= ptr_end || ((*p & 0xc0) != 0x80)) { - /* utf-8 continuation bytes have the form 10xx xxxx */ - break; - } - } - count--; - } - - *ptr = p; - return p; - - fail: - DUK_ERROR_INTERNAL(thr); - return NULL; /* never here */ -} - -/* - * Helpers for dealing with the input string - */ - -/* Get a (possibly canonicalized) input character from current sp. The input - * itself is never modified, and captures always record non-canonicalized - * characters even in case-insensitive matching. Return <0 if out of input. - */ -DUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp) { - duk_codepoint_t res; - - if (*sp >= re_ctx->input_end) { - return -1; - } - res = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end); - if (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) { - res = duk_unicode_re_canonicalize_char(re_ctx->thr, res); - } - return res; -} - -DUK_LOCAL const duk_uint8_t *duk__inp_backtrack(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp, duk_uint_fast32_t count) { - return duk__utf8_backtrack(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end, count); -} - -/* Backtrack utf-8 input and return a (possibly canonicalized) input character. */ -DUK_LOCAL duk_codepoint_t duk__inp_get_prev_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *sp) { - /* note: caller 'sp' is intentionally not updated here */ - (void) duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) 1); - return duk__inp_get_cp(re_ctx, &sp); -} - -/* - * Regexp recursive matching function. - * - * Returns 'sp' on successful match (points to character after last matched one), - * NULL otherwise. - * - * The C recursion depth limit check is only performed in this function, this - * suffices because the function is present in all true recursion required by - * regexp execution. - */ - -DUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *pc, const duk_uint8_t *sp) { - if (re_ctx->recursion_depth >= re_ctx->recursion_limit) { - DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT); - } - re_ctx->recursion_depth++; - - for (;;) { - duk_small_int_t op; - - if (re_ctx->steps_count >= re_ctx->steps_limit) { - DUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT); - } - re_ctx->steps_count++; - - /* Opcodes are at most 7 bits now so they encode to one byte. If this - * were not the case or 'pc' is invalid here (due to a bug etc) we'll - * still fail safely through the switch default case. - */ - DUK_ASSERT(pc[0] <= 0x7fU); -#if 0 - op = (duk_small_int_t) duk__bc_get_u32(re_ctx, &pc); -#endif - op = *pc++; - - DUK_DDD(DUK_DDDPRINT("match: rec=%ld, steps=%ld, pc (after op)=%ld, sp=%ld, op=%ld", - (long) re_ctx->recursion_depth, - (long) re_ctx->steps_count, - (long) (pc - re_ctx->bytecode), - (long) (sp - re_ctx->input), - (long) op)); - - switch (op) { - case DUK_REOP_MATCH: { - goto match; - } - case DUK_REOP_CHAR: { - /* - * Byte-based matching would be possible for case-sensitive - * matching but not for case-insensitive matching. So, we - * match by decoding the input and bytecode character normally. - * - * Bytecode characters are assumed to be already canonicalized. - * Input characters are canonicalized automatically by - * duk__inp_get_cp() if necessary. - * - * There is no opcode for matching multiple characters. The - * regexp compiler has trouble joining strings efficiently - * during compilation. See doc/regexp.rst for more discussion. - */ - duk_codepoint_t c1, c2; - - c1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); - DUK_ASSERT(!(re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) || - c1 == duk_unicode_re_canonicalize_char(re_ctx->thr, c1)); /* canonicalized by compiler */ - c2 = duk__inp_get_cp(re_ctx, &sp); - /* No need to check for c2 < 0 (end of input): because c1 >= 0, it - * will fail the match below automatically and cause goto fail. - */ -#if 0 - if (c2 < 0) { - goto fail; - } -#endif - DUK_ASSERT(c1 >= 0); - - DUK_DDD(DUK_DDDPRINT("char match, c1=%ld, c2=%ld", (long) c1, (long) c2)); - if (c1 != c2) { - goto fail; - } - break; - } - case DUK_REOP_PERIOD: { - duk_codepoint_t c; - - c = duk__inp_get_cp(re_ctx, &sp); - if (c < 0 || duk_unicode_is_line_terminator(c)) { - /* E5 Sections 15.10.2.8, 7.3 */ - goto fail; - } - break; - } - case DUK_REOP_RANGES: - case DUK_REOP_INVRANGES: { - duk_uint32_t n; - duk_codepoint_t c; - duk_small_int_t match; - - n = duk__bc_get_u32(re_ctx, &pc); - c = duk__inp_get_cp(re_ctx, &sp); - if (c < 0) { - goto fail; - } - - match = 0; - while (n) { - duk_codepoint_t r1, r2; - r1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); - r2 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc); - DUK_DDD(DUK_DDDPRINT("matching ranges/invranges, n=%ld, r1=%ld, r2=%ld, c=%ld", - (long) n, (long) r1, (long) r2, (long) c)); - if (c >= r1 && c <= r2) { - /* Note: don't bail out early, we must read all the ranges from - * bytecode. Another option is to skip them efficiently after - * breaking out of here. Prefer smallest code. - */ - match = 1; - } - n--; - } - - if (op == DUK_REOP_RANGES) { - if (!match) { - goto fail; - } - } else { - DUK_ASSERT(op == DUK_REOP_INVRANGES); - if (match) { - goto fail; - } - } - break; - } - case DUK_REOP_ASSERT_START: { - duk_codepoint_t c; - - if (sp <= re_ctx->input) { - break; - } - if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) { - goto fail; - } - c = duk__inp_get_prev_cp(re_ctx, sp); - if (duk_unicode_is_line_terminator(c)) { - /* E5 Sections 15.10.2.8, 7.3 */ - break; - } - goto fail; - } - case DUK_REOP_ASSERT_END: { - duk_codepoint_t c; - const duk_uint8_t *tmp_sp; - - tmp_sp = sp; - c = duk__inp_get_cp(re_ctx, &tmp_sp); - if (c < 0) { - break; - } - if (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) { - goto fail; - } - if (duk_unicode_is_line_terminator(c)) { - /* E5 Sections 15.10.2.8, 7.3 */ - break; - } - goto fail; - } - case DUK_REOP_ASSERT_WORD_BOUNDARY: - case DUK_REOP_ASSERT_NOT_WORD_BOUNDARY: { - /* - * E5 Section 15.10.2.6. The previous and current character - * should -not- be canonicalized as they are now. However, - * canonicalization does not affect the result of IsWordChar() - * (which depends on Unicode characters never canonicalizing - * into ASCII characters) so this does not matter. - */ - duk_small_int_t w1, w2; - - if (sp <= re_ctx->input) { - w1 = 0; /* not a wordchar */ - } else { - duk_codepoint_t c; - c = duk__inp_get_prev_cp(re_ctx, sp); - w1 = duk_unicode_re_is_wordchar(c); - } - if (sp >= re_ctx->input_end) { - w2 = 0; /* not a wordchar */ - } else { - const duk_uint8_t *tmp_sp = sp; /* dummy so sp won't get updated */ - duk_codepoint_t c; - c = duk__inp_get_cp(re_ctx, &tmp_sp); - w2 = duk_unicode_re_is_wordchar(c); - } - - if (op == DUK_REOP_ASSERT_WORD_BOUNDARY) { - if (w1 == w2) { - goto fail; - } - } else { - DUK_ASSERT(op == DUK_REOP_ASSERT_NOT_WORD_BOUNDARY); - if (w1 != w2) { - goto fail; - } - } - break; - } - case DUK_REOP_JUMP: { - duk_int32_t skip; - - skip = duk__bc_get_i32(re_ctx, &pc); - pc += skip; - break; - } - case DUK_REOP_SPLIT1: { - /* split1: prefer direct execution (no jump) */ - const duk_uint8_t *sub_sp; - duk_int32_t skip; - - skip = duk__bc_get_i32(re_ctx, &pc); - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (sub_sp) { - sp = sub_sp; - goto match; - } - pc += skip; - break; - } - case DUK_REOP_SPLIT2: { - /* split2: prefer jump execution (not direct) */ - const duk_uint8_t *sub_sp; - duk_int32_t skip; - - skip = duk__bc_get_i32(re_ctx, &pc); - sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); - if (sub_sp) { - sp = sub_sp; - goto match; - } - break; - } - case DUK_REOP_SQMINIMAL: { - duk_uint32_t q, qmin, qmax; - duk_int32_t skip; - const duk_uint8_t *sub_sp; - - qmin = duk__bc_get_u32(re_ctx, &pc); - qmax = duk__bc_get_u32(re_ctx, &pc); - skip = duk__bc_get_i32(re_ctx, &pc); - DUK_DDD(DUK_DDDPRINT("minimal quantifier, qmin=%lu, qmax=%lu, skip=%ld", - (unsigned long) qmin, (unsigned long) qmax, (long) skip)); - - q = 0; - while (q <= qmax) { - if (q >= qmin) { - sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); - if (sub_sp) { - sp = sub_sp; - goto match; - } - } - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (!sub_sp) { - break; - } - sp = sub_sp; - q++; - } - goto fail; - } - case DUK_REOP_SQGREEDY: { - duk_uint32_t q, qmin, qmax, atomlen; - duk_int32_t skip; - const duk_uint8_t *sub_sp; - - qmin = duk__bc_get_u32(re_ctx, &pc); - qmax = duk__bc_get_u32(re_ctx, &pc); - atomlen = duk__bc_get_u32(re_ctx, &pc); - skip = duk__bc_get_i32(re_ctx, &pc); - DUK_DDD(DUK_DDDPRINT("greedy quantifier, qmin=%lu, qmax=%lu, atomlen=%lu, skip=%ld", - (unsigned long) qmin, (unsigned long) qmax, (unsigned long) atomlen, (long) skip)); - - q = 0; - while (q < qmax) { - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (!sub_sp) { - break; - } - sp = sub_sp; - q++; - } - while (q >= qmin) { - sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); - if (sub_sp) { - sp = sub_sp; - goto match; - } - if (q == qmin) { - break; - } - - /* Note: if atom were to contain e.g. captures, we would need to - * re-match the atom to get correct captures. Simply quantifiers - * do not allow captures in their atom now, so this is not an issue. - */ - - DUK_DDD(DUK_DDDPRINT("greedy quantifier, backtrack %ld characters (atomlen)", - (long) atomlen)); - sp = duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) atomlen); - q--; - } - goto fail; - } - case DUK_REOP_SAVE: { - duk_uint32_t idx; - const duk_uint8_t *old; - const duk_uint8_t *sub_sp; - - idx = duk__bc_get_u32(re_ctx, &pc); - if (idx >= re_ctx->nsaved) { - /* idx is unsigned, < 0 check is not necessary */ - DUK_D(DUK_DPRINT("internal error, regexp save index insane: idx=%ld", (long) idx)); - goto internal_error; - } - old = re_ctx->saved[idx]; - re_ctx->saved[idx] = sp; - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (sub_sp) { - sp = sub_sp; - goto match; - } - re_ctx->saved[idx] = old; - goto fail; - } - case DUK_REOP_WIPERANGE: { - /* Wipe capture range and save old values for backtracking. - * - * XXX: this typically happens with a relatively small idx_count. - * It might be useful to handle cases where the count is small - * (say <= 8) by saving the values in stack instead. This would - * reduce memory churn and improve performance, at the cost of a - * slightly higher code footprint. - */ - duk_uint32_t idx_start, idx_count; -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - duk_uint32_t idx_end, idx; -#endif - duk_uint8_t **range_save; - const duk_uint8_t *sub_sp; - - idx_start = duk__bc_get_u32(re_ctx, &pc); - idx_count = duk__bc_get_u32(re_ctx, &pc); - DUK_DDD(DUK_DDDPRINT("wipe saved range: start=%ld, count=%ld -> [%ld,%ld] (captures [%ld,%ld])", - (long) idx_start, (long) idx_count, - (long) idx_start, (long) (idx_start + idx_count - 1), - (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); - if (idx_start + idx_count > re_ctx->nsaved || idx_count == 0) { - /* idx is unsigned, < 0 check is not necessary */ - DUK_D(DUK_DPRINT("internal error, regexp wipe indices insane: idx_start=%ld, idx_count=%ld", - (long) idx_start, (long) idx_count)); - goto internal_error; - } - DUK_ASSERT(idx_count > 0); - - duk_require_stack(re_ctx->thr, 1); - range_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr, - sizeof(duk_uint8_t *) * idx_count); - DUK_ASSERT(range_save != NULL); - DUK_MEMCPY(range_save, re_ctx->saved + idx_start, sizeof(duk_uint8_t *) * idx_count); -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - idx_end = idx_start + idx_count; - for (idx = idx_start; idx < idx_end; idx++) { - re_ctx->saved[idx] = NULL; - } -#else - DUK_MEMZERO((void *) (re_ctx->saved + idx_start), sizeof(duk_uint8_t *) * idx_count); -#endif - - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (sub_sp) { - /* match: keep wiped/resaved values */ - DUK_DDD(DUK_DDDPRINT("match: keep wiped/resaved values [%ld,%ld] (captures [%ld,%ld])", - (long) idx_start, (long) (idx_start + idx_count - 1), - (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); - duk_pop_unsafe(re_ctx->thr); - sp = sub_sp; - goto match; - } - - /* fail: restore saves */ - DUK_DDD(DUK_DDDPRINT("fail: restore wiped/resaved values [%ld,%ld] (captures [%ld,%ld])", - (long) idx_start, (long) (idx_start + idx_count - 1), - (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2))); - DUK_MEMCPY((void *) (re_ctx->saved + idx_start), - (const void *) range_save, - sizeof(duk_uint8_t *) * idx_count); - duk_pop_unsafe(re_ctx->thr); - goto fail; - } - case DUK_REOP_LOOKPOS: - case DUK_REOP_LOOKNEG: { - /* - * Needs a save of multiple saved[] entries depending on what range - * may be overwritten. Because the regexp parser does no such analysis, - * we currently save the entire saved array here. Lookaheads are thus - * a bit expensive. Note that the saved array is not needed for just - * the lookahead sub-match, but for the matching of the entire sequel. - * - * The temporary save buffer is pushed on to the valstack to handle - * errors correctly. Each lookahead causes a C recursion and pushes - * more stuff on the value stack. If the C recursion limit is less - * than the value stack slack, there is no need to check the stack. - * We do so regardless, just in case. - */ - - duk_int32_t skip; - duk_uint8_t **full_save; - const duk_uint8_t *sub_sp; - - DUK_ASSERT(re_ctx->nsaved > 0); - - duk_require_stack(re_ctx->thr, 1); - full_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr, - sizeof(duk_uint8_t *) * re_ctx->nsaved); - DUK_ASSERT(full_save != NULL); - DUK_MEMCPY(full_save, re_ctx->saved, sizeof(duk_uint8_t *) * re_ctx->nsaved); - - skip = duk__bc_get_i32(re_ctx, &pc); - sub_sp = duk__match_regexp(re_ctx, pc, sp); - if (op == DUK_REOP_LOOKPOS) { - if (!sub_sp) { - goto lookahead_fail; - } - } else { - if (sub_sp) { - goto lookahead_fail; - } - } - sub_sp = duk__match_regexp(re_ctx, pc + skip, sp); - if (sub_sp) { - /* match: keep saves */ - duk_pop_unsafe(re_ctx->thr); - sp = sub_sp; - goto match; - } - - /* fall through */ - - lookahead_fail: - /* fail: restore saves */ - DUK_MEMCPY((void *) re_ctx->saved, - (const void *) full_save, - sizeof(duk_uint8_t *) * re_ctx->nsaved); - duk_pop_unsafe(re_ctx->thr); - goto fail; - } - case DUK_REOP_BACKREFERENCE: { - /* - * Byte matching for back-references would be OK in case- - * sensitive matching. In case-insensitive matching we need - * to canonicalize characters, so back-reference matching needs - * to be done with codepoints instead. So, we just decode - * everything normally here, too. - * - * Note: back-reference index which is 0 or higher than - * NCapturingParens (= number of capturing parens in the - * -entire- regexp) is a compile time error. However, a - * backreference referring to a valid capture which has - * not matched anything always succeeds! See E5 Section - * 15.10.2.9, step 5, sub-step 3. - */ - duk_uint32_t idx; - const duk_uint8_t *p; - - idx = duk__bc_get_u32(re_ctx, &pc); - idx = idx << 1; /* backref n -> saved indices [n*2, n*2+1] */ - if (idx < 2 || idx + 1 >= re_ctx->nsaved) { - /* regexp compiler should catch these */ - DUK_D(DUK_DPRINT("internal error, backreference index insane")); - goto internal_error; - } - if (!re_ctx->saved[idx] || !re_ctx->saved[idx+1]) { - /* capture is 'undefined', always matches! */ - DUK_DDD(DUK_DDDPRINT("backreference: saved[%ld,%ld] not complete, always match", - (long) idx, (long) (idx + 1))); - break; - } - DUK_DDD(DUK_DDDPRINT("backreference: match saved[%ld,%ld]", (long) idx, (long) (idx + 1))); - - p = re_ctx->saved[idx]; - while (p < re_ctx->saved[idx+1]) { - duk_codepoint_t c1, c2; - - /* Note: not necessary to check p against re_ctx->input_end: - * the memory access is checked by duk__inp_get_cp(), while - * valid compiled regexps cannot write a saved[] entry - * which points to outside the string. - */ - c1 = duk__inp_get_cp(re_ctx, &p); - DUK_ASSERT(c1 >= 0); - c2 = duk__inp_get_cp(re_ctx, &sp); - /* No need for an explicit c2 < 0 check: because c1 >= 0, - * the comparison will always fail if c2 < 0. - */ -#if 0 - if (c2 < 0) { - goto fail; - } -#endif - if (c1 != c2) { - goto fail; - } - } - break; - } - default: { - DUK_D(DUK_DPRINT("internal error, regexp opcode error: %ld", (long) op)); - goto internal_error; - } - } - } - - match: - re_ctx->recursion_depth--; - return sp; - - fail: - re_ctx->recursion_depth--; - return NULL; - - internal_error: - DUK_ERROR_INTERNAL(re_ctx->thr); - return NULL; /* never here */ -} - -/* - * Exposed matcher function which provides the semantics of RegExp.prototype.exec(). - * - * RegExp.prototype.test() has the same semantics as exec() but does not return the - * result object (which contains the matching string and capture groups). Currently - * there is no separate test() helper, so a temporary result object is created and - * discarded if test() is needed. This is intentional, to save code space. - * - * Input stack: [ ... re_obj input ] - * Output stack: [ ... result ] - */ - -DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_global) { - duk_re_matcher_ctx re_ctx; - duk_hobject *h_regexp; - duk_hstring *h_bytecode; - duk_hstring *h_input; - duk_uint8_t *p_buf; - const duk_uint8_t *pc; - const duk_uint8_t *sp; - duk_small_int_t match = 0; - duk_small_int_t global; - duk_uint_fast32_t i; - double d; - duk_uint32_t char_offset; - - DUK_ASSERT(thr != NULL); - - DUK_DD(DUK_DDPRINT("regexp match: regexp=%!T, input=%!T", - (duk_tval *) duk_get_tval(thr, -2), - (duk_tval *) duk_get_tval(thr, -1))); - - /* - * Regexp instance check, bytecode check, input coercion. - * - * See E5 Section 15.10.6. - */ - - /* TypeError if wrong; class check, see E5 Section 15.10.6 */ - h_regexp = duk_require_hobject_with_class(thr, -2, DUK_HOBJECT_CLASS_REGEXP); - DUK_ASSERT(h_regexp != NULL); - DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_regexp) == DUK_HOBJECT_CLASS_REGEXP); - DUK_UNREF(h_regexp); - - h_input = duk_to_hstring(thr, -1); - DUK_ASSERT(h_input != NULL); - - duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_INT_BYTECODE); /* [ ... re_obj input ] -> [ ... re_obj input bc ] */ - h_bytecode = duk_require_hstring(thr, -1); /* no regexp instance should exist without a non-configurable bytecode property */ - DUK_ASSERT(h_bytecode != NULL); - - /* - * Basic context initialization. - * - * Some init values are read from the bytecode header - * whose format is (UTF-8 codepoints): - * - * uint flags - * uint nsaved (even, 2n+2 where n = num captures) - */ - - /* [ ... re_obj input bc ] */ - - DUK_MEMZERO(&re_ctx, sizeof(re_ctx)); - - re_ctx.thr = thr; - re_ctx.input = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); - re_ctx.input_end = re_ctx.input + DUK_HSTRING_GET_BYTELEN(h_input); - re_ctx.bytecode = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_bytecode); - re_ctx.bytecode_end = re_ctx.bytecode + DUK_HSTRING_GET_BYTELEN(h_bytecode); - re_ctx.saved = NULL; - re_ctx.recursion_limit = DUK_USE_REGEXP_EXECUTOR_RECLIMIT; - re_ctx.steps_limit = DUK_RE_EXECUTE_STEPS_LIMIT; - - /* read header */ - pc = re_ctx.bytecode; - re_ctx.re_flags = duk__bc_get_u32(&re_ctx, &pc); - re_ctx.nsaved = duk__bc_get_u32(&re_ctx, &pc); - re_ctx.bytecode = pc; - - DUK_ASSERT(DUK_RE_FLAG_GLOBAL < 0x10000UL); /* must fit into duk_small_int_t */ - global = (duk_small_int_t) (force_global | (duk_small_int_t) (re_ctx.re_flags & DUK_RE_FLAG_GLOBAL)); - - DUK_ASSERT(re_ctx.nsaved >= 2); - DUK_ASSERT((re_ctx.nsaved % 2) == 0); - - p_buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, sizeof(duk_uint8_t *) * re_ctx.nsaved); /* rely on zeroing */ - DUK_UNREF(p_buf); - re_ctx.saved = (const duk_uint8_t **) duk_get_buffer(thr, -1, NULL); - DUK_ASSERT(re_ctx.saved != NULL); - - /* [ ... re_obj input bc saved_buf ] */ - -#if defined(DUK_USE_EXPLICIT_NULL_INIT) - for (i = 0; i < re_ctx.nsaved; i++) { - re_ctx.saved[i] = (duk_uint8_t *) NULL; - } -#elif defined(DUK_USE_ZERO_BUFFER_DATA) - /* buffer is automatically zeroed */ -#else - DUK_MEMZERO((void *) p_buf, sizeof(duk_uint8_t *) * re_ctx.nsaved); -#endif - - DUK_DDD(DUK_DDDPRINT("regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld", - (unsigned long) re_ctx.re_flags, (long) re_ctx.nsaved, (long) re_ctx.recursion_limit, - (long) re_ctx.steps_limit)); - - /* - * Get starting character offset for match, and initialize 'sp' based on it. - * - * Note: lastIndex is non-configurable so it must be present (we check the - * internal class of the object above, so we know it is). User code can set - * its value to an arbitrary (garbage) value though; E5 requires that lastIndex - * be coerced to a number before using. The code below works even if the - * property is missing: the value will then be coerced to zero. - * - * Note: lastIndex may be outside Uint32 range even after ToInteger() coercion. - * For instance, ToInteger(+Infinity) = +Infinity. We track the match offset - * as an integer, but pre-check it to be inside the 32-bit range before the loop. - * If not, the check in E5 Section 15.10.6.2, step 9.a applies. - */ - - /* XXX: lastIndex handling produces a lot of asm */ - - /* [ ... re_obj input bc saved_buf ] */ - - duk_get_prop_stridx_short(thr, -4, DUK_STRIDX_LAST_INDEX); /* -> [ ... re_obj input bc saved_buf lastIndex ] */ - (void) duk_to_int(thr, -1); /* ToInteger(lastIndex) */ - d = duk_get_number(thr, -1); /* integer, but may be +/- Infinite, +/- zero (not NaN, though) */ - duk_pop_nodecref_unsafe(thr); - - if (global) { - if (d < 0.0 || d > (double) DUK_HSTRING_GET_CHARLEN(h_input)) { - /* match fail */ - char_offset = 0; /* not really necessary */ - DUK_ASSERT(match == 0); - goto match_over; - } - char_offset = (duk_uint32_t) d; - } else { - /* lastIndex must be ignored for non-global regexps, but get the - * value for (theoretical) side effects. No side effects can - * really occur, because lastIndex is a normal property and is - * always non-configurable for RegExp instances. - */ - char_offset = (duk_uint32_t) 0; - } - - DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input)); - sp = re_ctx.input + duk_heap_strcache_offset_char2byte(thr, h_input, char_offset); - - /* - * Match loop. - * - * Try matching at different offsets until match found or input exhausted. - */ - - /* [ ... re_obj input bc saved_buf ] */ - - DUK_ASSERT(match == 0); - - for (;;) { - /* char offset in [0, h_input->clen] (both ends inclusive), checked before entry */ - DUK_ASSERT_DISABLE(char_offset >= 0); - DUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input)); - - /* Note: re_ctx.steps is intentionally not reset, it applies to the entire unanchored match */ - DUK_ASSERT(re_ctx.recursion_depth == 0); - - DUK_DDD(DUK_DDDPRINT("attempt match at char offset %ld; %p [%p,%p]", - (long) char_offset, (const void *) sp, - (const void *) re_ctx.input, (const void *) re_ctx.input_end)); - - /* - * Note: - * - * - duk__match_regexp() is required not to longjmp() in ordinary "non-match" - * conditions; a longjmp() will terminate the entire matching process. - * - * - Clearing saved[] is not necessary because backtracking does it - * - * - Backtracking also rewinds re_ctx.recursion back to zero, unless an - * internal/limit error occurs (which causes a longjmp()) - * - * - If we supported anchored matches, we would break out here - * unconditionally; however, Ecmascript regexps don't have anchored - * matches. It might make sense to implement a fast bail-out if - * the regexp begins with '^' and sp is not 0: currently we'll just - * run through the entire input string, trivially failing the match - * at every non-zero offset. - */ - - if (duk__match_regexp(&re_ctx, re_ctx.bytecode, sp) != NULL) { - DUK_DDD(DUK_DDDPRINT("match at offset %ld", (long) char_offset)); - match = 1; - break; - } - - /* advance by one character (code point) and one char_offset */ - char_offset++; - if (char_offset > DUK_HSTRING_GET_CHARLEN(h_input)) { - /* - * Note: - * - * - Intentionally attempt (empty) match at char_offset == k_input->clen - * - * - Negative char_offsets have been eliminated and char_offset is duk_uint32_t - * -> no need or use for a negative check - */ - - DUK_DDD(DUK_DDDPRINT("no match after trying all sp offsets")); - break; - } - - /* avoid calling at end of input, will DUK_ERROR (above check suffices to avoid this) */ - (void) duk__utf8_advance(thr, &sp, re_ctx.input, re_ctx.input_end, (duk_uint_fast32_t) 1); - } - - match_over: - - /* - * Matching complete, create result array or return a 'null'. Update lastIndex - * if necessary. See E5 Section 15.10.6.2. - * - * Because lastIndex is a character (not byte) offset, we need the character - * length of the match which we conveniently get as a side effect of interning - * the matching substring (0th index of result array). - * - * saved[0] start pointer (~ byte offset) of current match - * saved[1] end pointer (~ byte offset) of current match (exclusive) - * char_offset start character offset of current match (-> .index of result) - * char_end_offset end character offset (computed below) - */ - - /* [ ... re_obj input bc saved_buf ] */ - - if (match) { -#if defined(DUK_USE_ASSERTIONS) - duk_hobject *h_res; -#endif - duk_uint32_t char_end_offset = 0; - - DUK_DDD(DUK_DDDPRINT("regexp matches at char_offset %ld", (long) char_offset)); - - DUK_ASSERT(re_ctx.nsaved >= 2); /* must have start and end */ - DUK_ASSERT((re_ctx.nsaved % 2) == 0); /* and even number */ - - /* XXX: Array size is known before and (2 * re_ctx.nsaved) but not taken - * advantage of now. The array is not compacted either, as regexp match - * objects are usually short lived. - */ - - duk_push_array(thr); - -#if defined(DUK_USE_ASSERTIONS) - h_res = duk_require_hobject(thr, -1); - DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_res)); - DUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h_res)); - DUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_res) == DUK_HOBJECT_CLASS_ARRAY); -#endif - - /* [ ... re_obj input bc saved_buf res_obj ] */ - - duk_push_u32(thr, char_offset); - duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INDEX); - - duk_dup_m4(thr); - duk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INPUT); - - for (i = 0; i < re_ctx.nsaved; i += 2) { - /* Captures which are undefined have NULL pointers and are returned - * as 'undefined'. The same is done when saved[] pointers are insane - * (this should, of course, never happen in practice). - */ - if (re_ctx.saved[i] && re_ctx.saved[i + 1] && re_ctx.saved[i + 1] >= re_ctx.saved[i]) { - duk_push_lstring(thr, - (const char *) re_ctx.saved[i], - (duk_size_t) (re_ctx.saved[i+1] - re_ctx.saved[i])); - if (i == 0) { - /* Assumes that saved[0] and saved[1] are always - * set by regexp bytecode (if not, char_end_offset - * will be zero). Also assumes clen reflects the - * correct char length. - */ - char_end_offset = char_offset + (duk_uint32_t) duk_get_length(thr, -1); /* add charlen */ - } - } else { - duk_push_undefined(thr); - } - - /* [ ... re_obj input bc saved_buf res_obj val ] */ - duk_put_prop_index(thr, -2, (duk_uarridx_t) (i / 2)); - } - - /* [ ... re_obj input bc saved_buf res_obj ] */ - - /* NB: 'length' property is automatically updated by the array setup loop */ - - if (global) { - /* global regexp: lastIndex updated on match */ - duk_push_u32(thr, char_end_offset); - duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX); - } else { - /* non-global regexp: lastIndex never updated on match */ - ; - } - } else { - /* - * No match, E5 Section 15.10.6.2, step 9.a.i - 9.a.ii apply, regardless - * of 'global' flag of the RegExp. In particular, if lastIndex is invalid - * initially, it is reset to zero. - */ - - DUK_DDD(DUK_DDDPRINT("regexp does not match")); - - duk_push_null(thr); - - /* [ ... re_obj input bc saved_buf res_obj ] */ - - duk_push_int(thr, 0); - duk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX); - } - - /* [ ... re_obj input bc saved_buf res_obj ] */ - - duk_insert(thr, -5); - - /* [ ... res_obj re_obj input bc saved_buf ] */ - - duk_pop_n_unsafe(thr, 4); - - /* [ ... res_obj ] */ - - /* XXX: these last tricks are unnecessary if the function is made - * a genuine native function. - */ -} - -DUK_INTERNAL void duk_regexp_match(duk_hthread *thr) { - duk__regexp_match_helper(thr, 0 /*force_global*/); -} - -/* This variant is needed by String.prototype.split(); it needs to perform - * global-style matching on a cloned RegExp which is potentially non-global. - */ -DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) { - duk__regexp_match_helper(thr, 1 /*force_global*/); -} - -#else /* DUK_USE_REGEXP_SUPPORT */ - -/* regexp support disabled */ - -#endif /* DUK_USE_REGEXP_SUPPORT */ -#line 1 "duk_selftest.c" -/* - * Self tests to ensure execution environment is sane. Intended to catch - * compiler/platform problems which cannot be detected at compile time. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_SELF_TESTS) - -/* - * Unions and structs for self tests - */ - -typedef union { - double d; - duk_uint8_t x[8]; -} duk__test_double_union; - -/* Self test failed. Expects a local variable 'error_count' to exist. */ -#define DUK__FAILED(msg) do { \ - DUK_D(DUK_DPRINT("self test failed: " #msg " at " DUK_FILE_MACRO ":" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO))); \ - error_count++; \ - } while (0) - -#define DUK__DBLUNION_CMP_TRUE(a,b) do { \ - if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \ - DUK__FAILED("double union compares false (expected true)"); \ - } \ - } while (0) - -#define DUK__DBLUNION_CMP_FALSE(a,b) do { \ - if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \ - DUK__FAILED("double union compares true (expected false)"); \ - } \ - } while (0) - -typedef union { - duk_uint32_t i; - duk_uint8_t x[8]; -} duk__test_u32_union; - -#if defined(DUK_USE_INTEGER_LE) -#define DUK__U32_INIT(u, a, b, c, d) do { \ - (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ - } while (0) -#elif defined(DUK_USE_INTEGER_ME) -#error integer mixed endian not supported now -#elif defined(DUK_USE_INTEGER_BE) -#define DUK__U32_INIT(u, a, b, c, d) do { \ - (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ - } while (0) -#else -#error unknown integer endianness -#endif - -#if defined(DUK_USE_DOUBLE_LE) -#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ - (u)->x[0] = (h); (u)->x[1] = (g); (u)->x[2] = (f); (u)->x[3] = (e); \ - (u)->x[4] = (d); (u)->x[5] = (c); (u)->x[6] = (b); (u)->x[7] = (a); \ - } while (0) -#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ - ((u)->x[0] == (h) && (u)->x[1] == (g) && (u)->x[2] == (f) && (u)->x[3] == (e) && \ - (u)->x[4] == (d) && (u)->x[5] == (c) && (u)->x[6] == (b) && (u)->x[7] == (a)) -#elif defined(DUK_USE_DOUBLE_ME) -#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ - (u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \ - (u)->x[4] = (h); (u)->x[5] = (g); (u)->x[6] = (f); (u)->x[7] = (e); \ - } while (0) -#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ - ((u)->x[0] == (d) && (u)->x[1] == (c) && (u)->x[2] == (b) && (u)->x[3] == (a) && \ - (u)->x[4] == (h) && (u)->x[5] == (g) && (u)->x[6] == (f) && (u)->x[7] == (e)) -#elif defined(DUK_USE_DOUBLE_BE) -#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \ - (u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \ - (u)->x[4] = (e); (u)->x[5] = (f); (u)->x[6] = (g); (u)->x[7] = (h); \ - } while (0) -#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \ - ((u)->x[0] == (a) && (u)->x[1] == (b) && (u)->x[2] == (c) && (u)->x[3] == (d) && \ - (u)->x[4] == (e) && (u)->x[5] == (f) && (u)->x[6] == (g) && (u)->x[7] == (h)) -#else -#error unknown double endianness -#endif - -/* - * Various sanity checks for typing - */ - -DUK_LOCAL duk_uint_t duk__selftest_types(void) { - duk_uint_t error_count = 0; - - if (!(sizeof(duk_int8_t) == 1 && - sizeof(duk_uint8_t) == 1 && - sizeof(duk_int16_t) == 2 && - sizeof(duk_uint16_t) == 2 && - sizeof(duk_int32_t) == 4 && - sizeof(duk_uint32_t) == 4)) { - DUK__FAILED("duk_(u)int{8,16,32}_t size"); - } -#if defined(DUK_USE_64BIT_OPS) - if (!(sizeof(duk_int64_t) == 8 && - sizeof(duk_uint64_t) == 8)) { - DUK__FAILED("duk_(u)int64_t size"); - } -#endif - - if (!(sizeof(duk_size_t) >= sizeof(duk_uint_t))) { - /* Some internal code now assumes that all duk_uint_t values - * can be expressed with a duk_size_t. - */ - DUK__FAILED("duk_size_t is smaller than duk_uint_t"); - } - if (!(sizeof(duk_int_t) >= 4)) { - DUK__FAILED("duk_int_t is not 32 bits"); - } - - return error_count; -} - -/* - * Packed tval sanity - */ - -DUK_LOCAL duk_uint_t duk__selftest_packed_tval(void) { - duk_uint_t error_count = 0; - -#if defined(DUK_USE_PACKED_TVAL) - if (sizeof(void *) > 4) { - DUK__FAILED("packed duk_tval in use but sizeof(void *) > 4"); - } -#endif - - return error_count; -} - -/* - * Two's complement arithmetic. - */ - -DUK_LOCAL duk_uint_t duk__selftest_twos_complement(void) { - duk_uint_t error_count = 0; - volatile int test; - test = -1; - - /* Note that byte order doesn't affect this test: all bytes in - * 'test' will be 0xFF for two's complement. - */ - if (((volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) { - DUK__FAILED("two's complement arithmetic"); - } - - return error_count; -} - -/* - * Byte order. Important to self check, because on some exotic platforms - * there is no actual detection but rather assumption based on platform - * defines. - */ - -DUK_LOCAL duk_uint_t duk__selftest_byte_order(void) { - duk_uint_t error_count = 0; - duk__test_u32_union u1; - duk__test_double_union u2; - - /* - * >>> struct.pack('>d', 102030405060).encode('hex') - * '4237c17c6dc40000' - */ - - DUK__U32_INIT(&u1, 0xde, 0xad, 0xbe, 0xef); - DUK__DOUBLE_INIT(&u2, 0x42, 0x37, 0xc1, 0x7c, 0x6d, 0xc4, 0x00, 0x00); - - if (u1.i != (duk_uint32_t) 0xdeadbeefUL) { - DUK__FAILED("duk_uint32_t byte order"); - } - - if (u2.d != (double) 102030405060.0) { - DUK__FAILED("double byte order"); - } - - return error_count; -} - -/* - * DUK_BSWAP macros - */ - -DUK_LOCAL duk_uint_t duk__selftest_bswap_macros(void) { - duk_uint_t error_count = 0; - duk_uint32_t x32; - duk_uint16_t x16; - duk_double_union du; - duk_double_t du_diff; - - x16 = 0xbeefUL; - x16 = DUK_BSWAP16(x16); - if (x16 != (duk_uint16_t) 0xefbeUL) { - DUK__FAILED("DUK_BSWAP16"); - } - - x32 = 0xdeadbeefUL; - x32 = DUK_BSWAP32(x32); - if (x32 != (duk_uint32_t) 0xefbeaddeUL) { - DUK__FAILED("DUK_BSWAP32"); - } - - /* >>> struct.unpack('>d', '4000112233445566'.decode('hex')) - * (2.008366013071895,) - */ - - du.uc[0] = 0x40; du.uc[1] = 0x00; du.uc[2] = 0x11; du.uc[3] = 0x22; - du.uc[4] = 0x33; du.uc[5] = 0x44; du.uc[6] = 0x55; du.uc[7] = 0x66; - DUK_DBLUNION_DOUBLE_NTOH(&du); - du_diff = du.d - 2.008366013071895; -#if 0 - DUK_D(DUK_DPRINT("du_diff: %lg\n", (double) du_diff)); -#endif - if (du_diff > 1e-15) { - /* Allow very small lenience because some compilers won't parse - * exact IEEE double constants (happened in matrix testing with - * Linux gcc-4.8 -m32 at least). - */ -#if 0 - DUK_D(DUK_DPRINT("Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n", - (unsigned int) du.uc[0], (unsigned int) du.uc[1], - (unsigned int) du.uc[2], (unsigned int) du.uc[3], - (unsigned int) du.uc[4], (unsigned int) du.uc[5], - (unsigned int) du.uc[6], (unsigned int) du.uc[7])); -#endif - DUK__FAILED("DUK_DBLUNION_DOUBLE_NTOH"); - } - - return error_count; -} - -/* - * Basic double / byte union memory layout. - */ - -DUK_LOCAL duk_uint_t duk__selftest_double_union_size(void) { - duk_uint_t error_count = 0; - - if (sizeof(duk__test_double_union) != 8) { - DUK__FAILED("invalid union size"); - } - - return error_count; -} - -/* - * Union aliasing, see misc/clang_aliasing.c. - */ - -DUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) { - /* This testcase fails when Emscripten-generated code runs on Firefox. - * It's not an issue because the failure should only affect packed - * duk_tval representation, which is not used with Emscripten. - */ -#if defined(DUK_USE_PACKED_TVAL) - duk_uint_t error_count = 0; - duk__test_double_union a, b; - - /* Test signaling NaN and alias assignment in all endianness combinations. - */ - - /* little endian */ - a.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44; - a.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff; - b = a; - DUK__DBLUNION_CMP_TRUE(&a, &b); - - /* big endian */ - a.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00; - a.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11; - b = a; - DUK__DBLUNION_CMP_TRUE(&a, &b); - - /* mixed endian */ - a.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff; - a.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44; - b = a; - DUK__DBLUNION_CMP_TRUE(&a, &b); - - return error_count; -#else - DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed")); - return 0; -#endif -} - -/* - * Zero sign, see misc/tcc_zerosign2.c. - */ - -DUK_LOCAL duk_uint_t duk__selftest_double_zero_sign(void) { - duk_uint_t error_count = 0; - duk__test_double_union a, b; - - a.d = 0.0; - b.d = -a.d; - DUK__DBLUNION_CMP_FALSE(&a, &b); - - return error_count; -} - -/* - * Rounding mode: Duktape assumes round-to-nearest, check that this is true. - * If we had C99 fenv.h we could check that fegetround() == FE_TONEAREST, - * but we don't want to rely on that header; and even if we did, it's good - * to ensure the rounding actually works. - */ - -DUK_LOCAL duk_uint_t duk__selftest_double_rounding(void) { - duk_uint_t error_count = 0; - duk__test_double_union a, b, c; - -#if 0 - /* Include and test manually; these trigger failures: */ - fesetround(FE_UPWARD); - fesetround(FE_DOWNWARD); - fesetround(FE_TOWARDZERO); - - /* This is the default and passes. */ - fesetround(FE_TONEAREST); -#endif - - /* Rounding tests check that none of the other modes (round to - * +Inf, round to -Inf, round to zero) can be active: - * http://www.gnu.org/software/libc/manual/html_node/Rounding.html - */ - - /* 1.0 + 2^(-53): result is midway between 1.0 and 1.0 + ulp. - * Round to nearest: 1.0 - * Round to +Inf: 1.0 + ulp - * Round to -Inf: 1.0 - * Round to zero: 1.0 - * => Correct result eliminates round to +Inf. - */ - DUK__DOUBLE_INIT(&a, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - DUK_MEMSET((void *) &c, 0, sizeof(c)); - c.d = a.d + b.d; - if (!DUK__DOUBLE_COMPARE(&c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) { - DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", - (unsigned int) c.x[0], (unsigned int) c.x[1], - (unsigned int) c.x[2], (unsigned int) c.x[3], - (unsigned int) c.x[4], (unsigned int) c.x[5], - (unsigned int) c.x[6], (unsigned int) c.x[7])); - DUK__FAILED("invalid result from 1.0 + 0.5ulp"); - } - - /* (1.0 + ulp) + 2^(-53): result is midway between 1.0 + ulp and 1.0 + 2*ulp. - * Round to nearest: 1.0 + 2*ulp (round to even mantissa) - * Round to +Inf: 1.0 + 2*ulp - * Round to -Inf: 1.0 + ulp - * Round to zero: 1.0 + ulp - * => Correct result eliminates round to -Inf and round to zero. - */ - DUK__DOUBLE_INIT(&a, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01); - DUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); - DUK_MEMSET((void *) &c, 0, sizeof(c)); - c.d = a.d + b.d; - if (!DUK__DOUBLE_COMPARE(&c, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02)) { - DUK_D(DUK_DPRINT("broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x", - (unsigned int) c.x[0], (unsigned int) c.x[1], - (unsigned int) c.x[2], (unsigned int) c.x[3], - (unsigned int) c.x[4], (unsigned int) c.x[5], - (unsigned int) c.x[6], (unsigned int) c.x[7])); - DUK__FAILED("invalid result from (1.0 + ulp) + 0.5ulp"); - } - - /* Could do negative number testing too, but the tests above should - * differentiate between IEEE 754 rounding modes. - */ - return error_count; -} - -/* - * fmod(): often a portability issue in embedded or bare platform targets. - * Check for at least minimally correct behavior. Unlike some other math - * functions (like cos()) Duktape relies on fmod() internally too. - */ - -DUK_LOCAL duk_uint_t duk__selftest_fmod(void) { - duk_uint_t error_count = 0; - duk__test_double_union u1, u2; - volatile duk_double_t t1, t2, t3; - - /* fmod() with integer argument and exponent 2^32 is used by e.g. - * ToUint32() and some Duktape internals. - */ - u1.d = DUK_FMOD(10.0, 4294967296.0); - u2.d = 10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - u1.d = DUK_FMOD(4294967306.0, 4294967296.0); - u2.d = 10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - u1.d = DUK_FMOD(73014444042.0, 4294967296.0); - u2.d = 10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - /* 52-bit integer split into two parts: - * >>> 0x1fedcba9876543 - * 8987183256397123 - * >>> float(0x1fedcba9876543) / float(2**53) - * 0.9977777777777778 - */ - u1.d = DUK_FMOD(8987183256397123.0, 4294967296.0); - u2.d = (duk_double_t) 0xa9876543UL; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - t1 = 8987183256397123.0; - t2 = 4294967296.0; - t3 = t1 / t2; - u1.d = DUK_FLOOR(t3); - u2.d = (duk_double_t) 0x1fedcbUL; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - /* C99 behavior is for fmod() result sign to mathc argument sign. */ - u1.d = DUK_FMOD(-10.0, 4294967296.0); - u2.d = -10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - u1.d = DUK_FMOD(-4294967306.0, 4294967296.0); - u2.d = -10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - u1.d = DUK_FMOD(-73014444042.0, 4294967296.0); - u2.d = -10.0; - DUK__DBLUNION_CMP_TRUE(&u1, &u2); - - return error_count; -} - -/* - * Struct size/alignment if platform requires it - * - * There are some compiler specific struct padding pragmas etc in use, this - * selftest ensures they're correctly detected and used. - */ - -DUK_LOCAL duk_uint_t duk__selftest_struct_align(void) { - duk_uint_t error_count = 0; - -#if (DUK_USE_ALIGN_BY == 4) - if ((sizeof(duk_hbuffer_fixed) % 4) != 0) { - DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 4"); - } -#elif (DUK_USE_ALIGN_BY == 8) - if ((sizeof(duk_hbuffer_fixed) % 8) != 0) { - DUK__FAILED("sizeof(duk_hbuffer_fixed) not aligned to 8"); - } -#elif (DUK_USE_ALIGN_BY == 1) - /* no check */ -#else -#error invalid DUK_USE_ALIGN_BY -#endif - return error_count; -} - -/* - * 64-bit arithmetic - * - * There are some platforms/compilers where 64-bit types are available - * but don't work correctly. Test for known cases. - */ - -DUK_LOCAL duk_uint_t duk__selftest_64bit_arithmetic(void) { - duk_uint_t error_count = 0; -#if defined(DUK_USE_64BIT_OPS) - volatile duk_int64_t i; - volatile duk_double_t d; - - /* Catch a double-to-int64 cast issue encountered in practice. */ - d = 2147483648.0; - i = (duk_int64_t) d; - if (i != DUK_I64_CONSTANT(0x80000000)) { - DUK__FAILED("casting 2147483648.0 to duk_int64_t failed"); - } -#else - /* nop */ -#endif - return error_count; -} - -/* - * Casting - */ - -DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_small_uint(void) { - /* - * https://github.com/svaarala/duktape/issues/127#issuecomment-77863473 - */ - - duk_uint_t error_count = 0; - - duk_double_t d1, d2; - duk_small_uint_t u; - - duk_double_t d1v, d2v; - duk_small_uint_t uv; - - /* Test without volatiles */ - - d1 = 1.0; - u = (duk_small_uint_t) d1; - d2 = (duk_double_t) u; - - if (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) { - DUK__FAILED("double to duk_small_uint_t cast failed"); - } - - /* Same test with volatiles */ - - d1v = 1.0; - uv = (duk_small_uint_t) d1v; - d2v = (duk_double_t) uv; - - if (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) { - DUK__FAILED("double to duk_small_uint_t cast failed"); - } - - return error_count; -} - -DUK_LOCAL duk_uint_t duk__selftest_cast_double_to_uint32(void) { - /* - * This test fails on an exotic ARM target; double-to-uint - * cast is incorrectly clamped to -signed- int highest value. - * - * https://github.com/svaarala/duktape/issues/336 - */ - - duk_uint_t error_count = 0; - duk_double_t dv; - duk_uint32_t uv; - - dv = 3735928559.0; /* 0xdeadbeef in decimal */ - uv = (duk_uint32_t) dv; - - if (uv != 0xdeadbeefUL) { - DUK__FAILED("double to duk_uint32_t cast failed"); - } - - return error_count; -} - -/* - * Minimal test of user supplied allocation functions - * - * - Basic alloc + realloc + free cycle - * - * - Realloc to significantly larger size to (hopefully) trigger a - * relocation and check that relocation copying works - */ - -DUK_LOCAL duk_uint_t duk__selftest_alloc_funcs(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *udata) { - duk_uint_t error_count = 0; - void *ptr; - void *new_ptr; - duk_small_int_t i, j; - unsigned char x; - - if (alloc_func == NULL || realloc_func == NULL || free_func == NULL) { - return 0; - } - - for (i = 1; i <= 256; i++) { - ptr = alloc_func(udata, (duk_size_t) i); - if (ptr == NULL) { - DUK_D(DUK_DPRINT("alloc failed, ignore")); - continue; /* alloc failed, ignore */ - } - for (j = 0; j < i; j++) { - ((unsigned char *) ptr)[j] = (unsigned char) (0x80 + j); - } - new_ptr = realloc_func(udata, ptr, 1024); - if (new_ptr == NULL) { - DUK_D(DUK_DPRINT("realloc failed, ignore")); - free_func(udata, ptr); - continue; /* realloc failed, ignore */ - } - ptr = new_ptr; - for (j = 0; j < i; j++) { - x = ((unsigned char *) ptr)[j]; - if (x != (unsigned char) (0x80 + j)) { - DUK_D(DUK_DPRINT("byte at index %ld doesn't match after realloc: %02lx", - (long) j, (unsigned long) x)); - DUK__FAILED("byte compare after realloc"); - break; - } - } - free_func(udata, ptr); - } - - return error_count; -} - -/* - * Self test main - */ - -DUK_INTERNAL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *udata) { - duk_uint_t error_count = 0; - - DUK_D(DUK_DPRINT("self test starting")); - - error_count += duk__selftest_types(); - error_count += duk__selftest_packed_tval(); - error_count += duk__selftest_twos_complement(); - error_count += duk__selftest_byte_order(); - error_count += duk__selftest_bswap_macros(); - error_count += duk__selftest_double_union_size(); - error_count += duk__selftest_double_aliasing(); - error_count += duk__selftest_double_zero_sign(); - error_count += duk__selftest_double_rounding(); - error_count += duk__selftest_fmod(); - error_count += duk__selftest_struct_align(); - error_count += duk__selftest_64bit_arithmetic(); - error_count += duk__selftest_cast_double_to_small_uint(); - error_count += duk__selftest_cast_double_to_uint32(); - error_count += duk__selftest_alloc_funcs(alloc_func, realloc_func, free_func, udata); - - DUK_D(DUK_DPRINT("self test complete, total error count: %ld", (long) error_count)); - - return error_count; -} - -#endif /* DUK_USE_SELF_TESTS */ - -/* automatic undefs */ -#undef DUK__DBLUNION_CMP_FALSE -#undef DUK__DBLUNION_CMP_TRUE -#undef DUK__DOUBLE_COMPARE -#undef DUK__DOUBLE_INIT -#undef DUK__FAILED -#undef DUK__U32_INIT -/* #include duk_internal.h -> already included */ -#line 2 "duk_tval.c" - -#if defined(DUK_USE_FASTINT) - -/* - * Manually optimized double-to-fastint downgrade check. - * - * This check has a large impact on performance, especially for fastint - * slow paths, so must be changed carefully. The code should probably be - * optimized for the case where the result does not fit into a fastint, - * to minimize the penalty for "slow path code" dealing with fractions etc. - * - * At least on one tested soft float ARM platform double-to-int64 coercion - * is very slow (and sometimes produces incorrect results, see self tests). - * This algorithm combines a fastint compatibility check and extracting the - * integer value from an IEEE double for setting the tagged fastint. For - * other platforms a more naive approach might be better. - * - * See doc/fastint.rst for details. - */ - -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x) { - duk_double_union du; - duk_int64_t i; - duk_small_int_t expt; - duk_small_int_t shift; - - /* XXX: optimize for packed duk_tval directly? */ - - du.d = x; - i = (duk_int64_t) DUK_DBLUNION_GET_INT64(&du); - expt = (duk_small_int_t) ((i >> 52) & 0x07ff); - shift = expt - 1023; - - if (shift >= 0 && shift <= 46) { /* exponents 1023 to 1069 */ - duk_int64_t t; - - if (((DUK_I64_CONSTANT(0x000fffffffffffff) >> shift) & i) == 0) { - t = i | DUK_I64_CONSTANT(0x0010000000000000); /* implicit leading one */ - t = t & DUK_I64_CONSTANT(0x001fffffffffffff); - t = t >> (52 - shift); - if (i < 0) { - t = -t; - } - DUK_TVAL_SET_FASTINT(tv, t); - return; - } - } else if (shift == -1023) { /* exponent 0 */ - if (i >= 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) { - /* Note: reject negative zero. */ - DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) 0); - return; - } - } else if (shift == 47) { /* exponent 1070 */ - if (i < 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) { - DUK_TVAL_SET_FASTINT(tv, (duk_int64_t) DUK_FASTINT_MIN); - return; - } - } - - DUK_TVAL_SET_DOUBLE(tv, x); - return; -} - -DUK_INTERNAL DUK_NOINLINE void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x) { - duk_tval_set_number_chkfast_fast(tv, x); -} - -/* - * Manually optimized number-to-double conversion - */ - -#if defined(DUK_USE_FASTINT) && defined(DUK_USE_PACKED_TVAL) -DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_packed(duk_tval *tv) { - duk_double_union du; - duk_uint64_t t; - - t = (duk_uint64_t) DUK_DBLUNION_GET_UINT64(tv); - if ((t >> 48) != DUK_TAG_FASTINT) { - return tv->d; - } else if (t & DUK_U64_CONSTANT(0x0000800000000000)) { - t = (duk_uint64_t) (-((duk_int64_t) t)); /* avoid unary minus on unsigned */ - t = t & DUK_U64_CONSTANT(0x0000ffffffffffff); /* negative */ - t |= DUK_U64_CONSTANT(0xc330000000000000); - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d + 4503599627370496.0; /* 1 << 52 */ - } else if (t != 0) { - t &= DUK_U64_CONSTANT(0x0000ffffffffffff); /* positive */ - t |= DUK_U64_CONSTANT(0x4330000000000000); - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d - 4503599627370496.0; /* 1 << 52 */ - } else { - return 0.0; /* zero */ - } -} -#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ - -#if 0 /* unused */ -#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL) -DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked(duk_tval *tv) { - duk_double_union du; - duk_uint64_t t; - - DUK_ASSERT(tv->t == DUK_TAG_NUMBER || tv->t == DUK_TAG_FASTINT); - - if (tv->t == DUK_TAG_FASTINT) { - if (tv->v.fi >= 0) { - t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi; - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d - 4503599627370496.0; /* 1 << 52 */ - } else { - t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi); - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d + 4503599627370496.0; /* 1 << 52 */ - } - } else { - return tv->v.d; - } -} -#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ -#endif /* 0 */ - -#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL) -DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv) { - duk_double_union du; - duk_uint64_t t; - - DUK_ASSERT(tv->t == DUK_TAG_FASTINT); - - if (tv->v.fi >= 0) { - t = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi; - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d - 4503599627370496.0; /* 1 << 52 */ - } else { - t = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi); - DUK_DBLUNION_SET_UINT64(&du, t); - return du.d + 4503599627370496.0; /* 1 << 52 */ - } -} -#endif /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */ - -#endif /* DUK_USE_FASTINT */ -#line 1 "duk_unicode_tables.c" -/* - * Unicode support tables automatically generated during build. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Unicode tables containing ranges of Unicode characters in a - * packed format. These tables are used to match non-ASCII - * characters of complex productions by resorting to a linear - * range-by-range comparison. This is very slow, but is expected - * to be very rare in practical Ecmascript source code, and thus - * compactness is most important. - * - * The tables are matched using uni_range_match() and the format - * is described in tools/extract_chars.py. - */ - -#if defined(DUK_USE_SOURCE_NONBMP) -/* IdentifierStart production with ASCII excluded */ -/* duk_unicode_ids_noa[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_ids_noa[1036] = { -249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, -2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, -21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, -101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, -240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, -2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, -47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, -38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, -41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, -34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, -85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, -63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, -240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, -15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, -240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, -43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, -15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, -112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, -29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, -146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, -224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, -253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, -35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, -240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, -240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, -95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, -207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, -207,73,69,53,53,50,241,91,47,10,47,3,33,46,61,241,79,107,243,127,37,255, -223,13,79,33,242,31,16,240,47,11,111,22,191,14,63,20,87,36,241,207,142,240, -79,20,95,20,95,24,159,36,248,239,254,2,154,240,107,127,138,83,2,241,194,20, -3,240,123,240,122,240,255,51,240,50,27,240,107,240,175,56,242,135,31,50,15, -1,50,34,240,191,30,240,212,240,223,21,114,240,207,13,242,107,240,107,240, -62,240,47,96,243,159,41,242,62,242,63,254,32,79,37,243,223,29,241,47,9,240, -207,20,241,191,19,64,223,32,240,3,240,112,32,241,95,2,47,9,244,102,32,35, -46,41,143,31,241,135,49,63,6,38,33,36,64,240,64,212,249,15,37,240,67,242, -127,32,240,97,32,250,175,31,241,179,241,111,32,240,96,242,223,27,244,127, -10,255,224,122,243,15,17,15,254,11,79,41,255,152,47,21,240,48,242,63,14, -255,226,100,255,226,140,245,143,95,240,63,180,255,233,176,255,227,33,255, -238,197,255,225,57,255,240,1,10,223,254,18,184,240,255,99,240,239,4,242,15, -2,63,17,240,86,240,63,254,38,79,53,192,243,76,243,32,241,31,255,0,6,223, -240,95,254,30,95,255,0,20,1,31,254,175,47,91,108,72,137,255,240,0,101,175, -69,47,55,33,48,49,51,43,32,38,47,49,35,55,38,47,12,35,36,32,70,47,254,4,99, -240,146,240,146,240,242,240,146,240,242,240,146,240,242,240,146,240,242, -240,146,127,254,242,143,181,242,223,52,255,227,176,50,240,178,18,3,2,146, -50,2,7,5,2,2,2,34,18,3,2,2,2,2,2,18,3,50,98,50,50,2,146,240,22,34,66,240, -31,255,0,0,56,255,240,9,92,159,27,255,239,39,207,206,63,255,0,5,116,255, -240,1,133,47,254,17,0, -}; -#else -/* IdentifierStart production with ASCII and non-BMP excluded */ -/* duk_unicode_ids_noabmp[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_ids_noabmp[625] = { -249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34, -2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191, -21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240, -101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19, -240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47, -2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18, -47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12, -38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6, -41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98, -34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2, -85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35, -63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227, -240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5, -15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40, -240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27, -43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47, -15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68, -112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52, -29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12, -146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255, -224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63, -253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34, -35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31, -240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32, -240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7, -95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245, -207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10, -207,73,69,53,53,50,0, -}; -#endif - -#if defined(DUK_USE_SOURCE_NONBMP) -/* IdentifierStart production with Letter and ASCII excluded */ -/* duk_unicode_ids_m_let_noa[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_ids_m_let_noa[42] = { -255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89, -249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,240, -}; -#else -/* IdentifierStart production with Letter, ASCII, and non-BMP excluded */ -/* duk_unicode_ids_m_let_noabmp[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_ids_m_let_noabmp[24] = { -255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89, -249,0, -}; -#endif - -#if defined(DUK_USE_SOURCE_NONBMP) -/* IdentifierPart production with IdentifierStart and ASCII excluded */ -/* duk_unicode_idp_m_ids_noa[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_idp_m_ids_noa[530] = { -255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, -245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, -36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, -160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, -97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, -240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, -242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, -244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, -111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, -241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, -244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, -241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, -35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, -255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, -79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, -208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, -225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,15,254,27,16,253,64, -248,116,255,224,25,159,254,68,178,33,99,241,162,80,249,113,255,228,13,47, -39,239,17,159,1,63,31,175,39,151,47,22,210,159,37,13,47,34,218,36,159,68, -183,15,146,182,151,63,42,2,99,19,42,11,19,100,79,178,240,42,159,72,240,77, -159,199,99,143,13,31,68,240,31,1,159,67,201,159,69,229,159,254,9,169,255, -226,57,114,127,2,159,42,240,98,223,255,0,60,157,159,120,79,45,111,11,159, -254,46,191,30,240,35,255,240,3,191,225,255,240,0,59,164,69,151,54,241,3, -248,98,255,228,125,242,47,254,15,79,39,95,34,144,240,0,240,132,46,255,228, -68,98,240,19,98,18,79,254,121,150,245,246,105,255,240,192,105,175,224,0, -}; -#else -/* IdentifierPart production with IdentifierStart, ASCII, and non-BMP excluded */ -/* duk_unicode_idp_m_ids_noabmp[] */ -/* - * Automatically generated by extract_chars.py, do not edit! - */ - -const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357] = { -255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112, -245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34, -36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50, -160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240, -97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9, -240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50, -242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41, -244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245, -111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241, -241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242, -244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57, -241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31, -35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31, -255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242, -79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29, -208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3, -225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,0, -}; -#endif - -/* - * Case conversion tables generated using tools/extract_caseconv.py. - */ - -/* duk_unicode_caseconv_uc[] */ -/* duk_unicode_caseconv_lc[] */ - -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -const duk_uint8_t duk_unicode_caseconv_uc[1386] = { -144,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162, -128,108,65,1,189,129,254,131,3,173,3,136,6,7,98,7,34,68,15,12,14,140,72,30, -104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,9,252,9,248,6,28,131,4, -33,4,62,0,62,16,32,124,64,124,96,48,249,0,249,64,129,243,1,243,129,3,232,3, -233,1,135,216,7,218,4,15,184,15,221,2,31,114,31,200,8,62,236,63,180,8,125, -224,127,224,16,251,208,255,80,33,247,193,255,160,67,246,3,247,0,135,244,7, -246,1,15,240,15,244,2,33,112,33,96,32,73,160,73,108,104,176,192,176,1,121, -104,0,133,2,106,183,1,58,10,31,232,63,228,38,162,1,1,1,0,48,2,102,2,100,12, -4,232,4,228,64,10,88,10,81,112,23,160,23,144,96,48,96,48,64,128,104,64,104, -1,128,218,0,217,130,1,206,1,205,16,3,190,3,188,36,7,228,7,224,160,17,24,17, -16,144,36,112,36,96,160,110,32,110,0,128,246,64,246,6,2,48,130,48,17,4,139, -4,138,54,9,132,9,130,28,19,68,19,65,128,240,8,240,4,177,234,17,234,6,3,234, -35,235,33,11,26,11,25,193,150,64,150,64,50,44,236,44,235,5,76,131,76,128, -94,154,6,154,0,117,57,29,57,16,122,115,58,115,35,244,239,84,239,32,169,223, -233,223,130,211,200,211,200,2,167,151,167,150,21,79,107,79,104,8,112,26, -208,26,192,64,56,160,56,128,192,113,128,113,1,128,249,0,248,130,2,128,1, -166,4,7,240,7,238,8,177,204,177,200,16,96,49,0,48,224,128,110,64,110,1,1, -51,83,213,2,0,48,35,192,35,176,64,77,32,50,192,139,73,196,49,193,127,48,2, -212,14,112,3,252,5,224,4,196,1,36,5,252,1,76,6,0,9,12,6,72,6,68,6,84,7,216, -6,100,6,96,6,104,8,244,6,120,8,128,6,160,6,156,6,252,7,220,7,116,6,56,7, -204,7,196,9,64,177,188,9,68,177,180,9,72,177,192,9,76,6,4,9,80,6,24,9,100, -6,60,9,108,6,64,9,114,158,172,9,128,6,76,9,134,158,176,9,140,6,80,9,150, -158,52,9,160,6,92,9,172,177,136,9,178,158,180,9,196,177,184,9,200,6,116,9, -212,6,124,9,244,177,144,10,30,158,196,10,32,6,184,10,36,9,16,10,48,9,20,10, -72,6,220,10,118,158,200,10,122,158,192,13,20,14,100,13,220,13,216,14,176, -14,24,15,8,14,140,15,48,14,48,15,64,14,72,15,68,14,96,15,84,14,152,15,88, -14,128,15,92,15,60,15,192,14,104,15,196,14,132,15,200,15,228,15,204,13,252, -15,212,14,84,19,60,19,0,114,0,16,72,114,4,16,80,114,8,16,120,114,20,16,136, -114,24,16,168,114,28,17,136,114,34,153,40,117,230,157,244,117,244,177,140, -122,108,121,128,126,248,14,100,127,148,127,176,133,56,132,200,134,16,134, -12,177,132,177,128,177,148,8,232,177,152,8,248,179,204,179,202,158,50,158, -46,173,78,158,207,48,6,252,0,166,0,166,2,147,1,94,0,39,0,248,64,9,64,97, -128,114,24,28,200,24,64,24,8,29,134,7,74,6,16,6,2,11,15,2,154,130,169,15, -75,64,9,0,102,35,210,240,2,160,24,64,244,196,0,174,6,20,61,51,0,44,129,133, -15,77,64,8,32,87,195,234,16,29,40,24,152,250,150,7,74,6,38,6,0,62,169,129, -210,129,137,129,128,143,171,96,116,160,98,96,104,67,240,16,248,64,28,200, -252,12,62,18,7,50,63,5,15,133,1,204,143,193,195,225,96,115,35,240,144,248, -96,28,200,252,44,62,26,7,50,63,13,15,135,1,204,143,195,195,225,224,115,35, -241,16,248,64,28,200,252,76,62,18,7,50,63,21,15,133,1,204,143,197,195,225, -96,115,35,241,144,248,96,28,200,252,108,62,26,7,50,63,29,15,135,1,204,143, -199,195,225,224,115,35,242,16,249,64,28,200,252,140,62,82,7,50,63,37,15, -149,1,204,143,201,195,229,96,115,35,242,144,249,96,28,200,252,172,62,90,7, -50,63,45,15,151,1,204,143,203,195,229,224,115,35,243,16,249,64,28,200,252, -204,62,82,7,50,63,53,15,149,1,204,143,205,195,229,96,115,35,243,144,249,96, -28,200,252,236,62,90,7,50,63,61,15,151,1,204,143,207,195,229,224,115,35, -244,16,251,64,28,200,253,12,62,210,7,50,63,69,15,181,1,204,143,209,195,237, -96,115,35,244,144,251,96,28,200,253,44,62,218,7,50,63,77,15,183,1,204,143, -211,195,237,224,115,35,245,16,251,64,28,200,253,76,62,210,7,50,63,85,15, -181,1,204,143,213,195,237,96,115,35,245,144,251,96,28,200,253,108,62,218,7, -50,63,93,15,183,1,204,143,215,195,237,224,115,35,246,80,253,208,28,200,253, -156,7,34,7,50,63,105,1,195,1,204,143,219,64,114,32,104,67,246,248,28,136, -26,16,28,200,253,228,7,34,7,50,63,133,15,229,1,204,143,225,192,114,224,115, -35,248,144,28,72,28,200,254,52,7,46,6,132,63,143,129,203,129,161,1,204,143, -230,64,114,224,115,35,250,88,28,200,24,64,24,0,254,158,7,50,6,16,6,2,63, -173,1,204,129,161,15,235,224,115,32,97,0,104,67,252,88,29,40,24,64,24,0, -255,30,7,74,6,16,6,2,63,201,1,208,129,137,143,243,64,116,160,104,67,252, -248,29,40,24,64,26,16,255,148,63,244,7,50,63,231,1,212,129,204,143,250,64, -113,224,115,35,254,208,29,72,26,16,255,190,7,82,6,132,7,50,63,249,1,212, -129,204,253,128,64,8,192,8,223,96,48,2,48,2,79,216,20,0,140,0,153,246,7, -128,35,0,35,0,36,253,130,96,8,192,8,192,9,159,96,176,2,152,2,167,216,52,0, -166,0,169,246,39,2,162,2,163,125,138,64,168,128,166,191,98,176,42,32,41, -223,216,180,10,156,10,141,246,47,2,162,2,158,128, -}; -const duk_uint8_t duk_unicode_caseconv_lc[680] = { -152,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0, -235,65,129,199,1,230,130,3,145,3,177,34,7,70,7,134,36,15,244,13,236,24,32, -0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,9,208,85,184,80,19, -240,19,248,12,62,16,62,0,32,124,96,124,64,48,249,64,249,0,129,243,129,243, -1,3,233,3,232,1,135,218,7,216,4,15,196,15,192,8,31,152,31,144,16,63,80,63, -64,32,126,224,126,192,16,253,208,251,128,33,252,129,247,32,131,251,3,250,0, -135,246,135,221,129,15,244,15,240,2,31,234,31,122,4,63,240,62,240,8,127, -232,125,240,17,11,1,11,129,2,75,98,77,3,69,128,5,134,11,203,31,128,143,193, -127,144,255,160,154,140,4,0,4,4,192,9,144,9,152,48,19,144,19,161,0,41,64, -41,101,192,94,64,94,129,128,193,0,193,130,1,160,1,161,6,3,102,3,104,8,7,44, -7,48,72,14,240,14,248,144,31,32,31,48,64,63,0,63,37,0,136,128,136,196,129, -35,1,35,133,3,112,3,113,4,7,176,7,178,48,17,128,17,132,136,36,80,36,89,176, -76,16,76,32,224,154,0,154,44,7,128,7,128,101,143,80,15,80,176,31,89,31,81, -8,88,206,88,208,12,178,0,178,5,145,103,89,103,96,42,100,10,100,18,244,208, -20,208,35,169,200,169,200,195,211,153,83,153,159,167,121,167,122,5,78,253, -78,254,22,158,66,158,68,21,60,181,60,184,170,123,74,123,80,67,0,211,1,64,2, -1,172,1,173,4,3,136,3,140,12,7,20,7,24,16,31,184,31,192,34,199,34,199,48, -65,128,195,128,196,2,1,184,1,185,5,79,84,4,204,8,0,192,101,128,154,65,1,29, -129,30,2,16,199,45,39,5,251,240,23,128,15,240,24,16,37,48,24,96,37,64,24, -224,29,208,24,240,37,144,25,0,37,176,25,16,25,32,25,48,38,0,25,64,38,48,25, -112,38,128,25,128,25,144,25,208,39,32,25,240,39,80,26,112,26,128,26,224,40, -128,27,112,41,32,31,16,31,48,31,96,25,80,31,112,27,240,34,0,25,224,35,162, -198,80,35,208,25,160,35,226,198,96,36,48,24,0,36,64,40,144,36,80,40,192,55, -96,55,112,55,240,63,48,56,96,58,192,56,192,60,192,60,240,61,112,63,64,59, -128,63,144,63,32,76,0,76,241,233,224,13,241,251,193,251,49,252,193,252,49, -254,193,254,81,255,193,255,50,18,96,60,146,18,160,6,178,18,176,14,82,19,34, -20,226,24,50,24,66,198,2,198,18,198,32,38,178,198,49,215,210,198,64,39,210, -198,208,37,18,198,224,39,18,198,240,37,2,199,0,37,34,207,34,207,58,119,209, -215,154,120,186,120,202,120,208,38,90,122,176,37,202,122,192,38,26,122,208, -38,202,123,0,41,234,123,16,40,122,123,32,41,218,123,58,181,48,32,38,16,3, -72,24,56, -}; - -#if defined(DUK_USE_REGEXP_CANON_WORKAROUND) -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -const duk_uint16_t duk_unicode_re_canon_lookup[65536] = { -0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, -28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52, -53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77, -78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70, -71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125, -126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, -144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, -162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, -180,924,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, -198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, -216,217,218,219,220,221,222,223,192,193,194,195,196,197,198,199,200,201, -202,203,204,205,206,207,208,209,210,211,212,213,214,247,216,217,218,219, -220,221,222,376,256,256,258,258,260,260,262,262,264,264,266,266,268,268, -270,270,272,272,274,274,276,276,278,278,280,280,282,282,284,284,286,286, -288,288,290,290,292,292,294,294,296,296,298,298,300,300,302,302,304,305, -306,306,308,308,310,310,312,313,313,315,315,317,317,319,319,321,321,323, -323,325,325,327,327,329,330,330,332,332,334,334,336,336,338,338,340,340, -342,342,344,344,346,346,348,348,350,350,352,352,354,354,356,356,358,358, -360,360,362,362,364,364,366,366,368,368,370,370,372,372,374,374,376,377, -377,379,379,381,381,383,579,385,386,386,388,388,390,391,391,393,394,395, -395,397,398,399,400,401,401,403,404,502,406,407,408,408,573,411,412,413, -544,415,416,416,418,418,420,420,422,423,423,425,426,427,428,428,430,431, -431,433,434,435,435,437,437,439,440,440,442,443,444,444,446,503,448,449, -450,451,452,452,452,455,455,455,458,458,458,461,461,463,463,465,465,467, -467,469,469,471,471,473,473,475,475,398,478,478,480,480,482,482,484,484, -486,486,488,488,490,490,492,492,494,494,496,497,497,497,500,500,502,503, -504,504,506,506,508,508,510,510,512,512,514,514,516,516,518,518,520,520, -522,522,524,524,526,526,528,528,530,530,532,532,534,534,536,536,538,538, -540,540,542,542,544,545,546,546,548,548,550,550,552,552,554,554,556,556, -558,558,560,560,562,562,564,565,566,567,568,569,570,571,571,573,574,11390, -11391,577,577,579,580,581,582,582,584,584,586,586,588,588,590,590,11375, -11373,11376,385,390,597,393,394,600,399,602,400,42923L,605,606,607,403, -42924L,610,404,612,42893L,42922L,615,407,406,42926L,11362,42925L,621,622, -412,624,11374,413,627,628,415,630,631,632,633,634,635,636,11364,638,639, -422,641,642,425,644,645,646,42929L,430,580,433,434,581,653,654,655,656,657, -439,659,660,661,662,663,664,665,666,667,668,42930L,42928L,671,672,673,674, -675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692, -693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710, -711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728, -729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746, -747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764, -765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782, -783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800, -801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818, -819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836, -921,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854, -855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872, -873,874,875,876,877,878,879,880,880,882,882,884,885,886,886,888,889,890, -1021,1022,1023,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908, -909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926, -927,928,929,930,931,932,933,934,935,936,937,938,939,902,904,905,906,944, -913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931, -931,932,933,934,935,936,937,938,939,908,910,911,975,914,920,978,979,980, -934,928,975,984,984,986,986,988,988,990,990,992,992,994,994,996,996,998, -998,1000,1000,1002,1002,1004,1004,1006,1006,922,929,1017,895,1012,917,1014, -1015,1015,1017,1018,1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029, -1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044, -1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059, -1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042, -1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057, -1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024, -1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039, -1120,1120,1122,1122,1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134, -1134,1136,1136,1138,1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148, -1150,1150,1152,1152,1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164, -1164,1166,1166,1168,1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178, -1180,1180,1182,1182,1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194, -1194,1196,1196,1198,1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208, -1210,1210,1212,1212,1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223, -1225,1225,1227,1227,1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238, -1240,1240,1242,1242,1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254, -1254,1256,1256,1258,1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268, -1270,1270,1272,1272,1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284, -1284,1286,1286,1288,1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298, -1300,1300,1302,1302,1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314, -1314,1316,1316,1318,1318,1320,1320,1322,1322,1324,1324,1326,1326,1328,1329, -1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344, -1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359, -1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374, -1375,1376,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341, -1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356, -1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419, -1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434, -1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449, -1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464, -1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479, -1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494, -1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509, -1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524, -1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539, -1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554, -1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569, -1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584, -1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599, -1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614, -1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629, -1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644, -1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659, -1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674, -1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689, -1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704, -1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719, -1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734, -1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749, -1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764, -1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779, -1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794, -1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809, -1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824, -1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839, -1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854, -1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869, -1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884, -1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899, -1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914, -1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929, -1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944, -1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959, -1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974, -1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989, -1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004, -2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, -2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034, -2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049, -2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064, -2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079, -2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094, -2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109, -2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124, -2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139, -2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154, -2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169, -2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184, -2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199, -2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214, -2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229, -2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244, -2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259, -2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274, -2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289, -2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304, -2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319, -2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334, -2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349, -2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364, -2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379, -2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394, -2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409, -2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424, -2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439, -2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454, -2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469, -2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484, -2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499, -2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514, -2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529, -2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544, -2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559, -2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574, -2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589, -2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604, -2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619, -2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634, -2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649, -2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664, -2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679, -2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694, -2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709, -2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724, -2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739, -2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754, -2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769, -2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784, -2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799, -2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814, -2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829, -2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844, -2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859, -2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874, -2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889, -2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904, -2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919, -2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934, -2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949, -2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964, -2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979, -2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994, -2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009, -3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024, -3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039, -3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054, -3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069, -3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084, -3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099, -3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114, -3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129, -3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144, -3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159, -3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174, -3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189, -3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204, -3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219, -3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234, -3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249, -3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294, -3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309, -3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324, -3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339, -3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354, -3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369, -3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384, -3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399, -3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414, -3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429, -3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444, -3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459, -3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474, -3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489, -3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504, -3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519, -3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534, -3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549, -3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564, -3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579, -3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594, -3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609, -3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624, -3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639, -3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654, -3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669, -3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684, -3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699, -3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714, -3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729, -3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744, -3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759, -3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774, -3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789, -3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804, -3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819, -3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834, -3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849, -3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864, -3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879, -3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894, -3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909, -3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924, -3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939, -3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954, -3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969, -3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984, -3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999, -4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014, -4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029, -4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044, -4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059, -4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074, -4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089, -4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104, -4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119, -4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134, -4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149, -4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164, -4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179, -4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194, -4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209, -4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224, -4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239, -4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254, -4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269, -4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284, -4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299, -4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314, -4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329, -4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344, -4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359, -4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374, -4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389, -4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404, -4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419, -4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434, -4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449, -4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464, -4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479, -4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494, -4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509, -4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524, -4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539, -4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554, -4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569, -4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584, -4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599, -4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614, -4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629, -4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644, -4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659, -4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674, -4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689, -4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704, -4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719, -4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734, -4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749, -4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764, -4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779, -4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794, -4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809, -4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824, -4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839, -4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854, -4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869, -4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884, -4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899, -4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914, -4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929, -4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944, -4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959, -4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974, -4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989, -4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004, -5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019, -5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034, -5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049, -5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064, -5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079, -5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094, -5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109, -5110,5111,5104,5105,5106,5107,5108,5109,5118,5119,5120,5121,5122,5123,5124, -5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139, -5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154, -5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169, -5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184, -5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199, -5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214, -5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229, -5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244, -5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259, -5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274, -5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289, -5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304, -5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319, -5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334, -5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349, -5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364, -5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, -5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394, -5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409, -5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439, -5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454, -5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469, -5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484, -5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499, -5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514, -5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529, -5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544, -5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559, -5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574, -5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589, -5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604, -5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619, -5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634, -5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649, -5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679, -5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694, -5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709, -5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724, -5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739, -5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754, -5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769, -5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784, -5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799, -5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814, -5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829, -5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859, -5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874, -5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919, -5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934, -5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949, -5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964, -5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994, -5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024, -6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054, -6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069, -6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099, -6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114, -6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129, -6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144, -6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159, -6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174, -6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189, -6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204, -6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219, -6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234, -6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249, -6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264, -6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279, -6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294, -6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309, -6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324, -6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339, -6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354, -6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369, -6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384, -6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399, -6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414, -6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429, -6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444, -6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459, -6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, -6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489, -6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504, -6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534, -6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549, -6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564, -6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579, -6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594, -6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609, -6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624, -6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639, -6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654, -6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669, -6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684, -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699, -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714, -6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729, -6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744, -6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759, -6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774, -6775,6776,6777,6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789, -6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804, -6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819, -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834, -6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849, -6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879, -6880,6881,6882,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909, -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924, -6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939, -6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954, -6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969, -6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999, -7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014, -7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, -7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044, -7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089, -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104, -7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119, -7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134, -7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149, -7150,7151,7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164, -7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179, -7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194, -7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209, -7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224, -7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239, -7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254, -7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269, -7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284, -7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,1042,1044,1054,1057, -1058,1058,1066,1122,42570L,7305,7306,7307,7308,7309,7310,7311,7312,7313, -7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328, -7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358, -7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373, -7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388, -7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403, -7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418, -7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433, -7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448, -7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463, -7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478, -7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493, -7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508, -7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523, -7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538, -7539,7540,7541,7542,7543,7544,42877L,7546,7547,7548,11363,7550,7551,7552, -7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597, -7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612, -7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627, -7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642, -7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657, -7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672, -7673,7674,7675,7676,7677,7678,7679,7680,7680,7682,7682,7684,7684,7686,7686, -7688,7688,7690,7690,7692,7692,7694,7694,7696,7696,7698,7698,7700,7700,7702, -7702,7704,7704,7706,7706,7708,7708,7710,7710,7712,7712,7714,7714,7716,7716, -7718,7718,7720,7720,7722,7722,7724,7724,7726,7726,7728,7728,7730,7730,7732, -7732,7734,7734,7736,7736,7738,7738,7740,7740,7742,7742,7744,7744,7746,7746, -7748,7748,7750,7750,7752,7752,7754,7754,7756,7756,7758,7758,7760,7760,7762, -7762,7764,7764,7766,7766,7768,7768,7770,7770,7772,7772,7774,7774,7776,7776, -7778,7778,7780,7780,7782,7782,7784,7784,7786,7786,7788,7788,7790,7790,7792, -7792,7794,7794,7796,7796,7798,7798,7800,7800,7802,7802,7804,7804,7806,7806, -7808,7808,7810,7810,7812,7812,7814,7814,7816,7816,7818,7818,7820,7820,7822, -7822,7824,7824,7826,7826,7828,7828,7830,7831,7832,7833,7834,7776,7836,7837, -7838,7839,7840,7840,7842,7842,7844,7844,7846,7846,7848,7848,7850,7850,7852, -7852,7854,7854,7856,7856,7858,7858,7860,7860,7862,7862,7864,7864,7866,7866, -7868,7868,7870,7870,7872,7872,7874,7874,7876,7876,7878,7878,7880,7880,7882, -7882,7884,7884,7886,7886,7888,7888,7890,7890,7892,7892,7894,7894,7896,7896, -7898,7898,7900,7900,7902,7902,7904,7904,7906,7906,7908,7908,7910,7910,7912, -7912,7914,7914,7916,7916,7918,7918,7920,7920,7922,7922,7924,7924,7926,7926, -7928,7928,7930,7930,7932,7932,7934,7934,7944,7945,7946,7947,7948,7949,7950, -7951,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965, -7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,7976,7977,7978,7979,7980, -7981,7982,7983,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995, -7996,7997,7998,7999,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010, -8011,8012,8013,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,8025, -8018,8027,8020,8029,8022,8031,8024,8025,8026,8027,8028,8029,8030,8031,8040, -8041,8042,8043,8044,8045,8046,8047,8040,8041,8042,8043,8044,8045,8046,8047, -8122,8123,8136,8137,8138,8139,8154,8155,8184,8185,8170,8171,8186,8187,8062, -8063,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077, -8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092, -8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107, -8108,8109,8110,8111,8120,8121,8114,8115,8116,8117,8118,8119,8120,8121,8122, -8123,8124,8125,921,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137, -8138,8139,8140,8141,8142,8143,8152,8153,8146,8147,8148,8149,8150,8151,8152, -8153,8154,8155,8156,8157,8158,8159,8168,8169,8162,8163,8164,8172,8166,8167, -8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,8182, -8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212, -8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227, -8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242, -8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257, -8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272, -8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302, -8303,8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317, -8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332, -8333,8334,8335,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347, -8348,8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362, -8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377, -8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391,8392, -8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407, -8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422, -8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452, -8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467, -8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482, -8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497, -8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512, -8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8498,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542, -8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557, -8558,8559,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556, -8557,8558,8559,8576,8577,8578,8579,8579,8581,8582,8583,8584,8585,8586,8587, -8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602, -8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617, -8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632, -8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647, -8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662, -8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692, -8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707, -8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722, -8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737, -8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752, -8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767, -8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782, -8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797, -8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812, -8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827, -8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842, -8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857, -8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872, -8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887, -8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902, -8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, -8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932, -8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947, -8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, -8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992, -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007, -9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022, -9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037, -9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052, -9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067, -9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082, -9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097, -9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112, -9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127, -9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142, -9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157, -9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172, -9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187, -9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202, -9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217, -9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232, -9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247, -9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262, -9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277, -9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292, -9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307, -9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322, -9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337, -9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352, -9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367, -9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382, -9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397, -9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412, -9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9398,9399,9400,9401, -9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416, -9417,9418,9419,9420,9421,9422,9423,9450,9451,9452,9453,9454,9455,9456,9457, -9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472, -9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487, -9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502, -9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517, -9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532, -9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547, -9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562, -9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577, -9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592, -9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607, -9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622, -9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637, -9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652, -9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667, -9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682, -9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697, -9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712, -9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727, -9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742, -9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757, -9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772, -9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787, -9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802, -9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817, -9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832, -9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847, -9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862, -9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877, -9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892, -9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907, -9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922, -9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937, -9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952, -9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967, -9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982, -9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997, -9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009, -10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021, -10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045, -10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057, -10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069, -10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081, -10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093, -10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105, -10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117, -10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129, -10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141, -10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153, -10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165, -10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177, -10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189, -10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201, -10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213, -10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225, -10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237, -10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249, -10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261, -10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273, -10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285, -10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297, -10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309, -10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321, -10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333, -10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345, -10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357, -10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369, -10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381, -10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393, -10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405, -10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417, -10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429, -10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441, -10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453, -10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465, -10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477, -10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489, -10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501, -10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513, -10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525, -10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537, -10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549, -10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561, -10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573, -10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585, -10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597, -10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609, -10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621, -10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633, -10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645, -10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657, -10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669, -10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681, -10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693, -10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705, -10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717, -10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729, -10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741, -10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753, -10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765, -10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777, -10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789, -10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801, -10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813, -10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825, -10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837, -10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849, -10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861, -10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873, -10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885, -10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897, -10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909, -10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921, -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933, -10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945, -10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957, -10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969, -10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981, -10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993, -10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005, -11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017, -11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, -11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041, -11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053, -11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065, -11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077, -11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089, -11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101, -11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113, -11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125, -11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137, -11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149, -11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161, -11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173, -11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185, -11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197, -11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209, -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221, -11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233, -11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245, -11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257, -11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269, -11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, -11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, -11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, -11306,11307,11308,11309,11310,11311,11264,11265,11266,11267,11268,11269, -11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281, -11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293, -11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305, -11306,11307,11308,11309,11310,11359,11360,11360,11362,11363,11364,570,574, -11367,11367,11369,11369,11371,11371,11373,11374,11375,11376,11377,11378, -11378,11380,11381,11381,11383,11384,11385,11386,11387,11388,11389,11390, -11391,11392,11392,11394,11394,11396,11396,11398,11398,11400,11400,11402, -11402,11404,11404,11406,11406,11408,11408,11410,11410,11412,11412,11414, -11414,11416,11416,11418,11418,11420,11420,11422,11422,11424,11424,11426, -11426,11428,11428,11430,11430,11432,11432,11434,11434,11436,11436,11438, -11438,11440,11440,11442,11442,11444,11444,11446,11446,11448,11448,11450, -11450,11452,11452,11454,11454,11456,11456,11458,11458,11460,11460,11462, -11462,11464,11464,11466,11466,11468,11468,11470,11470,11472,11472,11474, -11474,11476,11476,11478,11478,11480,11480,11482,11482,11484,11484,11486, -11486,11488,11488,11490,11490,11492,11493,11494,11495,11496,11497,11498, -11499,11499,11501,11501,11503,11504,11505,11506,11506,11508,11509,11510, -11511,11512,11513,11514,11515,11516,11517,11518,11519,4256,4257,4258,4259, -4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274, -4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289, -4290,4291,4292,4293,11558,4295,11560,11561,11562,11563,11564,4301,11566, -11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590, -11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602, -11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614, -11615,11616,11617,11618,11619,11620,11621,11622,11623,11624,11625,11626, -11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650, -11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662, -11663,11664,11665,11666,11667,11668,11669,11670,11671,11672,11673,11674, -11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685,11686, -11687,11688,11689,11690,11691,11692,11693,11694,11695,11696,11697,11698, -11699,11700,11701,11702,11703,11704,11705,11706,11707,11708,11709,11710, -11711,11712,11713,11714,11715,11716,11717,11718,11719,11720,11721,11722, -11723,11724,11725,11726,11727,11728,11729,11730,11731,11732,11733,11734, -11735,11736,11737,11738,11739,11740,11741,11742,11743,11744,11745,11746, -11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758, -11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770, -11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781,11782, -11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794, -11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806, -11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818, -11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830, -11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842, -11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854, -11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878, -11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890, -11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902, -11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914, -11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926, -11927,11928,11929,11930,11931,11932,11933,11934,11935,11936,11937,11938, -11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950, -11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962, -11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974, -11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986, -11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998, -11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010, -12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022, -12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034, -12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046, -12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058, -12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070, -12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082, -12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094, -12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106, -12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118, -12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130, -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142, -12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154, -12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166, -12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178, -12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190, -12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202, -12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214, -12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226, -12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238, -12239,12240,12241,12242,12243,12244,12245,12246,12247,12248,12249,12250, -12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262, -12263,12264,12265,12266,12267,12268,12269,12270,12271,12272,12273,12274, -12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286, -12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298, -12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310, -12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322, -12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334, -12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346, -12347,12348,12349,12350,12351,12352,12353,12354,12355,12356,12357,12358, -12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370, -12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382, -12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394, -12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406, -12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418, -12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430, -12431,12432,12433,12434,12435,12436,12437,12438,12439,12440,12441,12442, -12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454, -12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466, -12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478, -12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490, -12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502, -12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514, -12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526, -12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538, -12539,12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550, -12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562, -12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574, -12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586, -12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598, -12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610, -12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622, -12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634, -12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646, -12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658, -12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670, -12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682, -12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694, -12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706, -12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718, -12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730, -12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754, -12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766, -12767,12768,12769,12770,12771,12772,12773,12774,12775,12776,12777,12778, -12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790, -12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802, -12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814, -12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826, -12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838, -12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850, -12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862, -12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874, -12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886, -12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898, -12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910, -12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922, -12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934, -12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946, -12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958, -12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970, -12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982, -12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994, -12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006, -13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030, -13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042, -13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054, -13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066, -13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078, -13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090, -13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102, -13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114, -13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126, -13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138, -13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150, -13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162, -13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174, -13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186, -13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198, -13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210, -13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222, -13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234, -13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246, -13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258, -13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270, -13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282, -13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294, -13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306, -13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318, -13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330, -13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342, -13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354, -13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366, -13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378, -13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390, -13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402, -13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426, -13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438, -13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450, -13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462, -13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474, -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486, -13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498, -13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510, -13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534, -13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546, -13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558, -13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582, -13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594, -13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606, -13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630, -13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642, -13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654, -13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666, -13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678, -13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690, -13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702, -13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714, -13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726, -13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738, -13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750, -13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762, -13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774, -13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786, -13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798, -13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810, -13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822, -13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834, -13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846, -13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858, -13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870, -13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882, -13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894, -13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906, -13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918, -13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930, -13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942, -13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954, -13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966, -13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978, -13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990, -13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002, -14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014, -14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026, -14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038, -14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050, -14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062, -14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074, -14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086, -14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098, -14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110, -14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122, -14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134, -14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146, -14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158, -14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170, -14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182, -14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194, -14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206, -14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218, -14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230, -14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242, -14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254, -14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266, -14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278, -14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290, -14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302, -14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314, -14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326, -14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338, -14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350, -14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362, -14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374, -14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386, -14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398, -14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410, -14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422, -14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434, -14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446, -14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458, -14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470, -14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482, -14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494, -14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506, -14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518, -14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530, -14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542, -14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554, -14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566, -14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578, -14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590, -14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602, -14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614, -14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626, -14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638, -14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650, -14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662, -14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674, -14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686, -14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698, -14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710, -14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722, -14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734, -14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746, -14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758, -14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770, -14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782, -14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794, -14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806, -14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818, -14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830, -14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842, -14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854, -14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866, -14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878, -14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890, -14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902, -14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914, -14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926, -14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938, -14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950, -14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962, -14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974, -14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986, -14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998, -14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010, -15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022, -15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034, -15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046, -15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058, -15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070, -15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082, -15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094, -15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106, -15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118, -15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130, -15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142, -15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154, -15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166, -15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178, -15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190, -15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202, -15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214, -15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226, -15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238, -15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250, -15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262, -15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274, -15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286, -15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298, -15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310, -15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322, -15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334, -15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346, -15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358, -15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370, -15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382, -15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394, -15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406, -15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418, -15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430, -15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442, -15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454, -15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466, -15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478, -15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490, -15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502, -15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514, -15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526, -15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538, -15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550, -15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562, -15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574, -15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586, -15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598, -15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610, -15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622, -15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634, -15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646, -15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658, -15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670, -15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682, -15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694, -15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706, -15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718, -15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730, -15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742, -15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754, -15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766, -15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778, -15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790, -15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802, -15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814, -15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826, -15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838, -15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850, -15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862, -15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874, -15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886, -15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898, -15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910, -15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922, -15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934, -15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946, -15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958, -15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970, -15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982, -15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994, -15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006, -16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018, -16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030, -16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042, -16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054, -16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066, -16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078, -16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090, -16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102, -16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114, -16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126, -16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138, -16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150, -16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162, -16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174, -16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186, -16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198, -16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210, -16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222, -16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234, -16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246, -16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258, -16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270, -16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282, -16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294, -16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306, -16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318, -16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330, -16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342, -16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354, -16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366, -16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378, -16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390, -16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402, -16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414, -16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426, -16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438, -16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450, -16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462, -16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474, -16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486, -16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498, -16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510, -16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522, -16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534, -16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546, -16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558, -16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570, -16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582, -16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594, -16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606, -16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618, -16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630, -16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642, -16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654, -16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666, -16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678, -16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690, -16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702, -16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714, -16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726, -16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738, -16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750, -16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762, -16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774, -16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786, -16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798, -16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810, -16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822, -16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834, -16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846, -16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858, -16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870, -16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882, -16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894, -16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906, -16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918, -16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930, -16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942, -16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954, -16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966, -16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978, -16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990, -16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002, -17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014, -17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026, -17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038, -17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050, -17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062, -17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074, -17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086, -17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098, -17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110, -17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122, -17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134, -17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146, -17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158, -17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170, -17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182, -17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194, -17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206, -17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218, -17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230, -17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242, -17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254, -17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266, -17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278, -17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290, -17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302, -17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314, -17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326, -17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338, -17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350, -17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362, -17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374, -17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386, -17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398, -17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410, -17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422, -17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434, -17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446, -17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458, -17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470, -17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482, -17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494, -17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506, -17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518, -17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530, -17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542, -17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554, -17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566, -17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578, -17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590, -17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602, -17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614, -17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626, -17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638, -17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650, -17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662, -17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674, -17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686, -17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698, -17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710, -17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722, -17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734, -17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746, -17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758, -17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770, -17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782, -17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794, -17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806, -17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818, -17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830, -17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842, -17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854, -17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866, -17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878, -17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890, -17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902, -17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914, -17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926, -17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938, -17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950, -17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962, -17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974, -17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986, -17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998, -17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010, -18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022, -18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034, -18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046, -18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058, -18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070, -18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082, -18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094, -18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106, -18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118, -18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130, -18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142, -18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154, -18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166, -18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178, -18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190, -18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202, -18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214, -18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226, -18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238, -18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250, -18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262, -18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274, -18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286, -18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298, -18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310, -18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322, -18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334, -18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346, -18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358, -18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370, -18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382, -18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394, -18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406, -18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418, -18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430, -18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442, -18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454, -18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466, -18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478, -18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490, -18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502, -18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514, -18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526, -18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538, -18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550, -18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562, -18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574, -18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586, -18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598, -18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610, -18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622, -18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634, -18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646, -18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658, -18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670, -18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682, -18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694, -18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706, -18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718, -18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730, -18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742, -18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754, -18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766, -18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778, -18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790, -18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802, -18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814, -18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826, -18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838, -18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850, -18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862, -18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874, -18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886, -18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898, -18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910, -18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922, -18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934, -18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946, -18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958, -18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970, -18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982, -18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994, -18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006, -19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018, -19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030, -19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042, -19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054, -19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066, -19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078, -19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090, -19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102, -19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114, -19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126, -19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138, -19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150, -19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162, -19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174, -19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186, -19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198, -19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210, -19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222, -19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234, -19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246, -19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258, -19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270, -19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282, -19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294, -19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306, -19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318, -19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330, -19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342, -19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354, -19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366, -19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378, -19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390, -19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402, -19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414, -19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426, -19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438, -19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450, -19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462, -19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474, -19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486, -19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498, -19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510, -19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522, -19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534, -19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546, -19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558, -19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570, -19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582, -19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594, -19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606, -19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618, -19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630, -19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642, -19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654, -19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666, -19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678, -19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690, -19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702, -19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714, -19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726, -19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738, -19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750, -19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762, -19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774, -19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786, -19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798, -19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810, -19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822, -19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834, -19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846, -19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858, -19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870, -19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882, -19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894, -19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906, -19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918, -19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930, -19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942, -19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954, -19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966, -19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978, -19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990, -19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002, -20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014, -20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026, -20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038, -20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050, -20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062, -20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074, -20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086, -20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098, -20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110, -20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122, -20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134, -20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146, -20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158, -20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170, -20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182, -20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194, -20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206, -20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218, -20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230, -20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242, -20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254, -20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266, -20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278, -20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290, -20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302, -20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314, -20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326, -20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338, -20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350, -20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362, -20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374, -20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386, -20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398, -20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410, -20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422, -20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434, -20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446, -20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458, -20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470, -20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482, -20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494, -20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506, -20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518, -20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530, -20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542, -20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554, -20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566, -20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578, -20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590, -20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602, -20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614, -20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626, -20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638, -20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650, -20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662, -20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674, -20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686, -20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698, -20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710, -20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722, -20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734, -20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746, -20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758, -20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770, -20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782, -20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794, -20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806, -20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818, -20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830, -20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842, -20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854, -20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866, -20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878, -20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890, -20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902, -20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914, -20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926, -20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938, -20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950, -20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962, -20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974, -20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986, -20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998, -20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010, -21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022, -21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034, -21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046, -21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058, -21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070, -21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082, -21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094, -21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106, -21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118, -21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130, -21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142, -21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154, -21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166, -21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178, -21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190, -21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202, -21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214, -21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226, -21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238, -21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250, -21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262, -21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274, -21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286, -21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298, -21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310, -21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322, -21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334, -21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346, -21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358, -21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370, -21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382, -21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394, -21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406, -21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418, -21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430, -21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442, -21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454, -21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466, -21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478, -21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490, -21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502, -21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514, -21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526, -21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538, -21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550, -21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562, -21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574, -21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586, -21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598, -21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610, -21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622, -21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634, -21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646, -21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658, -21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670, -21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682, -21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694, -21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706, -21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718, -21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730, -21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742, -21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754, -21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766, -21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778, -21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790, -21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802, -21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814, -21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826, -21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838, -21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850, -21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862, -21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874, -21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886, -21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898, -21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910, -21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922, -21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934, -21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946, -21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958, -21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970, -21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982, -21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994, -21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006, -22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018, -22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030, -22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042, -22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054, -22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066, -22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078, -22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090, -22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102, -22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114, -22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126, -22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138, -22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150, -22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162, -22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174, -22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186, -22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198, -22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210, -22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222, -22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234, -22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246, -22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258, -22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270, -22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282, -22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294, -22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306, -22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318, -22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330, -22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342, -22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354, -22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366, -22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378, -22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390, -22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402, -22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414, -22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426, -22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438, -22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450, -22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462, -22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474, -22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486, -22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498, -22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510, -22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522, -22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534, -22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546, -22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558, -22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570, -22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582, -22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594, -22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606, -22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618, -22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630, -22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642, -22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654, -22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666, -22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678, -22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690, -22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702, -22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714, -22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726, -22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738, -22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750, -22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762, -22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774, -22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786, -22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798, -22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810, -22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822, -22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834, -22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846, -22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858, -22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870, -22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882, -22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894, -22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906, -22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918, -22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930, -22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942, -22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954, -22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966, -22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978, -22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990, -22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002, -23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014, -23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026, -23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038, -23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050, -23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062, -23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074, -23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086, -23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098, -23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110, -23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122, -23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134, -23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146, -23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158, -23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170, -23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182, -23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194, -23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206, -23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218, -23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230, -23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242, -23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254, -23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266, -23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278, -23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290, -23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302, -23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314, -23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326, -23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338, -23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350, -23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362, -23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374, -23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386, -23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398, -23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410, -23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422, -23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434, -23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446, -23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458, -23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470, -23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482, -23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494, -23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506, -23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518, -23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530, -23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542, -23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554, -23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566, -23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578, -23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590, -23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602, -23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614, -23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626, -23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638, -23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650, -23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662, -23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674, -23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686, -23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698, -23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710, -23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722, -23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734, -23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746, -23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758, -23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770, -23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782, -23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794, -23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806, -23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818, -23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830, -23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842, -23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854, -23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866, -23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878, -23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890, -23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902, -23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914, -23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926, -23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938, -23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950, -23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962, -23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974, -23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986, -23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998, -23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010, -24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022, -24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034, -24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046, -24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058, -24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070, -24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082, -24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094, -24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106, -24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118, -24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130, -24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142, -24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154, -24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166, -24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178, -24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190, -24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202, -24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214, -24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226, -24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238, -24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250, -24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262, -24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274, -24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286, -24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298, -24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310, -24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322, -24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334, -24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346, -24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358, -24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370, -24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382, -24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394, -24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406, -24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418, -24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430, -24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442, -24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454, -24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466, -24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478, -24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490, -24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502, -24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514, -24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526, -24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538, -24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550, -24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562, -24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574, -24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586, -24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598, -24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610, -24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622, -24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634, -24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646, -24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658, -24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670, -24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682, -24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694, -24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706, -24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718, -24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730, -24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742, -24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754, -24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766, -24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778, -24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790, -24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802, -24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814, -24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826, -24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838, -24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850, -24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862, -24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874, -24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886, -24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898, -24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910, -24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922, -24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934, -24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946, -24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958, -24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970, -24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982, -24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994, -24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006, -25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018, -25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030, -25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042, -25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054, -25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066, -25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078, -25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090, -25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102, -25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114, -25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126, -25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138, -25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150, -25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162, -25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174, -25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186, -25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198, -25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210, -25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222, -25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234, -25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246, -25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258, -25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270, -25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282, -25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294, -25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306, -25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318, -25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330, -25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342, -25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354, -25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366, -25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378, -25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390, -25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402, -25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414, -25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426, -25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438, -25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450, -25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462, -25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474, -25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486, -25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498, -25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510, -25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522, -25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534, -25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546, -25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558, -25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570, -25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582, -25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594, -25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606, -25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618, -25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630, -25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642, -25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654, -25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666, -25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678, -25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690, -25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702, -25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714, -25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726, -25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738, -25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750, -25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762, -25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774, -25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786, -25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798, -25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810, -25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822, -25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834, -25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846, -25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858, -25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870, -25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882, -25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894, -25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906, -25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918, -25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930, -25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942, -25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954, -25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966, -25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978, -25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990, -25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002, -26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014, -26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026, -26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038, -26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050, -26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062, -26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074, -26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086, -26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098, -26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110, -26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122, -26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134, -26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146, -26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158, -26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170, -26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182, -26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194, -26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206, -26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218, -26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230, -26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242, -26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254, -26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266, -26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278, -26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290, -26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302, -26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314, -26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326, -26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338, -26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350, -26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362, -26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374, -26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386, -26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398, -26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410, -26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422, -26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434, -26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446, -26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458, -26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470, -26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482, -26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494, -26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506, -26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518, -26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530, -26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542, -26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554, -26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566, -26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578, -26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590, -26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602, -26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614, -26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626, -26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638, -26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650, -26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662, -26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674, -26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686, -26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698, -26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710, -26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722, -26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734, -26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746, -26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758, -26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770, -26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782, -26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794, -26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806, -26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818, -26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830, -26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842, -26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854, -26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866, -26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878, -26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890, -26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902, -26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914, -26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926, -26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938, -26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950, -26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962, -26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974, -26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986, -26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998, -26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010, -27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022, -27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034, -27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046, -27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058, -27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070, -27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082, -27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094, -27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106, -27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118, -27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130, -27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142, -27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154, -27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166, -27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178, -27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190, -27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202, -27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214, -27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226, -27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238, -27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250, -27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262, -27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274, -27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286, -27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298, -27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310, -27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322, -27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334, -27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346, -27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358, -27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370, -27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382, -27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394, -27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406, -27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418, -27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430, -27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442, -27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454, -27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466, -27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478, -27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490, -27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502, -27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514, -27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526, -27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538, -27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550, -27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562, -27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574, -27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586, -27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598, -27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610, -27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622, -27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634, -27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646, -27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658, -27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670, -27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682, -27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694, -27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706, -27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718, -27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730, -27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742, -27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754, -27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766, -27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778, -27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790, -27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802, -27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814, -27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826, -27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838, -27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850, -27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862, -27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874, -27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886, -27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898, -27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910, -27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922, -27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934, -27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946, -27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958, -27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970, -27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982, -27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994, -27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006, -28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018, -28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030, -28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042, -28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054, -28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066, -28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078, -28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090, -28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102, -28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114, -28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126, -28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138, -28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150, -28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162, -28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174, -28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186, -28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198, -28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210, -28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222, -28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234, -28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246, -28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258, -28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270, -28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282, -28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294, -28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306, -28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318, -28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330, -28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342, -28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354, -28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366, -28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378, -28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390, -28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402, -28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414, -28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426, -28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438, -28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450, -28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462, -28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474, -28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486, -28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498, -28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510, -28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522, -28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534, -28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546, -28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558, -28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570, -28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582, -28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594, -28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606, -28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618, -28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630, -28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642, -28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654, -28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666, -28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678, -28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690, -28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702, -28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714, -28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726, -28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738, -28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750, -28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762, -28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774, -28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786, -28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798, -28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810, -28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822, -28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834, -28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846, -28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858, -28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870, -28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882, -28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894, -28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906, -28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918, -28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930, -28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942, -28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954, -28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966, -28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978, -28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990, -28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002, -29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014, -29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026, -29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038, -29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050, -29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062, -29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074, -29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086, -29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098, -29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110, -29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122, -29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134, -29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146, -29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158, -29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170, -29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182, -29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194, -29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206, -29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218, -29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230, -29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242, -29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254, -29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266, -29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278, -29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290, -29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302, -29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314, -29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326, -29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338, -29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350, -29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362, -29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374, -29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386, -29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398, -29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410, -29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422, -29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434, -29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446, -29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458, -29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470, -29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482, -29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494, -29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506, -29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518, -29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530, -29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542, -29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554, -29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566, -29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578, -29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590, -29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602, -29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614, -29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626, -29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638, -29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650, -29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662, -29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674, -29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686, -29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698, -29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710, -29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722, -29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734, -29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746, -29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758, -29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770, -29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782, -29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794, -29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806, -29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818, -29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830, -29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842, -29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854, -29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866, -29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878, -29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890, -29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902, -29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914, -29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926, -29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938, -29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950, -29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962, -29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974, -29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986, -29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998, -29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010, -30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022, -30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034, -30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046, -30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058, -30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070, -30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082, -30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094, -30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106, -30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118, -30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130, -30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142, -30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154, -30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166, -30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178, -30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190, -30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202, -30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214, -30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226, -30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238, -30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250, -30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262, -30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274, -30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286, -30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298, -30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310, -30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322, -30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334, -30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346, -30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358, -30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370, -30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382, -30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394, -30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406, -30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418, -30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430, -30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442, -30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454, -30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466, -30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478, -30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490, -30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502, -30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514, -30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526, -30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538, -30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550, -30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562, -30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574, -30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586, -30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598, -30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610, -30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622, -30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634, -30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646, -30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658, -30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670, -30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682, -30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694, -30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706, -30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718, -30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730, -30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742, -30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754, -30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766, -30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778, -30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790, -30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802, -30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814, -30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826, -30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838, -30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850, -30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862, -30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874, -30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886, -30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898, -30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910, -30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922, -30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934, -30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946, -30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958, -30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970, -30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982, -30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994, -30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006, -31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018, -31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030, -31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042, -31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054, -31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066, -31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078, -31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090, -31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102, -31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114, -31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126, -31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138, -31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150, -31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162, -31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174, -31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186, -31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198, -31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210, -31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222, -31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234, -31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246, -31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258, -31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270, -31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282, -31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294, -31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306, -31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318, -31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330, -31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342, -31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354, -31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366, -31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378, -31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390, -31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402, -31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414, -31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426, -31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438, -31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450, -31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462, -31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474, -31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486, -31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498, -31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510, -31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522, -31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534, -31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546, -31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558, -31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570, -31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582, -31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594, -31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606, -31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618, -31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630, -31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642, -31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654, -31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666, -31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678, -31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690, -31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702, -31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714, -31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726, -31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738, -31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750, -31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762, -31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774, -31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786, -31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798, -31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810, -31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822, -31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834, -31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846, -31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858, -31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870, -31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882, -31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894, -31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906, -31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918, -31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930, -31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942, -31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954, -31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966, -31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978, -31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990, -31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002, -32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014, -32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026, -32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038, -32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050, -32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062, -32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074, -32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086, -32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098, -32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110, -32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122, -32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134, -32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146, -32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158, -32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170, -32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182, -32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194, -32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206, -32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218, -32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230, -32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242, -32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254, -32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266, -32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278, -32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290, -32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302, -32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314, -32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326, -32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338, -32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350, -32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362, -32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374, -32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386, -32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398, -32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410, -32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422, -32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434, -32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446, -32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458, -32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470, -32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482, -32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494, -32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506, -32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518, -32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530, -32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542, -32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554, -32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566, -32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578, -32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590, -32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602, -32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614, -32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626, -32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638, -32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650, -32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662, -32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674, -32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686, -32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698, -32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710, -32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722, -32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734, -32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746, -32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758, -32759,32760,32761,32762,32763,32764,32765,32766,32767,32768L,32769L,32770L, -32771L,32772L,32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L, -32781L,32782L,32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L, -32791L,32792L,32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L, -32801L,32802L,32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L, -32811L,32812L,32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L, -32821L,32822L,32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L, -32831L,32832L,32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L, -32841L,32842L,32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L, -32851L,32852L,32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L, -32861L,32862L,32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L, -32871L,32872L,32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L, -32881L,32882L,32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L, -32891L,32892L,32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L, -32901L,32902L,32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L, -32911L,32912L,32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L, -32921L,32922L,32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L, -32931L,32932L,32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L, -32941L,32942L,32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L, -32951L,32952L,32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L, -32961L,32962L,32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L, -32971L,32972L,32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L, -32981L,32982L,32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L, -32991L,32992L,32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L, -33001L,33002L,33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L, -33011L,33012L,33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L, -33021L,33022L,33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L, -33031L,33032L,33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L, -33041L,33042L,33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L, -33051L,33052L,33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L, -33061L,33062L,33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L, -33071L,33072L,33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L, -33081L,33082L,33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L, -33091L,33092L,33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L, -33101L,33102L,33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L, -33111L,33112L,33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L, -33121L,33122L,33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L, -33131L,33132L,33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L, -33141L,33142L,33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L, -33151L,33152L,33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L, -33161L,33162L,33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L, -33171L,33172L,33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L, -33181L,33182L,33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L, -33191L,33192L,33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L, -33201L,33202L,33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L, -33211L,33212L,33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L, -33221L,33222L,33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L, -33231L,33232L,33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L, -33241L,33242L,33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L, -33251L,33252L,33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L, -33261L,33262L,33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L, -33271L,33272L,33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L, -33281L,33282L,33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L, -33291L,33292L,33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L, -33301L,33302L,33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L, -33311L,33312L,33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L, -33321L,33322L,33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L, -33331L,33332L,33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L, -33341L,33342L,33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L, -33351L,33352L,33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L, -33361L,33362L,33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L, -33371L,33372L,33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L, -33381L,33382L,33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L, -33391L,33392L,33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L, -33401L,33402L,33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L, -33411L,33412L,33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L, -33421L,33422L,33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L, -33431L,33432L,33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L, -33441L,33442L,33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L, -33451L,33452L,33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L, -33461L,33462L,33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L, -33471L,33472L,33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L, -33481L,33482L,33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L, -33491L,33492L,33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L, -33501L,33502L,33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L, -33511L,33512L,33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L, -33521L,33522L,33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L, -33531L,33532L,33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L, -33541L,33542L,33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L, -33551L,33552L,33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L, -33561L,33562L,33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L, -33571L,33572L,33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L, -33581L,33582L,33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L, -33591L,33592L,33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L, -33601L,33602L,33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L, -33611L,33612L,33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L, -33621L,33622L,33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L, -33631L,33632L,33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L, -33641L,33642L,33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L, -33651L,33652L,33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L, -33661L,33662L,33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L, -33671L,33672L,33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L, -33681L,33682L,33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L, -33691L,33692L,33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L, -33701L,33702L,33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L, -33711L,33712L,33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L, -33721L,33722L,33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L, -33731L,33732L,33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L, -33741L,33742L,33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L, -33751L,33752L,33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L, -33761L,33762L,33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L, -33771L,33772L,33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L, -33781L,33782L,33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L, -33791L,33792L,33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L, -33801L,33802L,33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L, -33811L,33812L,33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L, -33821L,33822L,33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L, -33831L,33832L,33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L, -33841L,33842L,33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L, -33851L,33852L,33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L, -33861L,33862L,33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L, -33871L,33872L,33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L, -33881L,33882L,33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L, -33891L,33892L,33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L, -33901L,33902L,33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L, -33911L,33912L,33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L, -33921L,33922L,33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L, -33931L,33932L,33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L, -33941L,33942L,33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L, -33951L,33952L,33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L, -33961L,33962L,33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L, -33971L,33972L,33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L, -33981L,33982L,33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L, -33991L,33992L,33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L, -34001L,34002L,34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L, -34011L,34012L,34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L, -34021L,34022L,34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L, -34031L,34032L,34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L, -34041L,34042L,34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L, -34051L,34052L,34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L, -34061L,34062L,34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L, -34071L,34072L,34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L, -34081L,34082L,34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L, -34091L,34092L,34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L, -34101L,34102L,34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L, -34111L,34112L,34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L, -34121L,34122L,34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L, -34131L,34132L,34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L, -34141L,34142L,34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L, -34151L,34152L,34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L, -34161L,34162L,34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L, -34171L,34172L,34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L, -34181L,34182L,34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L, -34191L,34192L,34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L, -34201L,34202L,34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L, -34211L,34212L,34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L, -34221L,34222L,34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L, -34231L,34232L,34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L, -34241L,34242L,34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L, -34251L,34252L,34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L, -34261L,34262L,34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L, -34271L,34272L,34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L, -34281L,34282L,34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L, -34291L,34292L,34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L, -34301L,34302L,34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L, -34311L,34312L,34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L, -34321L,34322L,34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L, -34331L,34332L,34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L, -34341L,34342L,34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L, -34351L,34352L,34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L, -34361L,34362L,34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L, -34371L,34372L,34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L, -34381L,34382L,34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L, -34391L,34392L,34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L, -34401L,34402L,34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L, -34411L,34412L,34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L, -34421L,34422L,34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L, -34431L,34432L,34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L, -34441L,34442L,34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L, -34451L,34452L,34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L, -34461L,34462L,34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L, -34471L,34472L,34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L, -34481L,34482L,34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L, -34491L,34492L,34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L, -34501L,34502L,34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L, -34511L,34512L,34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L, -34521L,34522L,34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L, -34531L,34532L,34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L, -34541L,34542L,34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L, -34551L,34552L,34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L, -34561L,34562L,34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L, -34571L,34572L,34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L, -34581L,34582L,34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L, -34591L,34592L,34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L, -34601L,34602L,34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L, -34611L,34612L,34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L, -34621L,34622L,34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L, -34631L,34632L,34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L, -34641L,34642L,34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L, -34651L,34652L,34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L, -34661L,34662L,34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L, -34671L,34672L,34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L, -34681L,34682L,34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L, -34691L,34692L,34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L, -34701L,34702L,34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L, -34711L,34712L,34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L, -34721L,34722L,34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L, -34731L,34732L,34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L, -34741L,34742L,34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L, -34751L,34752L,34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L, -34761L,34762L,34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L, -34771L,34772L,34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L, -34781L,34782L,34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L, -34791L,34792L,34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L, -34801L,34802L,34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L, -34811L,34812L,34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L, -34821L,34822L,34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L, -34831L,34832L,34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L, -34841L,34842L,34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L, -34851L,34852L,34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L, -34861L,34862L,34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L, -34871L,34872L,34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L, -34881L,34882L,34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L, -34891L,34892L,34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L, -34901L,34902L,34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L, -34911L,34912L,34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L, -34921L,34922L,34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L, -34931L,34932L,34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L, -34941L,34942L,34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L, -34951L,34952L,34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L, -34961L,34962L,34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L, -34971L,34972L,34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L, -34981L,34982L,34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L, -34991L,34992L,34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L, -35001L,35002L,35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L, -35011L,35012L,35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L, -35021L,35022L,35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L, -35031L,35032L,35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L, -35041L,35042L,35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L, -35051L,35052L,35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L, -35061L,35062L,35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L, -35071L,35072L,35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L, -35081L,35082L,35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L, -35091L,35092L,35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L, -35101L,35102L,35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L, -35111L,35112L,35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L, -35121L,35122L,35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L, -35131L,35132L,35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L, -35141L,35142L,35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L, -35151L,35152L,35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L, -35161L,35162L,35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L, -35171L,35172L,35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L, -35181L,35182L,35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L, -35191L,35192L,35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L, -35201L,35202L,35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L, -35211L,35212L,35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L, -35221L,35222L,35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L, -35231L,35232L,35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L, -35241L,35242L,35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L, -35251L,35252L,35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L, -35261L,35262L,35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L, -35271L,35272L,35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L, -35281L,35282L,35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L, -35291L,35292L,35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L, -35301L,35302L,35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L, -35311L,35312L,35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L, -35321L,35322L,35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L, -35331L,35332L,35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L, -35341L,35342L,35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L, -35351L,35352L,35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L, -35361L,35362L,35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L, -35371L,35372L,35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L, -35381L,35382L,35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L, -35391L,35392L,35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L, -35401L,35402L,35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L, -35411L,35412L,35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L, -35421L,35422L,35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L, -35431L,35432L,35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L, -35441L,35442L,35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L, -35451L,35452L,35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L, -35461L,35462L,35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L, -35471L,35472L,35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L, -35481L,35482L,35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L, -35491L,35492L,35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L, -35501L,35502L,35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L, -35511L,35512L,35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L, -35521L,35522L,35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L, -35531L,35532L,35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L, -35541L,35542L,35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L, -35551L,35552L,35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L, -35561L,35562L,35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L, -35571L,35572L,35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L, -35581L,35582L,35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L, -35591L,35592L,35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L, -35601L,35602L,35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L, -35611L,35612L,35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L, -35621L,35622L,35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L, -35631L,35632L,35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L, -35641L,35642L,35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L, -35651L,35652L,35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L, -35661L,35662L,35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L, -35671L,35672L,35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L, -35681L,35682L,35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L, -35691L,35692L,35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L, -35701L,35702L,35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L, -35711L,35712L,35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L, -35721L,35722L,35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L, -35731L,35732L,35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L, -35741L,35742L,35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L, -35751L,35752L,35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L, -35761L,35762L,35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L, -35771L,35772L,35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L, -35781L,35782L,35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L, -35791L,35792L,35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L, -35801L,35802L,35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L, -35811L,35812L,35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L, -35821L,35822L,35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L, -35831L,35832L,35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L, -35841L,35842L,35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L, -35851L,35852L,35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L, -35861L,35862L,35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L, -35871L,35872L,35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L, -35881L,35882L,35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L, -35891L,35892L,35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L, -35901L,35902L,35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L, -35911L,35912L,35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L, -35921L,35922L,35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L, -35931L,35932L,35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L, -35941L,35942L,35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L, -35951L,35952L,35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L, -35961L,35962L,35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L, -35971L,35972L,35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L, -35981L,35982L,35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L, -35991L,35992L,35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L, -36001L,36002L,36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L, -36011L,36012L,36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L, -36021L,36022L,36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L, -36031L,36032L,36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L, -36041L,36042L,36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L, -36051L,36052L,36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L, -36061L,36062L,36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L, -36071L,36072L,36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L, -36081L,36082L,36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L, -36091L,36092L,36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L, -36101L,36102L,36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L, -36111L,36112L,36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L, -36121L,36122L,36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L, -36131L,36132L,36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L, -36141L,36142L,36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L, -36151L,36152L,36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L, -36161L,36162L,36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L, -36171L,36172L,36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L, -36181L,36182L,36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L, -36191L,36192L,36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L, -36201L,36202L,36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L, -36211L,36212L,36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L, -36221L,36222L,36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L, -36231L,36232L,36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L, -36241L,36242L,36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L, -36251L,36252L,36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L, -36261L,36262L,36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L, -36271L,36272L,36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L, -36281L,36282L,36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L, -36291L,36292L,36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L, -36301L,36302L,36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L, -36311L,36312L,36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L, -36321L,36322L,36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L, -36331L,36332L,36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L, -36341L,36342L,36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L, -36351L,36352L,36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L, -36361L,36362L,36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L, -36371L,36372L,36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L, -36381L,36382L,36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L, -36391L,36392L,36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L, -36401L,36402L,36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L, -36411L,36412L,36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L, -36421L,36422L,36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L, -36431L,36432L,36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L, -36441L,36442L,36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L, -36451L,36452L,36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L, -36461L,36462L,36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L, -36471L,36472L,36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L, -36481L,36482L,36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L, -36491L,36492L,36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L, -36501L,36502L,36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L, -36511L,36512L,36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L, -36521L,36522L,36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L, -36531L,36532L,36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L, -36541L,36542L,36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L, -36551L,36552L,36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L, -36561L,36562L,36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L, -36571L,36572L,36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L, -36581L,36582L,36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L, -36591L,36592L,36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L, -36601L,36602L,36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L, -36611L,36612L,36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L, -36621L,36622L,36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L, -36631L,36632L,36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L, -36641L,36642L,36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L, -36651L,36652L,36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L, -36661L,36662L,36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L, -36671L,36672L,36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L, -36681L,36682L,36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L, -36691L,36692L,36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L, -36701L,36702L,36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L, -36711L,36712L,36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L, -36721L,36722L,36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L, -36731L,36732L,36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L, -36741L,36742L,36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L, -36751L,36752L,36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L, -36761L,36762L,36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L, -36771L,36772L,36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L, -36781L,36782L,36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L, -36791L,36792L,36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L, -36801L,36802L,36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L, -36811L,36812L,36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L, -36821L,36822L,36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L, -36831L,36832L,36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L, -36841L,36842L,36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L, -36851L,36852L,36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L, -36861L,36862L,36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L, -36871L,36872L,36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L, -36881L,36882L,36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L, -36891L,36892L,36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L, -36901L,36902L,36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L, -36911L,36912L,36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L, -36921L,36922L,36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L, -36931L,36932L,36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L, -36941L,36942L,36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L, -36951L,36952L,36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L, -36961L,36962L,36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L, -36971L,36972L,36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L, -36981L,36982L,36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L, -36991L,36992L,36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L, -37001L,37002L,37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L, -37011L,37012L,37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L, -37021L,37022L,37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L, -37031L,37032L,37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L, -37041L,37042L,37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L, -37051L,37052L,37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L, -37061L,37062L,37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L, -37071L,37072L,37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L, -37081L,37082L,37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L, -37091L,37092L,37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L, -37101L,37102L,37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L, -37111L,37112L,37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L, -37121L,37122L,37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L, -37131L,37132L,37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L, -37141L,37142L,37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L, -37151L,37152L,37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L, -37161L,37162L,37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L, -37171L,37172L,37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L, -37181L,37182L,37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L, -37191L,37192L,37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L, -37201L,37202L,37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L, -37211L,37212L,37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L, -37221L,37222L,37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L, -37231L,37232L,37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L, -37241L,37242L,37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L, -37251L,37252L,37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L, -37261L,37262L,37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L, -37271L,37272L,37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L, -37281L,37282L,37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L, -37291L,37292L,37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L, -37301L,37302L,37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L, -37311L,37312L,37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L, -37321L,37322L,37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L, -37331L,37332L,37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L, -37341L,37342L,37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L, -37351L,37352L,37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L, -37361L,37362L,37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L, -37371L,37372L,37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L, -37381L,37382L,37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L, -37391L,37392L,37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L, -37401L,37402L,37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L, -37411L,37412L,37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L, -37421L,37422L,37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L, -37431L,37432L,37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L, -37441L,37442L,37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L, -37451L,37452L,37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L, -37461L,37462L,37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L, -37471L,37472L,37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L, -37481L,37482L,37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L, -37491L,37492L,37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L, -37501L,37502L,37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L, -37511L,37512L,37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L, -37521L,37522L,37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L, -37531L,37532L,37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L, -37541L,37542L,37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L, -37551L,37552L,37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L, -37561L,37562L,37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L, -37571L,37572L,37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L, -37581L,37582L,37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L, -37591L,37592L,37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L, -37601L,37602L,37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L, -37611L,37612L,37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L, -37621L,37622L,37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L, -37631L,37632L,37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L, -37641L,37642L,37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L, -37651L,37652L,37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L, -37661L,37662L,37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L, -37671L,37672L,37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L, -37681L,37682L,37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L, -37691L,37692L,37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L, -37701L,37702L,37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L, -37711L,37712L,37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L, -37721L,37722L,37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L, -37731L,37732L,37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L, -37741L,37742L,37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L, -37751L,37752L,37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L, -37761L,37762L,37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L, -37771L,37772L,37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L, -37781L,37782L,37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L, -37791L,37792L,37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L, -37801L,37802L,37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L, -37811L,37812L,37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L, -37821L,37822L,37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L, -37831L,37832L,37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L, -37841L,37842L,37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L, -37851L,37852L,37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L, -37861L,37862L,37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L, -37871L,37872L,37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L, -37881L,37882L,37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L, -37891L,37892L,37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L, -37901L,37902L,37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L, -37911L,37912L,37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L, -37921L,37922L,37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L, -37931L,37932L,37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L, -37941L,37942L,37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L, -37951L,37952L,37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L, -37961L,37962L,37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L, -37971L,37972L,37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L, -37981L,37982L,37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L, -37991L,37992L,37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L, -38001L,38002L,38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L, -38011L,38012L,38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L, -38021L,38022L,38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L, -38031L,38032L,38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L, -38041L,38042L,38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L, -38051L,38052L,38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L, -38061L,38062L,38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L, -38071L,38072L,38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L, -38081L,38082L,38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L, -38091L,38092L,38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L, -38101L,38102L,38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L, -38111L,38112L,38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L, -38121L,38122L,38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L, -38131L,38132L,38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L, -38141L,38142L,38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L, -38151L,38152L,38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L, -38161L,38162L,38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L, -38171L,38172L,38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L, -38181L,38182L,38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L, -38191L,38192L,38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L, -38201L,38202L,38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L, -38211L,38212L,38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L, -38221L,38222L,38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L, -38231L,38232L,38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L, -38241L,38242L,38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L, -38251L,38252L,38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L, -38261L,38262L,38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L, -38271L,38272L,38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L, -38281L,38282L,38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L, -38291L,38292L,38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L, -38301L,38302L,38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L, -38311L,38312L,38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L, -38321L,38322L,38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L, -38331L,38332L,38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L, -38341L,38342L,38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L, -38351L,38352L,38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L, -38361L,38362L,38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L, -38371L,38372L,38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L, -38381L,38382L,38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L, -38391L,38392L,38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L, -38401L,38402L,38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L, -38411L,38412L,38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L, -38421L,38422L,38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L, -38431L,38432L,38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L, -38441L,38442L,38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L, -38451L,38452L,38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L, -38461L,38462L,38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L, -38471L,38472L,38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L, -38481L,38482L,38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L, -38491L,38492L,38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L, -38501L,38502L,38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L, -38511L,38512L,38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L, -38521L,38522L,38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L, -38531L,38532L,38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L, -38541L,38542L,38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L, -38551L,38552L,38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L, -38561L,38562L,38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L, -38571L,38572L,38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L, -38581L,38582L,38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L, -38591L,38592L,38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L, -38601L,38602L,38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L, -38611L,38612L,38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L, -38621L,38622L,38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L, -38631L,38632L,38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L, -38641L,38642L,38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L, -38651L,38652L,38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L, -38661L,38662L,38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L, -38671L,38672L,38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L, -38681L,38682L,38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L, -38691L,38692L,38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L, -38701L,38702L,38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L, -38711L,38712L,38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L, -38721L,38722L,38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L, -38731L,38732L,38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L, -38741L,38742L,38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L, -38751L,38752L,38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L, -38761L,38762L,38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L, -38771L,38772L,38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L, -38781L,38782L,38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L, -38791L,38792L,38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L, -38801L,38802L,38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L, -38811L,38812L,38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L, -38821L,38822L,38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L, -38831L,38832L,38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L, -38841L,38842L,38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L, -38851L,38852L,38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L, -38861L,38862L,38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L, -38871L,38872L,38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L, -38881L,38882L,38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L, -38891L,38892L,38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L, -38901L,38902L,38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L, -38911L,38912L,38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L, -38921L,38922L,38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L, -38931L,38932L,38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L, -38941L,38942L,38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L, -38951L,38952L,38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L, -38961L,38962L,38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L, -38971L,38972L,38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L, -38981L,38982L,38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L, -38991L,38992L,38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L, -39001L,39002L,39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L, -39011L,39012L,39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L, -39021L,39022L,39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L, -39031L,39032L,39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L, -39041L,39042L,39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L, -39051L,39052L,39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L, -39061L,39062L,39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L, -39071L,39072L,39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L, -39081L,39082L,39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L, -39091L,39092L,39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L, -39101L,39102L,39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L, -39111L,39112L,39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L, -39121L,39122L,39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L, -39131L,39132L,39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L, -39141L,39142L,39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L, -39151L,39152L,39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L, -39161L,39162L,39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L, -39171L,39172L,39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L, -39181L,39182L,39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L, -39191L,39192L,39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L, -39201L,39202L,39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L, -39211L,39212L,39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L, -39221L,39222L,39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L, -39231L,39232L,39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L, -39241L,39242L,39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L, -39251L,39252L,39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L, -39261L,39262L,39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L, -39271L,39272L,39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L, -39281L,39282L,39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L, -39291L,39292L,39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L, -39301L,39302L,39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L, -39311L,39312L,39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L, -39321L,39322L,39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L, -39331L,39332L,39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L, -39341L,39342L,39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L, -39351L,39352L,39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L, -39361L,39362L,39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L, -39371L,39372L,39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L, -39381L,39382L,39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L, -39391L,39392L,39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L, -39401L,39402L,39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L, -39411L,39412L,39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L, -39421L,39422L,39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L, -39431L,39432L,39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L, -39441L,39442L,39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L, -39451L,39452L,39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L, -39461L,39462L,39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L, -39471L,39472L,39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L, -39481L,39482L,39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L, -39491L,39492L,39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L, -39501L,39502L,39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L, -39511L,39512L,39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L, -39521L,39522L,39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L, -39531L,39532L,39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L, -39541L,39542L,39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L, -39551L,39552L,39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L, -39561L,39562L,39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L, -39571L,39572L,39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L, -39581L,39582L,39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L, -39591L,39592L,39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L, -39601L,39602L,39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L, -39611L,39612L,39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L, -39621L,39622L,39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L, -39631L,39632L,39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L, -39641L,39642L,39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L, -39651L,39652L,39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L, -39661L,39662L,39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L, -39671L,39672L,39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L, -39681L,39682L,39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L, -39691L,39692L,39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L, -39701L,39702L,39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L, -39711L,39712L,39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L, -39721L,39722L,39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L, -39731L,39732L,39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L, -39741L,39742L,39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L, -39751L,39752L,39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L, -39761L,39762L,39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L, -39771L,39772L,39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L, -39781L,39782L,39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L, -39791L,39792L,39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L, -39801L,39802L,39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L, -39811L,39812L,39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L, -39821L,39822L,39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L, -39831L,39832L,39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L, -39841L,39842L,39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L, -39851L,39852L,39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L, -39861L,39862L,39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L, -39871L,39872L,39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L, -39881L,39882L,39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L, -39891L,39892L,39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L, -39901L,39902L,39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L, -39911L,39912L,39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L, -39921L,39922L,39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L, -39931L,39932L,39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L, -39941L,39942L,39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L, -39951L,39952L,39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L, -39961L,39962L,39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L, -39971L,39972L,39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L, -39981L,39982L,39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L, -39991L,39992L,39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L, -40001L,40002L,40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L, -40011L,40012L,40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L, -40021L,40022L,40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L, -40031L,40032L,40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L, -40041L,40042L,40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L, -40051L,40052L,40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L, -40061L,40062L,40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L, -40071L,40072L,40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L, -40081L,40082L,40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L, -40091L,40092L,40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L, -40101L,40102L,40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L, -40111L,40112L,40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L, -40121L,40122L,40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L, -40131L,40132L,40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L, -40141L,40142L,40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L, -40151L,40152L,40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L, -40161L,40162L,40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L, -40171L,40172L,40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L, -40181L,40182L,40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L, -40191L,40192L,40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L, -40201L,40202L,40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L, -40211L,40212L,40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L, -40221L,40222L,40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L, -40231L,40232L,40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L, -40241L,40242L,40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L, -40251L,40252L,40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L, -40261L,40262L,40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L, -40271L,40272L,40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L, -40281L,40282L,40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L, -40291L,40292L,40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L, -40301L,40302L,40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L, -40311L,40312L,40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L, -40321L,40322L,40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L, -40331L,40332L,40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L, -40341L,40342L,40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L, -40351L,40352L,40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L, -40361L,40362L,40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L, -40371L,40372L,40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L, -40381L,40382L,40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L, -40391L,40392L,40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L, -40401L,40402L,40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L, -40411L,40412L,40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L, -40421L,40422L,40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L, -40431L,40432L,40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L, -40441L,40442L,40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L, -40451L,40452L,40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L, -40461L,40462L,40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L, -40471L,40472L,40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L, -40481L,40482L,40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L, -40491L,40492L,40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L, -40501L,40502L,40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L, -40511L,40512L,40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L, -40521L,40522L,40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L, -40531L,40532L,40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L, -40541L,40542L,40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L, -40551L,40552L,40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L, -40561L,40562L,40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L, -40571L,40572L,40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L, -40581L,40582L,40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L, -40591L,40592L,40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L, -40601L,40602L,40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L, -40611L,40612L,40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L, -40621L,40622L,40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L, -40631L,40632L,40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L, -40641L,40642L,40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L, -40651L,40652L,40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L, -40661L,40662L,40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L, -40671L,40672L,40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L, -40681L,40682L,40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L, -40691L,40692L,40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L, -40701L,40702L,40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L, -40711L,40712L,40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L, -40721L,40722L,40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L, -40731L,40732L,40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L, -40741L,40742L,40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L, -40751L,40752L,40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L, -40761L,40762L,40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L, -40771L,40772L,40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L, -40781L,40782L,40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L, -40791L,40792L,40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L, -40801L,40802L,40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L, -40811L,40812L,40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L, -40821L,40822L,40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L, -40831L,40832L,40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L, -40841L,40842L,40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L, -40851L,40852L,40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L, -40861L,40862L,40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L, -40871L,40872L,40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L, -40881L,40882L,40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L, -40891L,40892L,40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L, -40901L,40902L,40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L, -40911L,40912L,40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L, -40921L,40922L,40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L, -40931L,40932L,40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L, -40941L,40942L,40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L, -40951L,40952L,40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L, -40961L,40962L,40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L, -40971L,40972L,40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L, -40981L,40982L,40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L, -40991L,40992L,40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L, -41001L,41002L,41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L, -41011L,41012L,41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L, -41021L,41022L,41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L, -41031L,41032L,41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L, -41041L,41042L,41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L, -41051L,41052L,41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L, -41061L,41062L,41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L, -41071L,41072L,41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L, -41081L,41082L,41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L, -41091L,41092L,41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L, -41101L,41102L,41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L, -41111L,41112L,41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L, -41121L,41122L,41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L, -41131L,41132L,41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L, -41141L,41142L,41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L, -41151L,41152L,41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L, -41161L,41162L,41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L, -41171L,41172L,41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L, -41181L,41182L,41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L, -41191L,41192L,41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L, -41201L,41202L,41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L, -41211L,41212L,41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L, -41221L,41222L,41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L, -41231L,41232L,41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L, -41241L,41242L,41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L, -41251L,41252L,41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L, -41261L,41262L,41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L, -41271L,41272L,41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L, -41281L,41282L,41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L, -41291L,41292L,41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L, -41301L,41302L,41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L, -41311L,41312L,41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L, -41321L,41322L,41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L, -41331L,41332L,41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L, -41341L,41342L,41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L, -41351L,41352L,41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L, -41361L,41362L,41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L, -41371L,41372L,41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L, -41381L,41382L,41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L, -41391L,41392L,41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L, -41401L,41402L,41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L, -41411L,41412L,41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L, -41421L,41422L,41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L, -41431L,41432L,41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L, -41441L,41442L,41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L, -41451L,41452L,41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L, -41461L,41462L,41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L, -41471L,41472L,41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L, -41481L,41482L,41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L, -41491L,41492L,41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L, -41501L,41502L,41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L, -41511L,41512L,41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L, -41521L,41522L,41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L, -41531L,41532L,41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L, -41541L,41542L,41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L, -41551L,41552L,41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L, -41561L,41562L,41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L, -41571L,41572L,41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L, -41581L,41582L,41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L, -41591L,41592L,41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L, -41601L,41602L,41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L, -41611L,41612L,41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L, -41621L,41622L,41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L, -41631L,41632L,41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L, -41641L,41642L,41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L, -41651L,41652L,41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L, -41661L,41662L,41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L, -41671L,41672L,41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L, -41681L,41682L,41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L, -41691L,41692L,41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L, -41701L,41702L,41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L, -41711L,41712L,41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L, -41721L,41722L,41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L, -41731L,41732L,41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L, -41741L,41742L,41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L, -41751L,41752L,41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L, -41761L,41762L,41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L, -41771L,41772L,41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L, -41781L,41782L,41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L, -41791L,41792L,41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L, -41801L,41802L,41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L, -41811L,41812L,41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L, -41821L,41822L,41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L, -41831L,41832L,41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L, -41841L,41842L,41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L, -41851L,41852L,41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L, -41861L,41862L,41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L, -41871L,41872L,41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L, -41881L,41882L,41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L, -41891L,41892L,41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L, -41901L,41902L,41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L, -41911L,41912L,41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L, -41921L,41922L,41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L, -41931L,41932L,41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L, -41941L,41942L,41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L, -41951L,41952L,41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L, -41961L,41962L,41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L, -41971L,41972L,41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L, -41981L,41982L,41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L, -41991L,41992L,41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L, -42001L,42002L,42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L, -42011L,42012L,42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L, -42021L,42022L,42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L, -42031L,42032L,42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L, -42041L,42042L,42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L, -42051L,42052L,42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L, -42061L,42062L,42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L, -42071L,42072L,42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L, -42081L,42082L,42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L, -42091L,42092L,42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L, -42101L,42102L,42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L, -42111L,42112L,42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L, -42121L,42122L,42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L, -42131L,42132L,42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L, -42141L,42142L,42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L, -42151L,42152L,42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L, -42161L,42162L,42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L, -42171L,42172L,42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L, -42181L,42182L,42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L, -42191L,42192L,42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L, -42201L,42202L,42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L, -42211L,42212L,42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L, -42221L,42222L,42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L, -42231L,42232L,42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L, -42241L,42242L,42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L, -42251L,42252L,42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L, -42261L,42262L,42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L, -42271L,42272L,42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L, -42281L,42282L,42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L, -42291L,42292L,42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L, -42301L,42302L,42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L, -42311L,42312L,42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L, -42321L,42322L,42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L, -42331L,42332L,42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L, -42341L,42342L,42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L, -42351L,42352L,42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L, -42361L,42362L,42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L, -42371L,42372L,42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L, -42381L,42382L,42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L, -42391L,42392L,42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L, -42401L,42402L,42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L, -42411L,42412L,42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L, -42421L,42422L,42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L, -42431L,42432L,42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L, -42441L,42442L,42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L, -42451L,42452L,42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L, -42461L,42462L,42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L, -42471L,42472L,42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L, -42481L,42482L,42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L, -42491L,42492L,42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L, -42501L,42502L,42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L, -42511L,42512L,42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L, -42521L,42522L,42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L, -42531L,42532L,42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L, -42541L,42542L,42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L, -42551L,42552L,42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L, -42560L,42562L,42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L, -42570L,42572L,42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L, -42580L,42582L,42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L, -42590L,42592L,42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L, -42600L,42602L,42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L, -42611L,42612L,42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L, -42621L,42622L,42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L, -42630L,42632L,42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L, -42640L,42642L,42642L,42644L,42644L,42646L,42646L,42648L,42648L,42650L, -42650L,42652L,42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L, -42661L,42662L,42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L, -42671L,42672L,42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L, -42681L,42682L,42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L, -42691L,42692L,42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L, -42701L,42702L,42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L, -42711L,42712L,42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L, -42721L,42722L,42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L, -42731L,42732L,42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L, -42741L,42742L,42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L, -42751L,42752L,42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L, -42761L,42762L,42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L, -42771L,42772L,42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L, -42781L,42782L,42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L, -42790L,42792L,42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L, -42801L,42802L,42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L, -42810L,42812L,42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L, -42820L,42822L,42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L, -42830L,42832L,42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L, -42840L,42842L,42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L, -42850L,42852L,42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L, -42860L,42862L,42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L, -42871L,42872L,42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L, -42880L,42882L,42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L, -42891L,42891L,42893L,42894L,42895L,42896L,42896L,42898L,42898L,42900L, -42901L,42902L,42902L,42904L,42904L,42906L,42906L,42908L,42908L,42910L, -42910L,42912L,42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L, -42920L,42922L,42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L, -42931L,42932L,42932L,42934L,42934L,42936L,42937L,42938L,42939L,42940L, -42941L,42942L,42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L, -42951L,42952L,42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L, -42961L,42962L,42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L, -42971L,42972L,42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L, -42981L,42982L,42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L, -42991L,42992L,42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L, -43001L,43002L,43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L, -43011L,43012L,43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L, -43021L,43022L,43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L, -43031L,43032L,43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L, -43041L,43042L,43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L, -43051L,43052L,43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L, -43061L,43062L,43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L, -43071L,43072L,43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L, -43081L,43082L,43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L, -43091L,43092L,43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L, -43101L,43102L,43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L, -43111L,43112L,43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L, -43121L,43122L,43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L, -43131L,43132L,43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L, -43141L,43142L,43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L, -43151L,43152L,43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L, -43161L,43162L,43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L, -43171L,43172L,43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L, -43181L,43182L,43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L, -43191L,43192L,43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L, -43201L,43202L,43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L, -43211L,43212L,43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L, -43221L,43222L,43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L, -43231L,43232L,43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L, -43241L,43242L,43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L, -43251L,43252L,43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L, -43261L,43262L,43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L, -43271L,43272L,43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L, -43281L,43282L,43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L, -43291L,43292L,43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L, -43301L,43302L,43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L, -43311L,43312L,43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L, -43321L,43322L,43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L, -43331L,43332L,43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L, -43341L,43342L,43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L, -43351L,43352L,43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L, -43361L,43362L,43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L, -43371L,43372L,43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L, -43381L,43382L,43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L, -43391L,43392L,43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L, -43401L,43402L,43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L, -43411L,43412L,43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L, -43421L,43422L,43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L, -43431L,43432L,43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L, -43441L,43442L,43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L, -43451L,43452L,43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L, -43461L,43462L,43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L, -43471L,43472L,43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L, -43481L,43482L,43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L, -43491L,43492L,43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L, -43501L,43502L,43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L, -43511L,43512L,43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L, -43521L,43522L,43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L, -43531L,43532L,43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L, -43541L,43542L,43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L, -43551L,43552L,43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L, -43561L,43562L,43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L, -43571L,43572L,43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L, -43581L,43582L,43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L, -43591L,43592L,43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L, -43601L,43602L,43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L, -43611L,43612L,43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L, -43621L,43622L,43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L, -43631L,43632L,43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L, -43641L,43642L,43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L, -43651L,43652L,43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L, -43661L,43662L,43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L, -43671L,43672L,43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L, -43681L,43682L,43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L, -43691L,43692L,43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L, -43701L,43702L,43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L, -43711L,43712L,43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L, -43721L,43722L,43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L, -43731L,43732L,43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L, -43741L,43742L,43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L, -43751L,43752L,43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L, -43761L,43762L,43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L, -43771L,43772L,43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L, -43781L,43782L,43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L, -43791L,43792L,43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L, -43801L,43802L,43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L, -43811L,43812L,43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L, -43821L,43822L,43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L, -43831L,43832L,43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L, -43841L,43842L,43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L, -43851L,43852L,43853L,43854L,43855L,43856L,43857L,43858L,42931L,43860L, -43861L,43862L,43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L, -43871L,43872L,43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L, -43881L,43882L,43883L,43884L,43885L,43886L,43887L,5024,5025,5026,5027,5028, -5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043, -5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058, -5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073, -5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088, -5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -43968L,43969L,43970L,43971L,43972L,43973L,43974L,43975L,43976L,43977L, -43978L,43979L,43980L,43981L,43982L,43983L,43984L,43985L,43986L,43987L, -43988L,43989L,43990L,43991L,43992L,43993L,43994L,43995L,43996L,43997L, -43998L,43999L,44000L,44001L,44002L,44003L,44004L,44005L,44006L,44007L, -44008L,44009L,44010L,44011L,44012L,44013L,44014L,44015L,44016L,44017L, -44018L,44019L,44020L,44021L,44022L,44023L,44024L,44025L,44026L,44027L, -44028L,44029L,44030L,44031L,44032L,44033L,44034L,44035L,44036L,44037L, -44038L,44039L,44040L,44041L,44042L,44043L,44044L,44045L,44046L,44047L, -44048L,44049L,44050L,44051L,44052L,44053L,44054L,44055L,44056L,44057L, -44058L,44059L,44060L,44061L,44062L,44063L,44064L,44065L,44066L,44067L, -44068L,44069L,44070L,44071L,44072L,44073L,44074L,44075L,44076L,44077L, -44078L,44079L,44080L,44081L,44082L,44083L,44084L,44085L,44086L,44087L, -44088L,44089L,44090L,44091L,44092L,44093L,44094L,44095L,44096L,44097L, -44098L,44099L,44100L,44101L,44102L,44103L,44104L,44105L,44106L,44107L, -44108L,44109L,44110L,44111L,44112L,44113L,44114L,44115L,44116L,44117L, -44118L,44119L,44120L,44121L,44122L,44123L,44124L,44125L,44126L,44127L, -44128L,44129L,44130L,44131L,44132L,44133L,44134L,44135L,44136L,44137L, -44138L,44139L,44140L,44141L,44142L,44143L,44144L,44145L,44146L,44147L, -44148L,44149L,44150L,44151L,44152L,44153L,44154L,44155L,44156L,44157L, -44158L,44159L,44160L,44161L,44162L,44163L,44164L,44165L,44166L,44167L, -44168L,44169L,44170L,44171L,44172L,44173L,44174L,44175L,44176L,44177L, -44178L,44179L,44180L,44181L,44182L,44183L,44184L,44185L,44186L,44187L, -44188L,44189L,44190L,44191L,44192L,44193L,44194L,44195L,44196L,44197L, -44198L,44199L,44200L,44201L,44202L,44203L,44204L,44205L,44206L,44207L, -44208L,44209L,44210L,44211L,44212L,44213L,44214L,44215L,44216L,44217L, -44218L,44219L,44220L,44221L,44222L,44223L,44224L,44225L,44226L,44227L, -44228L,44229L,44230L,44231L,44232L,44233L,44234L,44235L,44236L,44237L, -44238L,44239L,44240L,44241L,44242L,44243L,44244L,44245L,44246L,44247L, -44248L,44249L,44250L,44251L,44252L,44253L,44254L,44255L,44256L,44257L, -44258L,44259L,44260L,44261L,44262L,44263L,44264L,44265L,44266L,44267L, -44268L,44269L,44270L,44271L,44272L,44273L,44274L,44275L,44276L,44277L, -44278L,44279L,44280L,44281L,44282L,44283L,44284L,44285L,44286L,44287L, -44288L,44289L,44290L,44291L,44292L,44293L,44294L,44295L,44296L,44297L, -44298L,44299L,44300L,44301L,44302L,44303L,44304L,44305L,44306L,44307L, -44308L,44309L,44310L,44311L,44312L,44313L,44314L,44315L,44316L,44317L, -44318L,44319L,44320L,44321L,44322L,44323L,44324L,44325L,44326L,44327L, -44328L,44329L,44330L,44331L,44332L,44333L,44334L,44335L,44336L,44337L, -44338L,44339L,44340L,44341L,44342L,44343L,44344L,44345L,44346L,44347L, -44348L,44349L,44350L,44351L,44352L,44353L,44354L,44355L,44356L,44357L, -44358L,44359L,44360L,44361L,44362L,44363L,44364L,44365L,44366L,44367L, -44368L,44369L,44370L,44371L,44372L,44373L,44374L,44375L,44376L,44377L, -44378L,44379L,44380L,44381L,44382L,44383L,44384L,44385L,44386L,44387L, -44388L,44389L,44390L,44391L,44392L,44393L,44394L,44395L,44396L,44397L, -44398L,44399L,44400L,44401L,44402L,44403L,44404L,44405L,44406L,44407L, -44408L,44409L,44410L,44411L,44412L,44413L,44414L,44415L,44416L,44417L, -44418L,44419L,44420L,44421L,44422L,44423L,44424L,44425L,44426L,44427L, -44428L,44429L,44430L,44431L,44432L,44433L,44434L,44435L,44436L,44437L, -44438L,44439L,44440L,44441L,44442L,44443L,44444L,44445L,44446L,44447L, -44448L,44449L,44450L,44451L,44452L,44453L,44454L,44455L,44456L,44457L, -44458L,44459L,44460L,44461L,44462L,44463L,44464L,44465L,44466L,44467L, -44468L,44469L,44470L,44471L,44472L,44473L,44474L,44475L,44476L,44477L, -44478L,44479L,44480L,44481L,44482L,44483L,44484L,44485L,44486L,44487L, -44488L,44489L,44490L,44491L,44492L,44493L,44494L,44495L,44496L,44497L, -44498L,44499L,44500L,44501L,44502L,44503L,44504L,44505L,44506L,44507L, -44508L,44509L,44510L,44511L,44512L,44513L,44514L,44515L,44516L,44517L, -44518L,44519L,44520L,44521L,44522L,44523L,44524L,44525L,44526L,44527L, -44528L,44529L,44530L,44531L,44532L,44533L,44534L,44535L,44536L,44537L, -44538L,44539L,44540L,44541L,44542L,44543L,44544L,44545L,44546L,44547L, -44548L,44549L,44550L,44551L,44552L,44553L,44554L,44555L,44556L,44557L, -44558L,44559L,44560L,44561L,44562L,44563L,44564L,44565L,44566L,44567L, -44568L,44569L,44570L,44571L,44572L,44573L,44574L,44575L,44576L,44577L, -44578L,44579L,44580L,44581L,44582L,44583L,44584L,44585L,44586L,44587L, -44588L,44589L,44590L,44591L,44592L,44593L,44594L,44595L,44596L,44597L, -44598L,44599L,44600L,44601L,44602L,44603L,44604L,44605L,44606L,44607L, -44608L,44609L,44610L,44611L,44612L,44613L,44614L,44615L,44616L,44617L, -44618L,44619L,44620L,44621L,44622L,44623L,44624L,44625L,44626L,44627L, -44628L,44629L,44630L,44631L,44632L,44633L,44634L,44635L,44636L,44637L, -44638L,44639L,44640L,44641L,44642L,44643L,44644L,44645L,44646L,44647L, -44648L,44649L,44650L,44651L,44652L,44653L,44654L,44655L,44656L,44657L, -44658L,44659L,44660L,44661L,44662L,44663L,44664L,44665L,44666L,44667L, -44668L,44669L,44670L,44671L,44672L,44673L,44674L,44675L,44676L,44677L, -44678L,44679L,44680L,44681L,44682L,44683L,44684L,44685L,44686L,44687L, -44688L,44689L,44690L,44691L,44692L,44693L,44694L,44695L,44696L,44697L, -44698L,44699L,44700L,44701L,44702L,44703L,44704L,44705L,44706L,44707L, -44708L,44709L,44710L,44711L,44712L,44713L,44714L,44715L,44716L,44717L, -44718L,44719L,44720L,44721L,44722L,44723L,44724L,44725L,44726L,44727L, -44728L,44729L,44730L,44731L,44732L,44733L,44734L,44735L,44736L,44737L, -44738L,44739L,44740L,44741L,44742L,44743L,44744L,44745L,44746L,44747L, -44748L,44749L,44750L,44751L,44752L,44753L,44754L,44755L,44756L,44757L, -44758L,44759L,44760L,44761L,44762L,44763L,44764L,44765L,44766L,44767L, -44768L,44769L,44770L,44771L,44772L,44773L,44774L,44775L,44776L,44777L, -44778L,44779L,44780L,44781L,44782L,44783L,44784L,44785L,44786L,44787L, -44788L,44789L,44790L,44791L,44792L,44793L,44794L,44795L,44796L,44797L, -44798L,44799L,44800L,44801L,44802L,44803L,44804L,44805L,44806L,44807L, -44808L,44809L,44810L,44811L,44812L,44813L,44814L,44815L,44816L,44817L, -44818L,44819L,44820L,44821L,44822L,44823L,44824L,44825L,44826L,44827L, -44828L,44829L,44830L,44831L,44832L,44833L,44834L,44835L,44836L,44837L, -44838L,44839L,44840L,44841L,44842L,44843L,44844L,44845L,44846L,44847L, -44848L,44849L,44850L,44851L,44852L,44853L,44854L,44855L,44856L,44857L, -44858L,44859L,44860L,44861L,44862L,44863L,44864L,44865L,44866L,44867L, -44868L,44869L,44870L,44871L,44872L,44873L,44874L,44875L,44876L,44877L, -44878L,44879L,44880L,44881L,44882L,44883L,44884L,44885L,44886L,44887L, -44888L,44889L,44890L,44891L,44892L,44893L,44894L,44895L,44896L,44897L, -44898L,44899L,44900L,44901L,44902L,44903L,44904L,44905L,44906L,44907L, -44908L,44909L,44910L,44911L,44912L,44913L,44914L,44915L,44916L,44917L, -44918L,44919L,44920L,44921L,44922L,44923L,44924L,44925L,44926L,44927L, -44928L,44929L,44930L,44931L,44932L,44933L,44934L,44935L,44936L,44937L, -44938L,44939L,44940L,44941L,44942L,44943L,44944L,44945L,44946L,44947L, -44948L,44949L,44950L,44951L,44952L,44953L,44954L,44955L,44956L,44957L, -44958L,44959L,44960L,44961L,44962L,44963L,44964L,44965L,44966L,44967L, -44968L,44969L,44970L,44971L,44972L,44973L,44974L,44975L,44976L,44977L, -44978L,44979L,44980L,44981L,44982L,44983L,44984L,44985L,44986L,44987L, -44988L,44989L,44990L,44991L,44992L,44993L,44994L,44995L,44996L,44997L, -44998L,44999L,45000L,45001L,45002L,45003L,45004L,45005L,45006L,45007L, -45008L,45009L,45010L,45011L,45012L,45013L,45014L,45015L,45016L,45017L, -45018L,45019L,45020L,45021L,45022L,45023L,45024L,45025L,45026L,45027L, -45028L,45029L,45030L,45031L,45032L,45033L,45034L,45035L,45036L,45037L, -45038L,45039L,45040L,45041L,45042L,45043L,45044L,45045L,45046L,45047L, -45048L,45049L,45050L,45051L,45052L,45053L,45054L,45055L,45056L,45057L, -45058L,45059L,45060L,45061L,45062L,45063L,45064L,45065L,45066L,45067L, -45068L,45069L,45070L,45071L,45072L,45073L,45074L,45075L,45076L,45077L, -45078L,45079L,45080L,45081L,45082L,45083L,45084L,45085L,45086L,45087L, -45088L,45089L,45090L,45091L,45092L,45093L,45094L,45095L,45096L,45097L, -45098L,45099L,45100L,45101L,45102L,45103L,45104L,45105L,45106L,45107L, -45108L,45109L,45110L,45111L,45112L,45113L,45114L,45115L,45116L,45117L, -45118L,45119L,45120L,45121L,45122L,45123L,45124L,45125L,45126L,45127L, -45128L,45129L,45130L,45131L,45132L,45133L,45134L,45135L,45136L,45137L, -45138L,45139L,45140L,45141L,45142L,45143L,45144L,45145L,45146L,45147L, -45148L,45149L,45150L,45151L,45152L,45153L,45154L,45155L,45156L,45157L, -45158L,45159L,45160L,45161L,45162L,45163L,45164L,45165L,45166L,45167L, -45168L,45169L,45170L,45171L,45172L,45173L,45174L,45175L,45176L,45177L, -45178L,45179L,45180L,45181L,45182L,45183L,45184L,45185L,45186L,45187L, -45188L,45189L,45190L,45191L,45192L,45193L,45194L,45195L,45196L,45197L, -45198L,45199L,45200L,45201L,45202L,45203L,45204L,45205L,45206L,45207L, -45208L,45209L,45210L,45211L,45212L,45213L,45214L,45215L,45216L,45217L, -45218L,45219L,45220L,45221L,45222L,45223L,45224L,45225L,45226L,45227L, -45228L,45229L,45230L,45231L,45232L,45233L,45234L,45235L,45236L,45237L, -45238L,45239L,45240L,45241L,45242L,45243L,45244L,45245L,45246L,45247L, -45248L,45249L,45250L,45251L,45252L,45253L,45254L,45255L,45256L,45257L, -45258L,45259L,45260L,45261L,45262L,45263L,45264L,45265L,45266L,45267L, -45268L,45269L,45270L,45271L,45272L,45273L,45274L,45275L,45276L,45277L, -45278L,45279L,45280L,45281L,45282L,45283L,45284L,45285L,45286L,45287L, -45288L,45289L,45290L,45291L,45292L,45293L,45294L,45295L,45296L,45297L, -45298L,45299L,45300L,45301L,45302L,45303L,45304L,45305L,45306L,45307L, -45308L,45309L,45310L,45311L,45312L,45313L,45314L,45315L,45316L,45317L, -45318L,45319L,45320L,45321L,45322L,45323L,45324L,45325L,45326L,45327L, -45328L,45329L,45330L,45331L,45332L,45333L,45334L,45335L,45336L,45337L, -45338L,45339L,45340L,45341L,45342L,45343L,45344L,45345L,45346L,45347L, -45348L,45349L,45350L,45351L,45352L,45353L,45354L,45355L,45356L,45357L, -45358L,45359L,45360L,45361L,45362L,45363L,45364L,45365L,45366L,45367L, -45368L,45369L,45370L,45371L,45372L,45373L,45374L,45375L,45376L,45377L, -45378L,45379L,45380L,45381L,45382L,45383L,45384L,45385L,45386L,45387L, -45388L,45389L,45390L,45391L,45392L,45393L,45394L,45395L,45396L,45397L, -45398L,45399L,45400L,45401L,45402L,45403L,45404L,45405L,45406L,45407L, -45408L,45409L,45410L,45411L,45412L,45413L,45414L,45415L,45416L,45417L, -45418L,45419L,45420L,45421L,45422L,45423L,45424L,45425L,45426L,45427L, -45428L,45429L,45430L,45431L,45432L,45433L,45434L,45435L,45436L,45437L, -45438L,45439L,45440L,45441L,45442L,45443L,45444L,45445L,45446L,45447L, -45448L,45449L,45450L,45451L,45452L,45453L,45454L,45455L,45456L,45457L, -45458L,45459L,45460L,45461L,45462L,45463L,45464L,45465L,45466L,45467L, -45468L,45469L,45470L,45471L,45472L,45473L,45474L,45475L,45476L,45477L, -45478L,45479L,45480L,45481L,45482L,45483L,45484L,45485L,45486L,45487L, -45488L,45489L,45490L,45491L,45492L,45493L,45494L,45495L,45496L,45497L, -45498L,45499L,45500L,45501L,45502L,45503L,45504L,45505L,45506L,45507L, -45508L,45509L,45510L,45511L,45512L,45513L,45514L,45515L,45516L,45517L, -45518L,45519L,45520L,45521L,45522L,45523L,45524L,45525L,45526L,45527L, -45528L,45529L,45530L,45531L,45532L,45533L,45534L,45535L,45536L,45537L, -45538L,45539L,45540L,45541L,45542L,45543L,45544L,45545L,45546L,45547L, -45548L,45549L,45550L,45551L,45552L,45553L,45554L,45555L,45556L,45557L, -45558L,45559L,45560L,45561L,45562L,45563L,45564L,45565L,45566L,45567L, -45568L,45569L,45570L,45571L,45572L,45573L,45574L,45575L,45576L,45577L, -45578L,45579L,45580L,45581L,45582L,45583L,45584L,45585L,45586L,45587L, -45588L,45589L,45590L,45591L,45592L,45593L,45594L,45595L,45596L,45597L, -45598L,45599L,45600L,45601L,45602L,45603L,45604L,45605L,45606L,45607L, -45608L,45609L,45610L,45611L,45612L,45613L,45614L,45615L,45616L,45617L, -45618L,45619L,45620L,45621L,45622L,45623L,45624L,45625L,45626L,45627L, -45628L,45629L,45630L,45631L,45632L,45633L,45634L,45635L,45636L,45637L, -45638L,45639L,45640L,45641L,45642L,45643L,45644L,45645L,45646L,45647L, -45648L,45649L,45650L,45651L,45652L,45653L,45654L,45655L,45656L,45657L, -45658L,45659L,45660L,45661L,45662L,45663L,45664L,45665L,45666L,45667L, -45668L,45669L,45670L,45671L,45672L,45673L,45674L,45675L,45676L,45677L, -45678L,45679L,45680L,45681L,45682L,45683L,45684L,45685L,45686L,45687L, -45688L,45689L,45690L,45691L,45692L,45693L,45694L,45695L,45696L,45697L, -45698L,45699L,45700L,45701L,45702L,45703L,45704L,45705L,45706L,45707L, -45708L,45709L,45710L,45711L,45712L,45713L,45714L,45715L,45716L,45717L, -45718L,45719L,45720L,45721L,45722L,45723L,45724L,45725L,45726L,45727L, -45728L,45729L,45730L,45731L,45732L,45733L,45734L,45735L,45736L,45737L, -45738L,45739L,45740L,45741L,45742L,45743L,45744L,45745L,45746L,45747L, -45748L,45749L,45750L,45751L,45752L,45753L,45754L,45755L,45756L,45757L, -45758L,45759L,45760L,45761L,45762L,45763L,45764L,45765L,45766L,45767L, -45768L,45769L,45770L,45771L,45772L,45773L,45774L,45775L,45776L,45777L, -45778L,45779L,45780L,45781L,45782L,45783L,45784L,45785L,45786L,45787L, -45788L,45789L,45790L,45791L,45792L,45793L,45794L,45795L,45796L,45797L, -45798L,45799L,45800L,45801L,45802L,45803L,45804L,45805L,45806L,45807L, -45808L,45809L,45810L,45811L,45812L,45813L,45814L,45815L,45816L,45817L, -45818L,45819L,45820L,45821L,45822L,45823L,45824L,45825L,45826L,45827L, -45828L,45829L,45830L,45831L,45832L,45833L,45834L,45835L,45836L,45837L, -45838L,45839L,45840L,45841L,45842L,45843L,45844L,45845L,45846L,45847L, -45848L,45849L,45850L,45851L,45852L,45853L,45854L,45855L,45856L,45857L, -45858L,45859L,45860L,45861L,45862L,45863L,45864L,45865L,45866L,45867L, -45868L,45869L,45870L,45871L,45872L,45873L,45874L,45875L,45876L,45877L, -45878L,45879L,45880L,45881L,45882L,45883L,45884L,45885L,45886L,45887L, -45888L,45889L,45890L,45891L,45892L,45893L,45894L,45895L,45896L,45897L, -45898L,45899L,45900L,45901L,45902L,45903L,45904L,45905L,45906L,45907L, -45908L,45909L,45910L,45911L,45912L,45913L,45914L,45915L,45916L,45917L, -45918L,45919L,45920L,45921L,45922L,45923L,45924L,45925L,45926L,45927L, -45928L,45929L,45930L,45931L,45932L,45933L,45934L,45935L,45936L,45937L, -45938L,45939L,45940L,45941L,45942L,45943L,45944L,45945L,45946L,45947L, -45948L,45949L,45950L,45951L,45952L,45953L,45954L,45955L,45956L,45957L, -45958L,45959L,45960L,45961L,45962L,45963L,45964L,45965L,45966L,45967L, -45968L,45969L,45970L,45971L,45972L,45973L,45974L,45975L,45976L,45977L, -45978L,45979L,45980L,45981L,45982L,45983L,45984L,45985L,45986L,45987L, -45988L,45989L,45990L,45991L,45992L,45993L,45994L,45995L,45996L,45997L, -45998L,45999L,46000L,46001L,46002L,46003L,46004L,46005L,46006L,46007L, -46008L,46009L,46010L,46011L,46012L,46013L,46014L,46015L,46016L,46017L, -46018L,46019L,46020L,46021L,46022L,46023L,46024L,46025L,46026L,46027L, -46028L,46029L,46030L,46031L,46032L,46033L,46034L,46035L,46036L,46037L, -46038L,46039L,46040L,46041L,46042L,46043L,46044L,46045L,46046L,46047L, -46048L,46049L,46050L,46051L,46052L,46053L,46054L,46055L,46056L,46057L, -46058L,46059L,46060L,46061L,46062L,46063L,46064L,46065L,46066L,46067L, -46068L,46069L,46070L,46071L,46072L,46073L,46074L,46075L,46076L,46077L, -46078L,46079L,46080L,46081L,46082L,46083L,46084L,46085L,46086L,46087L, -46088L,46089L,46090L,46091L,46092L,46093L,46094L,46095L,46096L,46097L, -46098L,46099L,46100L,46101L,46102L,46103L,46104L,46105L,46106L,46107L, -46108L,46109L,46110L,46111L,46112L,46113L,46114L,46115L,46116L,46117L, -46118L,46119L,46120L,46121L,46122L,46123L,46124L,46125L,46126L,46127L, -46128L,46129L,46130L,46131L,46132L,46133L,46134L,46135L,46136L,46137L, -46138L,46139L,46140L,46141L,46142L,46143L,46144L,46145L,46146L,46147L, -46148L,46149L,46150L,46151L,46152L,46153L,46154L,46155L,46156L,46157L, -46158L,46159L,46160L,46161L,46162L,46163L,46164L,46165L,46166L,46167L, -46168L,46169L,46170L,46171L,46172L,46173L,46174L,46175L,46176L,46177L, -46178L,46179L,46180L,46181L,46182L,46183L,46184L,46185L,46186L,46187L, -46188L,46189L,46190L,46191L,46192L,46193L,46194L,46195L,46196L,46197L, -46198L,46199L,46200L,46201L,46202L,46203L,46204L,46205L,46206L,46207L, -46208L,46209L,46210L,46211L,46212L,46213L,46214L,46215L,46216L,46217L, -46218L,46219L,46220L,46221L,46222L,46223L,46224L,46225L,46226L,46227L, -46228L,46229L,46230L,46231L,46232L,46233L,46234L,46235L,46236L,46237L, -46238L,46239L,46240L,46241L,46242L,46243L,46244L,46245L,46246L,46247L, -46248L,46249L,46250L,46251L,46252L,46253L,46254L,46255L,46256L,46257L, -46258L,46259L,46260L,46261L,46262L,46263L,46264L,46265L,46266L,46267L, -46268L,46269L,46270L,46271L,46272L,46273L,46274L,46275L,46276L,46277L, -46278L,46279L,46280L,46281L,46282L,46283L,46284L,46285L,46286L,46287L, -46288L,46289L,46290L,46291L,46292L,46293L,46294L,46295L,46296L,46297L, -46298L,46299L,46300L,46301L,46302L,46303L,46304L,46305L,46306L,46307L, -46308L,46309L,46310L,46311L,46312L,46313L,46314L,46315L,46316L,46317L, -46318L,46319L,46320L,46321L,46322L,46323L,46324L,46325L,46326L,46327L, -46328L,46329L,46330L,46331L,46332L,46333L,46334L,46335L,46336L,46337L, -46338L,46339L,46340L,46341L,46342L,46343L,46344L,46345L,46346L,46347L, -46348L,46349L,46350L,46351L,46352L,46353L,46354L,46355L,46356L,46357L, -46358L,46359L,46360L,46361L,46362L,46363L,46364L,46365L,46366L,46367L, -46368L,46369L,46370L,46371L,46372L,46373L,46374L,46375L,46376L,46377L, -46378L,46379L,46380L,46381L,46382L,46383L,46384L,46385L,46386L,46387L, -46388L,46389L,46390L,46391L,46392L,46393L,46394L,46395L,46396L,46397L, -46398L,46399L,46400L,46401L,46402L,46403L,46404L,46405L,46406L,46407L, -46408L,46409L,46410L,46411L,46412L,46413L,46414L,46415L,46416L,46417L, -46418L,46419L,46420L,46421L,46422L,46423L,46424L,46425L,46426L,46427L, -46428L,46429L,46430L,46431L,46432L,46433L,46434L,46435L,46436L,46437L, -46438L,46439L,46440L,46441L,46442L,46443L,46444L,46445L,46446L,46447L, -46448L,46449L,46450L,46451L,46452L,46453L,46454L,46455L,46456L,46457L, -46458L,46459L,46460L,46461L,46462L,46463L,46464L,46465L,46466L,46467L, -46468L,46469L,46470L,46471L,46472L,46473L,46474L,46475L,46476L,46477L, -46478L,46479L,46480L,46481L,46482L,46483L,46484L,46485L,46486L,46487L, -46488L,46489L,46490L,46491L,46492L,46493L,46494L,46495L,46496L,46497L, -46498L,46499L,46500L,46501L,46502L,46503L,46504L,46505L,46506L,46507L, -46508L,46509L,46510L,46511L,46512L,46513L,46514L,46515L,46516L,46517L, -46518L,46519L,46520L,46521L,46522L,46523L,46524L,46525L,46526L,46527L, -46528L,46529L,46530L,46531L,46532L,46533L,46534L,46535L,46536L,46537L, -46538L,46539L,46540L,46541L,46542L,46543L,46544L,46545L,46546L,46547L, -46548L,46549L,46550L,46551L,46552L,46553L,46554L,46555L,46556L,46557L, -46558L,46559L,46560L,46561L,46562L,46563L,46564L,46565L,46566L,46567L, -46568L,46569L,46570L,46571L,46572L,46573L,46574L,46575L,46576L,46577L, -46578L,46579L,46580L,46581L,46582L,46583L,46584L,46585L,46586L,46587L, -46588L,46589L,46590L,46591L,46592L,46593L,46594L,46595L,46596L,46597L, -46598L,46599L,46600L,46601L,46602L,46603L,46604L,46605L,46606L,46607L, -46608L,46609L,46610L,46611L,46612L,46613L,46614L,46615L,46616L,46617L, -46618L,46619L,46620L,46621L,46622L,46623L,46624L,46625L,46626L,46627L, -46628L,46629L,46630L,46631L,46632L,46633L,46634L,46635L,46636L,46637L, -46638L,46639L,46640L,46641L,46642L,46643L,46644L,46645L,46646L,46647L, -46648L,46649L,46650L,46651L,46652L,46653L,46654L,46655L,46656L,46657L, -46658L,46659L,46660L,46661L,46662L,46663L,46664L,46665L,46666L,46667L, -46668L,46669L,46670L,46671L,46672L,46673L,46674L,46675L,46676L,46677L, -46678L,46679L,46680L,46681L,46682L,46683L,46684L,46685L,46686L,46687L, -46688L,46689L,46690L,46691L,46692L,46693L,46694L,46695L,46696L,46697L, -46698L,46699L,46700L,46701L,46702L,46703L,46704L,46705L,46706L,46707L, -46708L,46709L,46710L,46711L,46712L,46713L,46714L,46715L,46716L,46717L, -46718L,46719L,46720L,46721L,46722L,46723L,46724L,46725L,46726L,46727L, -46728L,46729L,46730L,46731L,46732L,46733L,46734L,46735L,46736L,46737L, -46738L,46739L,46740L,46741L,46742L,46743L,46744L,46745L,46746L,46747L, -46748L,46749L,46750L,46751L,46752L,46753L,46754L,46755L,46756L,46757L, -46758L,46759L,46760L,46761L,46762L,46763L,46764L,46765L,46766L,46767L, -46768L,46769L,46770L,46771L,46772L,46773L,46774L,46775L,46776L,46777L, -46778L,46779L,46780L,46781L,46782L,46783L,46784L,46785L,46786L,46787L, -46788L,46789L,46790L,46791L,46792L,46793L,46794L,46795L,46796L,46797L, -46798L,46799L,46800L,46801L,46802L,46803L,46804L,46805L,46806L,46807L, -46808L,46809L,46810L,46811L,46812L,46813L,46814L,46815L,46816L,46817L, -46818L,46819L,46820L,46821L,46822L,46823L,46824L,46825L,46826L,46827L, -46828L,46829L,46830L,46831L,46832L,46833L,46834L,46835L,46836L,46837L, -46838L,46839L,46840L,46841L,46842L,46843L,46844L,46845L,46846L,46847L, -46848L,46849L,46850L,46851L,46852L,46853L,46854L,46855L,46856L,46857L, -46858L,46859L,46860L,46861L,46862L,46863L,46864L,46865L,46866L,46867L, -46868L,46869L,46870L,46871L,46872L,46873L,46874L,46875L,46876L,46877L, -46878L,46879L,46880L,46881L,46882L,46883L,46884L,46885L,46886L,46887L, -46888L,46889L,46890L,46891L,46892L,46893L,46894L,46895L,46896L,46897L, -46898L,46899L,46900L,46901L,46902L,46903L,46904L,46905L,46906L,46907L, -46908L,46909L,46910L,46911L,46912L,46913L,46914L,46915L,46916L,46917L, -46918L,46919L,46920L,46921L,46922L,46923L,46924L,46925L,46926L,46927L, -46928L,46929L,46930L,46931L,46932L,46933L,46934L,46935L,46936L,46937L, -46938L,46939L,46940L,46941L,46942L,46943L,46944L,46945L,46946L,46947L, -46948L,46949L,46950L,46951L,46952L,46953L,46954L,46955L,46956L,46957L, -46958L,46959L,46960L,46961L,46962L,46963L,46964L,46965L,46966L,46967L, -46968L,46969L,46970L,46971L,46972L,46973L,46974L,46975L,46976L,46977L, -46978L,46979L,46980L,46981L,46982L,46983L,46984L,46985L,46986L,46987L, -46988L,46989L,46990L,46991L,46992L,46993L,46994L,46995L,46996L,46997L, -46998L,46999L,47000L,47001L,47002L,47003L,47004L,47005L,47006L,47007L, -47008L,47009L,47010L,47011L,47012L,47013L,47014L,47015L,47016L,47017L, -47018L,47019L,47020L,47021L,47022L,47023L,47024L,47025L,47026L,47027L, -47028L,47029L,47030L,47031L,47032L,47033L,47034L,47035L,47036L,47037L, -47038L,47039L,47040L,47041L,47042L,47043L,47044L,47045L,47046L,47047L, -47048L,47049L,47050L,47051L,47052L,47053L,47054L,47055L,47056L,47057L, -47058L,47059L,47060L,47061L,47062L,47063L,47064L,47065L,47066L,47067L, -47068L,47069L,47070L,47071L,47072L,47073L,47074L,47075L,47076L,47077L, -47078L,47079L,47080L,47081L,47082L,47083L,47084L,47085L,47086L,47087L, -47088L,47089L,47090L,47091L,47092L,47093L,47094L,47095L,47096L,47097L, -47098L,47099L,47100L,47101L,47102L,47103L,47104L,47105L,47106L,47107L, -47108L,47109L,47110L,47111L,47112L,47113L,47114L,47115L,47116L,47117L, -47118L,47119L,47120L,47121L,47122L,47123L,47124L,47125L,47126L,47127L, -47128L,47129L,47130L,47131L,47132L,47133L,47134L,47135L,47136L,47137L, -47138L,47139L,47140L,47141L,47142L,47143L,47144L,47145L,47146L,47147L, -47148L,47149L,47150L,47151L,47152L,47153L,47154L,47155L,47156L,47157L, -47158L,47159L,47160L,47161L,47162L,47163L,47164L,47165L,47166L,47167L, -47168L,47169L,47170L,47171L,47172L,47173L,47174L,47175L,47176L,47177L, -47178L,47179L,47180L,47181L,47182L,47183L,47184L,47185L,47186L,47187L, -47188L,47189L,47190L,47191L,47192L,47193L,47194L,47195L,47196L,47197L, -47198L,47199L,47200L,47201L,47202L,47203L,47204L,47205L,47206L,47207L, -47208L,47209L,47210L,47211L,47212L,47213L,47214L,47215L,47216L,47217L, -47218L,47219L,47220L,47221L,47222L,47223L,47224L,47225L,47226L,47227L, -47228L,47229L,47230L,47231L,47232L,47233L,47234L,47235L,47236L,47237L, -47238L,47239L,47240L,47241L,47242L,47243L,47244L,47245L,47246L,47247L, -47248L,47249L,47250L,47251L,47252L,47253L,47254L,47255L,47256L,47257L, -47258L,47259L,47260L,47261L,47262L,47263L,47264L,47265L,47266L,47267L, -47268L,47269L,47270L,47271L,47272L,47273L,47274L,47275L,47276L,47277L, -47278L,47279L,47280L,47281L,47282L,47283L,47284L,47285L,47286L,47287L, -47288L,47289L,47290L,47291L,47292L,47293L,47294L,47295L,47296L,47297L, -47298L,47299L,47300L,47301L,47302L,47303L,47304L,47305L,47306L,47307L, -47308L,47309L,47310L,47311L,47312L,47313L,47314L,47315L,47316L,47317L, -47318L,47319L,47320L,47321L,47322L,47323L,47324L,47325L,47326L,47327L, -47328L,47329L,47330L,47331L,47332L,47333L,47334L,47335L,47336L,47337L, -47338L,47339L,47340L,47341L,47342L,47343L,47344L,47345L,47346L,47347L, -47348L,47349L,47350L,47351L,47352L,47353L,47354L,47355L,47356L,47357L, -47358L,47359L,47360L,47361L,47362L,47363L,47364L,47365L,47366L,47367L, -47368L,47369L,47370L,47371L,47372L,47373L,47374L,47375L,47376L,47377L, -47378L,47379L,47380L,47381L,47382L,47383L,47384L,47385L,47386L,47387L, -47388L,47389L,47390L,47391L,47392L,47393L,47394L,47395L,47396L,47397L, -47398L,47399L,47400L,47401L,47402L,47403L,47404L,47405L,47406L,47407L, -47408L,47409L,47410L,47411L,47412L,47413L,47414L,47415L,47416L,47417L, -47418L,47419L,47420L,47421L,47422L,47423L,47424L,47425L,47426L,47427L, -47428L,47429L,47430L,47431L,47432L,47433L,47434L,47435L,47436L,47437L, -47438L,47439L,47440L,47441L,47442L,47443L,47444L,47445L,47446L,47447L, -47448L,47449L,47450L,47451L,47452L,47453L,47454L,47455L,47456L,47457L, -47458L,47459L,47460L,47461L,47462L,47463L,47464L,47465L,47466L,47467L, -47468L,47469L,47470L,47471L,47472L,47473L,47474L,47475L,47476L,47477L, -47478L,47479L,47480L,47481L,47482L,47483L,47484L,47485L,47486L,47487L, -47488L,47489L,47490L,47491L,47492L,47493L,47494L,47495L,47496L,47497L, -47498L,47499L,47500L,47501L,47502L,47503L,47504L,47505L,47506L,47507L, -47508L,47509L,47510L,47511L,47512L,47513L,47514L,47515L,47516L,47517L, -47518L,47519L,47520L,47521L,47522L,47523L,47524L,47525L,47526L,47527L, -47528L,47529L,47530L,47531L,47532L,47533L,47534L,47535L,47536L,47537L, -47538L,47539L,47540L,47541L,47542L,47543L,47544L,47545L,47546L,47547L, -47548L,47549L,47550L,47551L,47552L,47553L,47554L,47555L,47556L,47557L, -47558L,47559L,47560L,47561L,47562L,47563L,47564L,47565L,47566L,47567L, -47568L,47569L,47570L,47571L,47572L,47573L,47574L,47575L,47576L,47577L, -47578L,47579L,47580L,47581L,47582L,47583L,47584L,47585L,47586L,47587L, -47588L,47589L,47590L,47591L,47592L,47593L,47594L,47595L,47596L,47597L, -47598L,47599L,47600L,47601L,47602L,47603L,47604L,47605L,47606L,47607L, -47608L,47609L,47610L,47611L,47612L,47613L,47614L,47615L,47616L,47617L, -47618L,47619L,47620L,47621L,47622L,47623L,47624L,47625L,47626L,47627L, -47628L,47629L,47630L,47631L,47632L,47633L,47634L,47635L,47636L,47637L, -47638L,47639L,47640L,47641L,47642L,47643L,47644L,47645L,47646L,47647L, -47648L,47649L,47650L,47651L,47652L,47653L,47654L,47655L,47656L,47657L, -47658L,47659L,47660L,47661L,47662L,47663L,47664L,47665L,47666L,47667L, -47668L,47669L,47670L,47671L,47672L,47673L,47674L,47675L,47676L,47677L, -47678L,47679L,47680L,47681L,47682L,47683L,47684L,47685L,47686L,47687L, -47688L,47689L,47690L,47691L,47692L,47693L,47694L,47695L,47696L,47697L, -47698L,47699L,47700L,47701L,47702L,47703L,47704L,47705L,47706L,47707L, -47708L,47709L,47710L,47711L,47712L,47713L,47714L,47715L,47716L,47717L, -47718L,47719L,47720L,47721L,47722L,47723L,47724L,47725L,47726L,47727L, -47728L,47729L,47730L,47731L,47732L,47733L,47734L,47735L,47736L,47737L, -47738L,47739L,47740L,47741L,47742L,47743L,47744L,47745L,47746L,47747L, -47748L,47749L,47750L,47751L,47752L,47753L,47754L,47755L,47756L,47757L, -47758L,47759L,47760L,47761L,47762L,47763L,47764L,47765L,47766L,47767L, -47768L,47769L,47770L,47771L,47772L,47773L,47774L,47775L,47776L,47777L, -47778L,47779L,47780L,47781L,47782L,47783L,47784L,47785L,47786L,47787L, -47788L,47789L,47790L,47791L,47792L,47793L,47794L,47795L,47796L,47797L, -47798L,47799L,47800L,47801L,47802L,47803L,47804L,47805L,47806L,47807L, -47808L,47809L,47810L,47811L,47812L,47813L,47814L,47815L,47816L,47817L, -47818L,47819L,47820L,47821L,47822L,47823L,47824L,47825L,47826L,47827L, -47828L,47829L,47830L,47831L,47832L,47833L,47834L,47835L,47836L,47837L, -47838L,47839L,47840L,47841L,47842L,47843L,47844L,47845L,47846L,47847L, -47848L,47849L,47850L,47851L,47852L,47853L,47854L,47855L,47856L,47857L, -47858L,47859L,47860L,47861L,47862L,47863L,47864L,47865L,47866L,47867L, -47868L,47869L,47870L,47871L,47872L,47873L,47874L,47875L,47876L,47877L, -47878L,47879L,47880L,47881L,47882L,47883L,47884L,47885L,47886L,47887L, -47888L,47889L,47890L,47891L,47892L,47893L,47894L,47895L,47896L,47897L, -47898L,47899L,47900L,47901L,47902L,47903L,47904L,47905L,47906L,47907L, -47908L,47909L,47910L,47911L,47912L,47913L,47914L,47915L,47916L,47917L, -47918L,47919L,47920L,47921L,47922L,47923L,47924L,47925L,47926L,47927L, -47928L,47929L,47930L,47931L,47932L,47933L,47934L,47935L,47936L,47937L, -47938L,47939L,47940L,47941L,47942L,47943L,47944L,47945L,47946L,47947L, -47948L,47949L,47950L,47951L,47952L,47953L,47954L,47955L,47956L,47957L, -47958L,47959L,47960L,47961L,47962L,47963L,47964L,47965L,47966L,47967L, -47968L,47969L,47970L,47971L,47972L,47973L,47974L,47975L,47976L,47977L, -47978L,47979L,47980L,47981L,47982L,47983L,47984L,47985L,47986L,47987L, -47988L,47989L,47990L,47991L,47992L,47993L,47994L,47995L,47996L,47997L, -47998L,47999L,48000L,48001L,48002L,48003L,48004L,48005L,48006L,48007L, -48008L,48009L,48010L,48011L,48012L,48013L,48014L,48015L,48016L,48017L, -48018L,48019L,48020L,48021L,48022L,48023L,48024L,48025L,48026L,48027L, -48028L,48029L,48030L,48031L,48032L,48033L,48034L,48035L,48036L,48037L, -48038L,48039L,48040L,48041L,48042L,48043L,48044L,48045L,48046L,48047L, -48048L,48049L,48050L,48051L,48052L,48053L,48054L,48055L,48056L,48057L, -48058L,48059L,48060L,48061L,48062L,48063L,48064L,48065L,48066L,48067L, -48068L,48069L,48070L,48071L,48072L,48073L,48074L,48075L,48076L,48077L, -48078L,48079L,48080L,48081L,48082L,48083L,48084L,48085L,48086L,48087L, -48088L,48089L,48090L,48091L,48092L,48093L,48094L,48095L,48096L,48097L, -48098L,48099L,48100L,48101L,48102L,48103L,48104L,48105L,48106L,48107L, -48108L,48109L,48110L,48111L,48112L,48113L,48114L,48115L,48116L,48117L, -48118L,48119L,48120L,48121L,48122L,48123L,48124L,48125L,48126L,48127L, -48128L,48129L,48130L,48131L,48132L,48133L,48134L,48135L,48136L,48137L, -48138L,48139L,48140L,48141L,48142L,48143L,48144L,48145L,48146L,48147L, -48148L,48149L,48150L,48151L,48152L,48153L,48154L,48155L,48156L,48157L, -48158L,48159L,48160L,48161L,48162L,48163L,48164L,48165L,48166L,48167L, -48168L,48169L,48170L,48171L,48172L,48173L,48174L,48175L,48176L,48177L, -48178L,48179L,48180L,48181L,48182L,48183L,48184L,48185L,48186L,48187L, -48188L,48189L,48190L,48191L,48192L,48193L,48194L,48195L,48196L,48197L, -48198L,48199L,48200L,48201L,48202L,48203L,48204L,48205L,48206L,48207L, -48208L,48209L,48210L,48211L,48212L,48213L,48214L,48215L,48216L,48217L, -48218L,48219L,48220L,48221L,48222L,48223L,48224L,48225L,48226L,48227L, -48228L,48229L,48230L,48231L,48232L,48233L,48234L,48235L,48236L,48237L, -48238L,48239L,48240L,48241L,48242L,48243L,48244L,48245L,48246L,48247L, -48248L,48249L,48250L,48251L,48252L,48253L,48254L,48255L,48256L,48257L, -48258L,48259L,48260L,48261L,48262L,48263L,48264L,48265L,48266L,48267L, -48268L,48269L,48270L,48271L,48272L,48273L,48274L,48275L,48276L,48277L, -48278L,48279L,48280L,48281L,48282L,48283L,48284L,48285L,48286L,48287L, -48288L,48289L,48290L,48291L,48292L,48293L,48294L,48295L,48296L,48297L, -48298L,48299L,48300L,48301L,48302L,48303L,48304L,48305L,48306L,48307L, -48308L,48309L,48310L,48311L,48312L,48313L,48314L,48315L,48316L,48317L, -48318L,48319L,48320L,48321L,48322L,48323L,48324L,48325L,48326L,48327L, -48328L,48329L,48330L,48331L,48332L,48333L,48334L,48335L,48336L,48337L, -48338L,48339L,48340L,48341L,48342L,48343L,48344L,48345L,48346L,48347L, -48348L,48349L,48350L,48351L,48352L,48353L,48354L,48355L,48356L,48357L, -48358L,48359L,48360L,48361L,48362L,48363L,48364L,48365L,48366L,48367L, -48368L,48369L,48370L,48371L,48372L,48373L,48374L,48375L,48376L,48377L, -48378L,48379L,48380L,48381L,48382L,48383L,48384L,48385L,48386L,48387L, -48388L,48389L,48390L,48391L,48392L,48393L,48394L,48395L,48396L,48397L, -48398L,48399L,48400L,48401L,48402L,48403L,48404L,48405L,48406L,48407L, -48408L,48409L,48410L,48411L,48412L,48413L,48414L,48415L,48416L,48417L, -48418L,48419L,48420L,48421L,48422L,48423L,48424L,48425L,48426L,48427L, -48428L,48429L,48430L,48431L,48432L,48433L,48434L,48435L,48436L,48437L, -48438L,48439L,48440L,48441L,48442L,48443L,48444L,48445L,48446L,48447L, -48448L,48449L,48450L,48451L,48452L,48453L,48454L,48455L,48456L,48457L, -48458L,48459L,48460L,48461L,48462L,48463L,48464L,48465L,48466L,48467L, -48468L,48469L,48470L,48471L,48472L,48473L,48474L,48475L,48476L,48477L, -48478L,48479L,48480L,48481L,48482L,48483L,48484L,48485L,48486L,48487L, -48488L,48489L,48490L,48491L,48492L,48493L,48494L,48495L,48496L,48497L, -48498L,48499L,48500L,48501L,48502L,48503L,48504L,48505L,48506L,48507L, -48508L,48509L,48510L,48511L,48512L,48513L,48514L,48515L,48516L,48517L, -48518L,48519L,48520L,48521L,48522L,48523L,48524L,48525L,48526L,48527L, -48528L,48529L,48530L,48531L,48532L,48533L,48534L,48535L,48536L,48537L, -48538L,48539L,48540L,48541L,48542L,48543L,48544L,48545L,48546L,48547L, -48548L,48549L,48550L,48551L,48552L,48553L,48554L,48555L,48556L,48557L, -48558L,48559L,48560L,48561L,48562L,48563L,48564L,48565L,48566L,48567L, -48568L,48569L,48570L,48571L,48572L,48573L,48574L,48575L,48576L,48577L, -48578L,48579L,48580L,48581L,48582L,48583L,48584L,48585L,48586L,48587L, -48588L,48589L,48590L,48591L,48592L,48593L,48594L,48595L,48596L,48597L, -48598L,48599L,48600L,48601L,48602L,48603L,48604L,48605L,48606L,48607L, -48608L,48609L,48610L,48611L,48612L,48613L,48614L,48615L,48616L,48617L, -48618L,48619L,48620L,48621L,48622L,48623L,48624L,48625L,48626L,48627L, -48628L,48629L,48630L,48631L,48632L,48633L,48634L,48635L,48636L,48637L, -48638L,48639L,48640L,48641L,48642L,48643L,48644L,48645L,48646L,48647L, -48648L,48649L,48650L,48651L,48652L,48653L,48654L,48655L,48656L,48657L, -48658L,48659L,48660L,48661L,48662L,48663L,48664L,48665L,48666L,48667L, -48668L,48669L,48670L,48671L,48672L,48673L,48674L,48675L,48676L,48677L, -48678L,48679L,48680L,48681L,48682L,48683L,48684L,48685L,48686L,48687L, -48688L,48689L,48690L,48691L,48692L,48693L,48694L,48695L,48696L,48697L, -48698L,48699L,48700L,48701L,48702L,48703L,48704L,48705L,48706L,48707L, -48708L,48709L,48710L,48711L,48712L,48713L,48714L,48715L,48716L,48717L, -48718L,48719L,48720L,48721L,48722L,48723L,48724L,48725L,48726L,48727L, -48728L,48729L,48730L,48731L,48732L,48733L,48734L,48735L,48736L,48737L, -48738L,48739L,48740L,48741L,48742L,48743L,48744L,48745L,48746L,48747L, -48748L,48749L,48750L,48751L,48752L,48753L,48754L,48755L,48756L,48757L, -48758L,48759L,48760L,48761L,48762L,48763L,48764L,48765L,48766L,48767L, -48768L,48769L,48770L,48771L,48772L,48773L,48774L,48775L,48776L,48777L, -48778L,48779L,48780L,48781L,48782L,48783L,48784L,48785L,48786L,48787L, -48788L,48789L,48790L,48791L,48792L,48793L,48794L,48795L,48796L,48797L, -48798L,48799L,48800L,48801L,48802L,48803L,48804L,48805L,48806L,48807L, -48808L,48809L,48810L,48811L,48812L,48813L,48814L,48815L,48816L,48817L, -48818L,48819L,48820L,48821L,48822L,48823L,48824L,48825L,48826L,48827L, -48828L,48829L,48830L,48831L,48832L,48833L,48834L,48835L,48836L,48837L, -48838L,48839L,48840L,48841L,48842L,48843L,48844L,48845L,48846L,48847L, -48848L,48849L,48850L,48851L,48852L,48853L,48854L,48855L,48856L,48857L, -48858L,48859L,48860L,48861L,48862L,48863L,48864L,48865L,48866L,48867L, -48868L,48869L,48870L,48871L,48872L,48873L,48874L,48875L,48876L,48877L, -48878L,48879L,48880L,48881L,48882L,48883L,48884L,48885L,48886L,48887L, -48888L,48889L,48890L,48891L,48892L,48893L,48894L,48895L,48896L,48897L, -48898L,48899L,48900L,48901L,48902L,48903L,48904L,48905L,48906L,48907L, -48908L,48909L,48910L,48911L,48912L,48913L,48914L,48915L,48916L,48917L, -48918L,48919L,48920L,48921L,48922L,48923L,48924L,48925L,48926L,48927L, -48928L,48929L,48930L,48931L,48932L,48933L,48934L,48935L,48936L,48937L, -48938L,48939L,48940L,48941L,48942L,48943L,48944L,48945L,48946L,48947L, -48948L,48949L,48950L,48951L,48952L,48953L,48954L,48955L,48956L,48957L, -48958L,48959L,48960L,48961L,48962L,48963L,48964L,48965L,48966L,48967L, -48968L,48969L,48970L,48971L,48972L,48973L,48974L,48975L,48976L,48977L, -48978L,48979L,48980L,48981L,48982L,48983L,48984L,48985L,48986L,48987L, -48988L,48989L,48990L,48991L,48992L,48993L,48994L,48995L,48996L,48997L, -48998L,48999L,49000L,49001L,49002L,49003L,49004L,49005L,49006L,49007L, -49008L,49009L,49010L,49011L,49012L,49013L,49014L,49015L,49016L,49017L, -49018L,49019L,49020L,49021L,49022L,49023L,49024L,49025L,49026L,49027L, -49028L,49029L,49030L,49031L,49032L,49033L,49034L,49035L,49036L,49037L, -49038L,49039L,49040L,49041L,49042L,49043L,49044L,49045L,49046L,49047L, -49048L,49049L,49050L,49051L,49052L,49053L,49054L,49055L,49056L,49057L, -49058L,49059L,49060L,49061L,49062L,49063L,49064L,49065L,49066L,49067L, -49068L,49069L,49070L,49071L,49072L,49073L,49074L,49075L,49076L,49077L, -49078L,49079L,49080L,49081L,49082L,49083L,49084L,49085L,49086L,49087L, -49088L,49089L,49090L,49091L,49092L,49093L,49094L,49095L,49096L,49097L, -49098L,49099L,49100L,49101L,49102L,49103L,49104L,49105L,49106L,49107L, -49108L,49109L,49110L,49111L,49112L,49113L,49114L,49115L,49116L,49117L, -49118L,49119L,49120L,49121L,49122L,49123L,49124L,49125L,49126L,49127L, -49128L,49129L,49130L,49131L,49132L,49133L,49134L,49135L,49136L,49137L, -49138L,49139L,49140L,49141L,49142L,49143L,49144L,49145L,49146L,49147L, -49148L,49149L,49150L,49151L,49152L,49153L,49154L,49155L,49156L,49157L, -49158L,49159L,49160L,49161L,49162L,49163L,49164L,49165L,49166L,49167L, -49168L,49169L,49170L,49171L,49172L,49173L,49174L,49175L,49176L,49177L, -49178L,49179L,49180L,49181L,49182L,49183L,49184L,49185L,49186L,49187L, -49188L,49189L,49190L,49191L,49192L,49193L,49194L,49195L,49196L,49197L, -49198L,49199L,49200L,49201L,49202L,49203L,49204L,49205L,49206L,49207L, -49208L,49209L,49210L,49211L,49212L,49213L,49214L,49215L,49216L,49217L, -49218L,49219L,49220L,49221L,49222L,49223L,49224L,49225L,49226L,49227L, -49228L,49229L,49230L,49231L,49232L,49233L,49234L,49235L,49236L,49237L, -49238L,49239L,49240L,49241L,49242L,49243L,49244L,49245L,49246L,49247L, -49248L,49249L,49250L,49251L,49252L,49253L,49254L,49255L,49256L,49257L, -49258L,49259L,49260L,49261L,49262L,49263L,49264L,49265L,49266L,49267L, -49268L,49269L,49270L,49271L,49272L,49273L,49274L,49275L,49276L,49277L, -49278L,49279L,49280L,49281L,49282L,49283L,49284L,49285L,49286L,49287L, -49288L,49289L,49290L,49291L,49292L,49293L,49294L,49295L,49296L,49297L, -49298L,49299L,49300L,49301L,49302L,49303L,49304L,49305L,49306L,49307L, -49308L,49309L,49310L,49311L,49312L,49313L,49314L,49315L,49316L,49317L, -49318L,49319L,49320L,49321L,49322L,49323L,49324L,49325L,49326L,49327L, -49328L,49329L,49330L,49331L,49332L,49333L,49334L,49335L,49336L,49337L, -49338L,49339L,49340L,49341L,49342L,49343L,49344L,49345L,49346L,49347L, -49348L,49349L,49350L,49351L,49352L,49353L,49354L,49355L,49356L,49357L, -49358L,49359L,49360L,49361L,49362L,49363L,49364L,49365L,49366L,49367L, -49368L,49369L,49370L,49371L,49372L,49373L,49374L,49375L,49376L,49377L, -49378L,49379L,49380L,49381L,49382L,49383L,49384L,49385L,49386L,49387L, -49388L,49389L,49390L,49391L,49392L,49393L,49394L,49395L,49396L,49397L, -49398L,49399L,49400L,49401L,49402L,49403L,49404L,49405L,49406L,49407L, -49408L,49409L,49410L,49411L,49412L,49413L,49414L,49415L,49416L,49417L, -49418L,49419L,49420L,49421L,49422L,49423L,49424L,49425L,49426L,49427L, -49428L,49429L,49430L,49431L,49432L,49433L,49434L,49435L,49436L,49437L, -49438L,49439L,49440L,49441L,49442L,49443L,49444L,49445L,49446L,49447L, -49448L,49449L,49450L,49451L,49452L,49453L,49454L,49455L,49456L,49457L, -49458L,49459L,49460L,49461L,49462L,49463L,49464L,49465L,49466L,49467L, -49468L,49469L,49470L,49471L,49472L,49473L,49474L,49475L,49476L,49477L, -49478L,49479L,49480L,49481L,49482L,49483L,49484L,49485L,49486L,49487L, -49488L,49489L,49490L,49491L,49492L,49493L,49494L,49495L,49496L,49497L, -49498L,49499L,49500L,49501L,49502L,49503L,49504L,49505L,49506L,49507L, -49508L,49509L,49510L,49511L,49512L,49513L,49514L,49515L,49516L,49517L, -49518L,49519L,49520L,49521L,49522L,49523L,49524L,49525L,49526L,49527L, -49528L,49529L,49530L,49531L,49532L,49533L,49534L,49535L,49536L,49537L, -49538L,49539L,49540L,49541L,49542L,49543L,49544L,49545L,49546L,49547L, -49548L,49549L,49550L,49551L,49552L,49553L,49554L,49555L,49556L,49557L, -49558L,49559L,49560L,49561L,49562L,49563L,49564L,49565L,49566L,49567L, -49568L,49569L,49570L,49571L,49572L,49573L,49574L,49575L,49576L,49577L, -49578L,49579L,49580L,49581L,49582L,49583L,49584L,49585L,49586L,49587L, -49588L,49589L,49590L,49591L,49592L,49593L,49594L,49595L,49596L,49597L, -49598L,49599L,49600L,49601L,49602L,49603L,49604L,49605L,49606L,49607L, -49608L,49609L,49610L,49611L,49612L,49613L,49614L,49615L,49616L,49617L, -49618L,49619L,49620L,49621L,49622L,49623L,49624L,49625L,49626L,49627L, -49628L,49629L,49630L,49631L,49632L,49633L,49634L,49635L,49636L,49637L, -49638L,49639L,49640L,49641L,49642L,49643L,49644L,49645L,49646L,49647L, -49648L,49649L,49650L,49651L,49652L,49653L,49654L,49655L,49656L,49657L, -49658L,49659L,49660L,49661L,49662L,49663L,49664L,49665L,49666L,49667L, -49668L,49669L,49670L,49671L,49672L,49673L,49674L,49675L,49676L,49677L, -49678L,49679L,49680L,49681L,49682L,49683L,49684L,49685L,49686L,49687L, -49688L,49689L,49690L,49691L,49692L,49693L,49694L,49695L,49696L,49697L, -49698L,49699L,49700L,49701L,49702L,49703L,49704L,49705L,49706L,49707L, -49708L,49709L,49710L,49711L,49712L,49713L,49714L,49715L,49716L,49717L, -49718L,49719L,49720L,49721L,49722L,49723L,49724L,49725L,49726L,49727L, -49728L,49729L,49730L,49731L,49732L,49733L,49734L,49735L,49736L,49737L, -49738L,49739L,49740L,49741L,49742L,49743L,49744L,49745L,49746L,49747L, -49748L,49749L,49750L,49751L,49752L,49753L,49754L,49755L,49756L,49757L, -49758L,49759L,49760L,49761L,49762L,49763L,49764L,49765L,49766L,49767L, -49768L,49769L,49770L,49771L,49772L,49773L,49774L,49775L,49776L,49777L, -49778L,49779L,49780L,49781L,49782L,49783L,49784L,49785L,49786L,49787L, -49788L,49789L,49790L,49791L,49792L,49793L,49794L,49795L,49796L,49797L, -49798L,49799L,49800L,49801L,49802L,49803L,49804L,49805L,49806L,49807L, -49808L,49809L,49810L,49811L,49812L,49813L,49814L,49815L,49816L,49817L, -49818L,49819L,49820L,49821L,49822L,49823L,49824L,49825L,49826L,49827L, -49828L,49829L,49830L,49831L,49832L,49833L,49834L,49835L,49836L,49837L, -49838L,49839L,49840L,49841L,49842L,49843L,49844L,49845L,49846L,49847L, -49848L,49849L,49850L,49851L,49852L,49853L,49854L,49855L,49856L,49857L, -49858L,49859L,49860L,49861L,49862L,49863L,49864L,49865L,49866L,49867L, -49868L,49869L,49870L,49871L,49872L,49873L,49874L,49875L,49876L,49877L, -49878L,49879L,49880L,49881L,49882L,49883L,49884L,49885L,49886L,49887L, -49888L,49889L,49890L,49891L,49892L,49893L,49894L,49895L,49896L,49897L, -49898L,49899L,49900L,49901L,49902L,49903L,49904L,49905L,49906L,49907L, -49908L,49909L,49910L,49911L,49912L,49913L,49914L,49915L,49916L,49917L, -49918L,49919L,49920L,49921L,49922L,49923L,49924L,49925L,49926L,49927L, -49928L,49929L,49930L,49931L,49932L,49933L,49934L,49935L,49936L,49937L, -49938L,49939L,49940L,49941L,49942L,49943L,49944L,49945L,49946L,49947L, -49948L,49949L,49950L,49951L,49952L,49953L,49954L,49955L,49956L,49957L, -49958L,49959L,49960L,49961L,49962L,49963L,49964L,49965L,49966L,49967L, -49968L,49969L,49970L,49971L,49972L,49973L,49974L,49975L,49976L,49977L, -49978L,49979L,49980L,49981L,49982L,49983L,49984L,49985L,49986L,49987L, -49988L,49989L,49990L,49991L,49992L,49993L,49994L,49995L,49996L,49997L, -49998L,49999L,50000L,50001L,50002L,50003L,50004L,50005L,50006L,50007L, -50008L,50009L,50010L,50011L,50012L,50013L,50014L,50015L,50016L,50017L, -50018L,50019L,50020L,50021L,50022L,50023L,50024L,50025L,50026L,50027L, -50028L,50029L,50030L,50031L,50032L,50033L,50034L,50035L,50036L,50037L, -50038L,50039L,50040L,50041L,50042L,50043L,50044L,50045L,50046L,50047L, -50048L,50049L,50050L,50051L,50052L,50053L,50054L,50055L,50056L,50057L, -50058L,50059L,50060L,50061L,50062L,50063L,50064L,50065L,50066L,50067L, -50068L,50069L,50070L,50071L,50072L,50073L,50074L,50075L,50076L,50077L, -50078L,50079L,50080L,50081L,50082L,50083L,50084L,50085L,50086L,50087L, -50088L,50089L,50090L,50091L,50092L,50093L,50094L,50095L,50096L,50097L, -50098L,50099L,50100L,50101L,50102L,50103L,50104L,50105L,50106L,50107L, -50108L,50109L,50110L,50111L,50112L,50113L,50114L,50115L,50116L,50117L, -50118L,50119L,50120L,50121L,50122L,50123L,50124L,50125L,50126L,50127L, -50128L,50129L,50130L,50131L,50132L,50133L,50134L,50135L,50136L,50137L, -50138L,50139L,50140L,50141L,50142L,50143L,50144L,50145L,50146L,50147L, -50148L,50149L,50150L,50151L,50152L,50153L,50154L,50155L,50156L,50157L, -50158L,50159L,50160L,50161L,50162L,50163L,50164L,50165L,50166L,50167L, -50168L,50169L,50170L,50171L,50172L,50173L,50174L,50175L,50176L,50177L, -50178L,50179L,50180L,50181L,50182L,50183L,50184L,50185L,50186L,50187L, -50188L,50189L,50190L,50191L,50192L,50193L,50194L,50195L,50196L,50197L, -50198L,50199L,50200L,50201L,50202L,50203L,50204L,50205L,50206L,50207L, -50208L,50209L,50210L,50211L,50212L,50213L,50214L,50215L,50216L,50217L, -50218L,50219L,50220L,50221L,50222L,50223L,50224L,50225L,50226L,50227L, -50228L,50229L,50230L,50231L,50232L,50233L,50234L,50235L,50236L,50237L, -50238L,50239L,50240L,50241L,50242L,50243L,50244L,50245L,50246L,50247L, -50248L,50249L,50250L,50251L,50252L,50253L,50254L,50255L,50256L,50257L, -50258L,50259L,50260L,50261L,50262L,50263L,50264L,50265L,50266L,50267L, -50268L,50269L,50270L,50271L,50272L,50273L,50274L,50275L,50276L,50277L, -50278L,50279L,50280L,50281L,50282L,50283L,50284L,50285L,50286L,50287L, -50288L,50289L,50290L,50291L,50292L,50293L,50294L,50295L,50296L,50297L, -50298L,50299L,50300L,50301L,50302L,50303L,50304L,50305L,50306L,50307L, -50308L,50309L,50310L,50311L,50312L,50313L,50314L,50315L,50316L,50317L, -50318L,50319L,50320L,50321L,50322L,50323L,50324L,50325L,50326L,50327L, -50328L,50329L,50330L,50331L,50332L,50333L,50334L,50335L,50336L,50337L, -50338L,50339L,50340L,50341L,50342L,50343L,50344L,50345L,50346L,50347L, -50348L,50349L,50350L,50351L,50352L,50353L,50354L,50355L,50356L,50357L, -50358L,50359L,50360L,50361L,50362L,50363L,50364L,50365L,50366L,50367L, -50368L,50369L,50370L,50371L,50372L,50373L,50374L,50375L,50376L,50377L, -50378L,50379L,50380L,50381L,50382L,50383L,50384L,50385L,50386L,50387L, -50388L,50389L,50390L,50391L,50392L,50393L,50394L,50395L,50396L,50397L, -50398L,50399L,50400L,50401L,50402L,50403L,50404L,50405L,50406L,50407L, -50408L,50409L,50410L,50411L,50412L,50413L,50414L,50415L,50416L,50417L, -50418L,50419L,50420L,50421L,50422L,50423L,50424L,50425L,50426L,50427L, -50428L,50429L,50430L,50431L,50432L,50433L,50434L,50435L,50436L,50437L, -50438L,50439L,50440L,50441L,50442L,50443L,50444L,50445L,50446L,50447L, -50448L,50449L,50450L,50451L,50452L,50453L,50454L,50455L,50456L,50457L, -50458L,50459L,50460L,50461L,50462L,50463L,50464L,50465L,50466L,50467L, -50468L,50469L,50470L,50471L,50472L,50473L,50474L,50475L,50476L,50477L, -50478L,50479L,50480L,50481L,50482L,50483L,50484L,50485L,50486L,50487L, -50488L,50489L,50490L,50491L,50492L,50493L,50494L,50495L,50496L,50497L, -50498L,50499L,50500L,50501L,50502L,50503L,50504L,50505L,50506L,50507L, -50508L,50509L,50510L,50511L,50512L,50513L,50514L,50515L,50516L,50517L, -50518L,50519L,50520L,50521L,50522L,50523L,50524L,50525L,50526L,50527L, -50528L,50529L,50530L,50531L,50532L,50533L,50534L,50535L,50536L,50537L, -50538L,50539L,50540L,50541L,50542L,50543L,50544L,50545L,50546L,50547L, -50548L,50549L,50550L,50551L,50552L,50553L,50554L,50555L,50556L,50557L, -50558L,50559L,50560L,50561L,50562L,50563L,50564L,50565L,50566L,50567L, -50568L,50569L,50570L,50571L,50572L,50573L,50574L,50575L,50576L,50577L, -50578L,50579L,50580L,50581L,50582L,50583L,50584L,50585L,50586L,50587L, -50588L,50589L,50590L,50591L,50592L,50593L,50594L,50595L,50596L,50597L, -50598L,50599L,50600L,50601L,50602L,50603L,50604L,50605L,50606L,50607L, -50608L,50609L,50610L,50611L,50612L,50613L,50614L,50615L,50616L,50617L, -50618L,50619L,50620L,50621L,50622L,50623L,50624L,50625L,50626L,50627L, -50628L,50629L,50630L,50631L,50632L,50633L,50634L,50635L,50636L,50637L, -50638L,50639L,50640L,50641L,50642L,50643L,50644L,50645L,50646L,50647L, -50648L,50649L,50650L,50651L,50652L,50653L,50654L,50655L,50656L,50657L, -50658L,50659L,50660L,50661L,50662L,50663L,50664L,50665L,50666L,50667L, -50668L,50669L,50670L,50671L,50672L,50673L,50674L,50675L,50676L,50677L, -50678L,50679L,50680L,50681L,50682L,50683L,50684L,50685L,50686L,50687L, -50688L,50689L,50690L,50691L,50692L,50693L,50694L,50695L,50696L,50697L, -50698L,50699L,50700L,50701L,50702L,50703L,50704L,50705L,50706L,50707L, -50708L,50709L,50710L,50711L,50712L,50713L,50714L,50715L,50716L,50717L, -50718L,50719L,50720L,50721L,50722L,50723L,50724L,50725L,50726L,50727L, -50728L,50729L,50730L,50731L,50732L,50733L,50734L,50735L,50736L,50737L, -50738L,50739L,50740L,50741L,50742L,50743L,50744L,50745L,50746L,50747L, -50748L,50749L,50750L,50751L,50752L,50753L,50754L,50755L,50756L,50757L, -50758L,50759L,50760L,50761L,50762L,50763L,50764L,50765L,50766L,50767L, -50768L,50769L,50770L,50771L,50772L,50773L,50774L,50775L,50776L,50777L, -50778L,50779L,50780L,50781L,50782L,50783L,50784L,50785L,50786L,50787L, -50788L,50789L,50790L,50791L,50792L,50793L,50794L,50795L,50796L,50797L, -50798L,50799L,50800L,50801L,50802L,50803L,50804L,50805L,50806L,50807L, -50808L,50809L,50810L,50811L,50812L,50813L,50814L,50815L,50816L,50817L, -50818L,50819L,50820L,50821L,50822L,50823L,50824L,50825L,50826L,50827L, -50828L,50829L,50830L,50831L,50832L,50833L,50834L,50835L,50836L,50837L, -50838L,50839L,50840L,50841L,50842L,50843L,50844L,50845L,50846L,50847L, -50848L,50849L,50850L,50851L,50852L,50853L,50854L,50855L,50856L,50857L, -50858L,50859L,50860L,50861L,50862L,50863L,50864L,50865L,50866L,50867L, -50868L,50869L,50870L,50871L,50872L,50873L,50874L,50875L,50876L,50877L, -50878L,50879L,50880L,50881L,50882L,50883L,50884L,50885L,50886L,50887L, -50888L,50889L,50890L,50891L,50892L,50893L,50894L,50895L,50896L,50897L, -50898L,50899L,50900L,50901L,50902L,50903L,50904L,50905L,50906L,50907L, -50908L,50909L,50910L,50911L,50912L,50913L,50914L,50915L,50916L,50917L, -50918L,50919L,50920L,50921L,50922L,50923L,50924L,50925L,50926L,50927L, -50928L,50929L,50930L,50931L,50932L,50933L,50934L,50935L,50936L,50937L, -50938L,50939L,50940L,50941L,50942L,50943L,50944L,50945L,50946L,50947L, -50948L,50949L,50950L,50951L,50952L,50953L,50954L,50955L,50956L,50957L, -50958L,50959L,50960L,50961L,50962L,50963L,50964L,50965L,50966L,50967L, -50968L,50969L,50970L,50971L,50972L,50973L,50974L,50975L,50976L,50977L, -50978L,50979L,50980L,50981L,50982L,50983L,50984L,50985L,50986L,50987L, -50988L,50989L,50990L,50991L,50992L,50993L,50994L,50995L,50996L,50997L, -50998L,50999L,51000L,51001L,51002L,51003L,51004L,51005L,51006L,51007L, -51008L,51009L,51010L,51011L,51012L,51013L,51014L,51015L,51016L,51017L, -51018L,51019L,51020L,51021L,51022L,51023L,51024L,51025L,51026L,51027L, -51028L,51029L,51030L,51031L,51032L,51033L,51034L,51035L,51036L,51037L, -51038L,51039L,51040L,51041L,51042L,51043L,51044L,51045L,51046L,51047L, -51048L,51049L,51050L,51051L,51052L,51053L,51054L,51055L,51056L,51057L, -51058L,51059L,51060L,51061L,51062L,51063L,51064L,51065L,51066L,51067L, -51068L,51069L,51070L,51071L,51072L,51073L,51074L,51075L,51076L,51077L, -51078L,51079L,51080L,51081L,51082L,51083L,51084L,51085L,51086L,51087L, -51088L,51089L,51090L,51091L,51092L,51093L,51094L,51095L,51096L,51097L, -51098L,51099L,51100L,51101L,51102L,51103L,51104L,51105L,51106L,51107L, -51108L,51109L,51110L,51111L,51112L,51113L,51114L,51115L,51116L,51117L, -51118L,51119L,51120L,51121L,51122L,51123L,51124L,51125L,51126L,51127L, -51128L,51129L,51130L,51131L,51132L,51133L,51134L,51135L,51136L,51137L, -51138L,51139L,51140L,51141L,51142L,51143L,51144L,51145L,51146L,51147L, -51148L,51149L,51150L,51151L,51152L,51153L,51154L,51155L,51156L,51157L, -51158L,51159L,51160L,51161L,51162L,51163L,51164L,51165L,51166L,51167L, -51168L,51169L,51170L,51171L,51172L,51173L,51174L,51175L,51176L,51177L, -51178L,51179L,51180L,51181L,51182L,51183L,51184L,51185L,51186L,51187L, -51188L,51189L,51190L,51191L,51192L,51193L,51194L,51195L,51196L,51197L, -51198L,51199L,51200L,51201L,51202L,51203L,51204L,51205L,51206L,51207L, -51208L,51209L,51210L,51211L,51212L,51213L,51214L,51215L,51216L,51217L, -51218L,51219L,51220L,51221L,51222L,51223L,51224L,51225L,51226L,51227L, -51228L,51229L,51230L,51231L,51232L,51233L,51234L,51235L,51236L,51237L, -51238L,51239L,51240L,51241L,51242L,51243L,51244L,51245L,51246L,51247L, -51248L,51249L,51250L,51251L,51252L,51253L,51254L,51255L,51256L,51257L, -51258L,51259L,51260L,51261L,51262L,51263L,51264L,51265L,51266L,51267L, -51268L,51269L,51270L,51271L,51272L,51273L,51274L,51275L,51276L,51277L, -51278L,51279L,51280L,51281L,51282L,51283L,51284L,51285L,51286L,51287L, -51288L,51289L,51290L,51291L,51292L,51293L,51294L,51295L,51296L,51297L, -51298L,51299L,51300L,51301L,51302L,51303L,51304L,51305L,51306L,51307L, -51308L,51309L,51310L,51311L,51312L,51313L,51314L,51315L,51316L,51317L, -51318L,51319L,51320L,51321L,51322L,51323L,51324L,51325L,51326L,51327L, -51328L,51329L,51330L,51331L,51332L,51333L,51334L,51335L,51336L,51337L, -51338L,51339L,51340L,51341L,51342L,51343L,51344L,51345L,51346L,51347L, -51348L,51349L,51350L,51351L,51352L,51353L,51354L,51355L,51356L,51357L, -51358L,51359L,51360L,51361L,51362L,51363L,51364L,51365L,51366L,51367L, -51368L,51369L,51370L,51371L,51372L,51373L,51374L,51375L,51376L,51377L, -51378L,51379L,51380L,51381L,51382L,51383L,51384L,51385L,51386L,51387L, -51388L,51389L,51390L,51391L,51392L,51393L,51394L,51395L,51396L,51397L, -51398L,51399L,51400L,51401L,51402L,51403L,51404L,51405L,51406L,51407L, -51408L,51409L,51410L,51411L,51412L,51413L,51414L,51415L,51416L,51417L, -51418L,51419L,51420L,51421L,51422L,51423L,51424L,51425L,51426L,51427L, -51428L,51429L,51430L,51431L,51432L,51433L,51434L,51435L,51436L,51437L, -51438L,51439L,51440L,51441L,51442L,51443L,51444L,51445L,51446L,51447L, -51448L,51449L,51450L,51451L,51452L,51453L,51454L,51455L,51456L,51457L, -51458L,51459L,51460L,51461L,51462L,51463L,51464L,51465L,51466L,51467L, -51468L,51469L,51470L,51471L,51472L,51473L,51474L,51475L,51476L,51477L, -51478L,51479L,51480L,51481L,51482L,51483L,51484L,51485L,51486L,51487L, -51488L,51489L,51490L,51491L,51492L,51493L,51494L,51495L,51496L,51497L, -51498L,51499L,51500L,51501L,51502L,51503L,51504L,51505L,51506L,51507L, -51508L,51509L,51510L,51511L,51512L,51513L,51514L,51515L,51516L,51517L, -51518L,51519L,51520L,51521L,51522L,51523L,51524L,51525L,51526L,51527L, -51528L,51529L,51530L,51531L,51532L,51533L,51534L,51535L,51536L,51537L, -51538L,51539L,51540L,51541L,51542L,51543L,51544L,51545L,51546L,51547L, -51548L,51549L,51550L,51551L,51552L,51553L,51554L,51555L,51556L,51557L, -51558L,51559L,51560L,51561L,51562L,51563L,51564L,51565L,51566L,51567L, -51568L,51569L,51570L,51571L,51572L,51573L,51574L,51575L,51576L,51577L, -51578L,51579L,51580L,51581L,51582L,51583L,51584L,51585L,51586L,51587L, -51588L,51589L,51590L,51591L,51592L,51593L,51594L,51595L,51596L,51597L, -51598L,51599L,51600L,51601L,51602L,51603L,51604L,51605L,51606L,51607L, -51608L,51609L,51610L,51611L,51612L,51613L,51614L,51615L,51616L,51617L, -51618L,51619L,51620L,51621L,51622L,51623L,51624L,51625L,51626L,51627L, -51628L,51629L,51630L,51631L,51632L,51633L,51634L,51635L,51636L,51637L, -51638L,51639L,51640L,51641L,51642L,51643L,51644L,51645L,51646L,51647L, -51648L,51649L,51650L,51651L,51652L,51653L,51654L,51655L,51656L,51657L, -51658L,51659L,51660L,51661L,51662L,51663L,51664L,51665L,51666L,51667L, -51668L,51669L,51670L,51671L,51672L,51673L,51674L,51675L,51676L,51677L, -51678L,51679L,51680L,51681L,51682L,51683L,51684L,51685L,51686L,51687L, -51688L,51689L,51690L,51691L,51692L,51693L,51694L,51695L,51696L,51697L, -51698L,51699L,51700L,51701L,51702L,51703L,51704L,51705L,51706L,51707L, -51708L,51709L,51710L,51711L,51712L,51713L,51714L,51715L,51716L,51717L, -51718L,51719L,51720L,51721L,51722L,51723L,51724L,51725L,51726L,51727L, -51728L,51729L,51730L,51731L,51732L,51733L,51734L,51735L,51736L,51737L, -51738L,51739L,51740L,51741L,51742L,51743L,51744L,51745L,51746L,51747L, -51748L,51749L,51750L,51751L,51752L,51753L,51754L,51755L,51756L,51757L, -51758L,51759L,51760L,51761L,51762L,51763L,51764L,51765L,51766L,51767L, -51768L,51769L,51770L,51771L,51772L,51773L,51774L,51775L,51776L,51777L, -51778L,51779L,51780L,51781L,51782L,51783L,51784L,51785L,51786L,51787L, -51788L,51789L,51790L,51791L,51792L,51793L,51794L,51795L,51796L,51797L, -51798L,51799L,51800L,51801L,51802L,51803L,51804L,51805L,51806L,51807L, -51808L,51809L,51810L,51811L,51812L,51813L,51814L,51815L,51816L,51817L, -51818L,51819L,51820L,51821L,51822L,51823L,51824L,51825L,51826L,51827L, -51828L,51829L,51830L,51831L,51832L,51833L,51834L,51835L,51836L,51837L, -51838L,51839L,51840L,51841L,51842L,51843L,51844L,51845L,51846L,51847L, -51848L,51849L,51850L,51851L,51852L,51853L,51854L,51855L,51856L,51857L, -51858L,51859L,51860L,51861L,51862L,51863L,51864L,51865L,51866L,51867L, -51868L,51869L,51870L,51871L,51872L,51873L,51874L,51875L,51876L,51877L, -51878L,51879L,51880L,51881L,51882L,51883L,51884L,51885L,51886L,51887L, -51888L,51889L,51890L,51891L,51892L,51893L,51894L,51895L,51896L,51897L, -51898L,51899L,51900L,51901L,51902L,51903L,51904L,51905L,51906L,51907L, -51908L,51909L,51910L,51911L,51912L,51913L,51914L,51915L,51916L,51917L, -51918L,51919L,51920L,51921L,51922L,51923L,51924L,51925L,51926L,51927L, -51928L,51929L,51930L,51931L,51932L,51933L,51934L,51935L,51936L,51937L, -51938L,51939L,51940L,51941L,51942L,51943L,51944L,51945L,51946L,51947L, -51948L,51949L,51950L,51951L,51952L,51953L,51954L,51955L,51956L,51957L, -51958L,51959L,51960L,51961L,51962L,51963L,51964L,51965L,51966L,51967L, -51968L,51969L,51970L,51971L,51972L,51973L,51974L,51975L,51976L,51977L, -51978L,51979L,51980L,51981L,51982L,51983L,51984L,51985L,51986L,51987L, -51988L,51989L,51990L,51991L,51992L,51993L,51994L,51995L,51996L,51997L, -51998L,51999L,52000L,52001L,52002L,52003L,52004L,52005L,52006L,52007L, -52008L,52009L,52010L,52011L,52012L,52013L,52014L,52015L,52016L,52017L, -52018L,52019L,52020L,52021L,52022L,52023L,52024L,52025L,52026L,52027L, -52028L,52029L,52030L,52031L,52032L,52033L,52034L,52035L,52036L,52037L, -52038L,52039L,52040L,52041L,52042L,52043L,52044L,52045L,52046L,52047L, -52048L,52049L,52050L,52051L,52052L,52053L,52054L,52055L,52056L,52057L, -52058L,52059L,52060L,52061L,52062L,52063L,52064L,52065L,52066L,52067L, -52068L,52069L,52070L,52071L,52072L,52073L,52074L,52075L,52076L,52077L, -52078L,52079L,52080L,52081L,52082L,52083L,52084L,52085L,52086L,52087L, -52088L,52089L,52090L,52091L,52092L,52093L,52094L,52095L,52096L,52097L, -52098L,52099L,52100L,52101L,52102L,52103L,52104L,52105L,52106L,52107L, -52108L,52109L,52110L,52111L,52112L,52113L,52114L,52115L,52116L,52117L, -52118L,52119L,52120L,52121L,52122L,52123L,52124L,52125L,52126L,52127L, -52128L,52129L,52130L,52131L,52132L,52133L,52134L,52135L,52136L,52137L, -52138L,52139L,52140L,52141L,52142L,52143L,52144L,52145L,52146L,52147L, -52148L,52149L,52150L,52151L,52152L,52153L,52154L,52155L,52156L,52157L, -52158L,52159L,52160L,52161L,52162L,52163L,52164L,52165L,52166L,52167L, -52168L,52169L,52170L,52171L,52172L,52173L,52174L,52175L,52176L,52177L, -52178L,52179L,52180L,52181L,52182L,52183L,52184L,52185L,52186L,52187L, -52188L,52189L,52190L,52191L,52192L,52193L,52194L,52195L,52196L,52197L, -52198L,52199L,52200L,52201L,52202L,52203L,52204L,52205L,52206L,52207L, -52208L,52209L,52210L,52211L,52212L,52213L,52214L,52215L,52216L,52217L, -52218L,52219L,52220L,52221L,52222L,52223L,52224L,52225L,52226L,52227L, -52228L,52229L,52230L,52231L,52232L,52233L,52234L,52235L,52236L,52237L, -52238L,52239L,52240L,52241L,52242L,52243L,52244L,52245L,52246L,52247L, -52248L,52249L,52250L,52251L,52252L,52253L,52254L,52255L,52256L,52257L, -52258L,52259L,52260L,52261L,52262L,52263L,52264L,52265L,52266L,52267L, -52268L,52269L,52270L,52271L,52272L,52273L,52274L,52275L,52276L,52277L, -52278L,52279L,52280L,52281L,52282L,52283L,52284L,52285L,52286L,52287L, -52288L,52289L,52290L,52291L,52292L,52293L,52294L,52295L,52296L,52297L, -52298L,52299L,52300L,52301L,52302L,52303L,52304L,52305L,52306L,52307L, -52308L,52309L,52310L,52311L,52312L,52313L,52314L,52315L,52316L,52317L, -52318L,52319L,52320L,52321L,52322L,52323L,52324L,52325L,52326L,52327L, -52328L,52329L,52330L,52331L,52332L,52333L,52334L,52335L,52336L,52337L, -52338L,52339L,52340L,52341L,52342L,52343L,52344L,52345L,52346L,52347L, -52348L,52349L,52350L,52351L,52352L,52353L,52354L,52355L,52356L,52357L, -52358L,52359L,52360L,52361L,52362L,52363L,52364L,52365L,52366L,52367L, -52368L,52369L,52370L,52371L,52372L,52373L,52374L,52375L,52376L,52377L, -52378L,52379L,52380L,52381L,52382L,52383L,52384L,52385L,52386L,52387L, -52388L,52389L,52390L,52391L,52392L,52393L,52394L,52395L,52396L,52397L, -52398L,52399L,52400L,52401L,52402L,52403L,52404L,52405L,52406L,52407L, -52408L,52409L,52410L,52411L,52412L,52413L,52414L,52415L,52416L,52417L, -52418L,52419L,52420L,52421L,52422L,52423L,52424L,52425L,52426L,52427L, -52428L,52429L,52430L,52431L,52432L,52433L,52434L,52435L,52436L,52437L, -52438L,52439L,52440L,52441L,52442L,52443L,52444L,52445L,52446L,52447L, -52448L,52449L,52450L,52451L,52452L,52453L,52454L,52455L,52456L,52457L, -52458L,52459L,52460L,52461L,52462L,52463L,52464L,52465L,52466L,52467L, -52468L,52469L,52470L,52471L,52472L,52473L,52474L,52475L,52476L,52477L, -52478L,52479L,52480L,52481L,52482L,52483L,52484L,52485L,52486L,52487L, -52488L,52489L,52490L,52491L,52492L,52493L,52494L,52495L,52496L,52497L, -52498L,52499L,52500L,52501L,52502L,52503L,52504L,52505L,52506L,52507L, -52508L,52509L,52510L,52511L,52512L,52513L,52514L,52515L,52516L,52517L, -52518L,52519L,52520L,52521L,52522L,52523L,52524L,52525L,52526L,52527L, -52528L,52529L,52530L,52531L,52532L,52533L,52534L,52535L,52536L,52537L, -52538L,52539L,52540L,52541L,52542L,52543L,52544L,52545L,52546L,52547L, -52548L,52549L,52550L,52551L,52552L,52553L,52554L,52555L,52556L,52557L, -52558L,52559L,52560L,52561L,52562L,52563L,52564L,52565L,52566L,52567L, -52568L,52569L,52570L,52571L,52572L,52573L,52574L,52575L,52576L,52577L, -52578L,52579L,52580L,52581L,52582L,52583L,52584L,52585L,52586L,52587L, -52588L,52589L,52590L,52591L,52592L,52593L,52594L,52595L,52596L,52597L, -52598L,52599L,52600L,52601L,52602L,52603L,52604L,52605L,52606L,52607L, -52608L,52609L,52610L,52611L,52612L,52613L,52614L,52615L,52616L,52617L, -52618L,52619L,52620L,52621L,52622L,52623L,52624L,52625L,52626L,52627L, -52628L,52629L,52630L,52631L,52632L,52633L,52634L,52635L,52636L,52637L, -52638L,52639L,52640L,52641L,52642L,52643L,52644L,52645L,52646L,52647L, -52648L,52649L,52650L,52651L,52652L,52653L,52654L,52655L,52656L,52657L, -52658L,52659L,52660L,52661L,52662L,52663L,52664L,52665L,52666L,52667L, -52668L,52669L,52670L,52671L,52672L,52673L,52674L,52675L,52676L,52677L, -52678L,52679L,52680L,52681L,52682L,52683L,52684L,52685L,52686L,52687L, -52688L,52689L,52690L,52691L,52692L,52693L,52694L,52695L,52696L,52697L, -52698L,52699L,52700L,52701L,52702L,52703L,52704L,52705L,52706L,52707L, -52708L,52709L,52710L,52711L,52712L,52713L,52714L,52715L,52716L,52717L, -52718L,52719L,52720L,52721L,52722L,52723L,52724L,52725L,52726L,52727L, -52728L,52729L,52730L,52731L,52732L,52733L,52734L,52735L,52736L,52737L, -52738L,52739L,52740L,52741L,52742L,52743L,52744L,52745L,52746L,52747L, -52748L,52749L,52750L,52751L,52752L,52753L,52754L,52755L,52756L,52757L, -52758L,52759L,52760L,52761L,52762L,52763L,52764L,52765L,52766L,52767L, -52768L,52769L,52770L,52771L,52772L,52773L,52774L,52775L,52776L,52777L, -52778L,52779L,52780L,52781L,52782L,52783L,52784L,52785L,52786L,52787L, -52788L,52789L,52790L,52791L,52792L,52793L,52794L,52795L,52796L,52797L, -52798L,52799L,52800L,52801L,52802L,52803L,52804L,52805L,52806L,52807L, -52808L,52809L,52810L,52811L,52812L,52813L,52814L,52815L,52816L,52817L, -52818L,52819L,52820L,52821L,52822L,52823L,52824L,52825L,52826L,52827L, -52828L,52829L,52830L,52831L,52832L,52833L,52834L,52835L,52836L,52837L, -52838L,52839L,52840L,52841L,52842L,52843L,52844L,52845L,52846L,52847L, -52848L,52849L,52850L,52851L,52852L,52853L,52854L,52855L,52856L,52857L, -52858L,52859L,52860L,52861L,52862L,52863L,52864L,52865L,52866L,52867L, -52868L,52869L,52870L,52871L,52872L,52873L,52874L,52875L,52876L,52877L, -52878L,52879L,52880L,52881L,52882L,52883L,52884L,52885L,52886L,52887L, -52888L,52889L,52890L,52891L,52892L,52893L,52894L,52895L,52896L,52897L, -52898L,52899L,52900L,52901L,52902L,52903L,52904L,52905L,52906L,52907L, -52908L,52909L,52910L,52911L,52912L,52913L,52914L,52915L,52916L,52917L, -52918L,52919L,52920L,52921L,52922L,52923L,52924L,52925L,52926L,52927L, -52928L,52929L,52930L,52931L,52932L,52933L,52934L,52935L,52936L,52937L, -52938L,52939L,52940L,52941L,52942L,52943L,52944L,52945L,52946L,52947L, -52948L,52949L,52950L,52951L,52952L,52953L,52954L,52955L,52956L,52957L, -52958L,52959L,52960L,52961L,52962L,52963L,52964L,52965L,52966L,52967L, -52968L,52969L,52970L,52971L,52972L,52973L,52974L,52975L,52976L,52977L, -52978L,52979L,52980L,52981L,52982L,52983L,52984L,52985L,52986L,52987L, -52988L,52989L,52990L,52991L,52992L,52993L,52994L,52995L,52996L,52997L, -52998L,52999L,53000L,53001L,53002L,53003L,53004L,53005L,53006L,53007L, -53008L,53009L,53010L,53011L,53012L,53013L,53014L,53015L,53016L,53017L, -53018L,53019L,53020L,53021L,53022L,53023L,53024L,53025L,53026L,53027L, -53028L,53029L,53030L,53031L,53032L,53033L,53034L,53035L,53036L,53037L, -53038L,53039L,53040L,53041L,53042L,53043L,53044L,53045L,53046L,53047L, -53048L,53049L,53050L,53051L,53052L,53053L,53054L,53055L,53056L,53057L, -53058L,53059L,53060L,53061L,53062L,53063L,53064L,53065L,53066L,53067L, -53068L,53069L,53070L,53071L,53072L,53073L,53074L,53075L,53076L,53077L, -53078L,53079L,53080L,53081L,53082L,53083L,53084L,53085L,53086L,53087L, -53088L,53089L,53090L,53091L,53092L,53093L,53094L,53095L,53096L,53097L, -53098L,53099L,53100L,53101L,53102L,53103L,53104L,53105L,53106L,53107L, -53108L,53109L,53110L,53111L,53112L,53113L,53114L,53115L,53116L,53117L, -53118L,53119L,53120L,53121L,53122L,53123L,53124L,53125L,53126L,53127L, -53128L,53129L,53130L,53131L,53132L,53133L,53134L,53135L,53136L,53137L, -53138L,53139L,53140L,53141L,53142L,53143L,53144L,53145L,53146L,53147L, -53148L,53149L,53150L,53151L,53152L,53153L,53154L,53155L,53156L,53157L, -53158L,53159L,53160L,53161L,53162L,53163L,53164L,53165L,53166L,53167L, -53168L,53169L,53170L,53171L,53172L,53173L,53174L,53175L,53176L,53177L, -53178L,53179L,53180L,53181L,53182L,53183L,53184L,53185L,53186L,53187L, -53188L,53189L,53190L,53191L,53192L,53193L,53194L,53195L,53196L,53197L, -53198L,53199L,53200L,53201L,53202L,53203L,53204L,53205L,53206L,53207L, -53208L,53209L,53210L,53211L,53212L,53213L,53214L,53215L,53216L,53217L, -53218L,53219L,53220L,53221L,53222L,53223L,53224L,53225L,53226L,53227L, -53228L,53229L,53230L,53231L,53232L,53233L,53234L,53235L,53236L,53237L, -53238L,53239L,53240L,53241L,53242L,53243L,53244L,53245L,53246L,53247L, -53248L,53249L,53250L,53251L,53252L,53253L,53254L,53255L,53256L,53257L, -53258L,53259L,53260L,53261L,53262L,53263L,53264L,53265L,53266L,53267L, -53268L,53269L,53270L,53271L,53272L,53273L,53274L,53275L,53276L,53277L, -53278L,53279L,53280L,53281L,53282L,53283L,53284L,53285L,53286L,53287L, -53288L,53289L,53290L,53291L,53292L,53293L,53294L,53295L,53296L,53297L, -53298L,53299L,53300L,53301L,53302L,53303L,53304L,53305L,53306L,53307L, -53308L,53309L,53310L,53311L,53312L,53313L,53314L,53315L,53316L,53317L, -53318L,53319L,53320L,53321L,53322L,53323L,53324L,53325L,53326L,53327L, -53328L,53329L,53330L,53331L,53332L,53333L,53334L,53335L,53336L,53337L, -53338L,53339L,53340L,53341L,53342L,53343L,53344L,53345L,53346L,53347L, -53348L,53349L,53350L,53351L,53352L,53353L,53354L,53355L,53356L,53357L, -53358L,53359L,53360L,53361L,53362L,53363L,53364L,53365L,53366L,53367L, -53368L,53369L,53370L,53371L,53372L,53373L,53374L,53375L,53376L,53377L, -53378L,53379L,53380L,53381L,53382L,53383L,53384L,53385L,53386L,53387L, -53388L,53389L,53390L,53391L,53392L,53393L,53394L,53395L,53396L,53397L, -53398L,53399L,53400L,53401L,53402L,53403L,53404L,53405L,53406L,53407L, -53408L,53409L,53410L,53411L,53412L,53413L,53414L,53415L,53416L,53417L, -53418L,53419L,53420L,53421L,53422L,53423L,53424L,53425L,53426L,53427L, -53428L,53429L,53430L,53431L,53432L,53433L,53434L,53435L,53436L,53437L, -53438L,53439L,53440L,53441L,53442L,53443L,53444L,53445L,53446L,53447L, -53448L,53449L,53450L,53451L,53452L,53453L,53454L,53455L,53456L,53457L, -53458L,53459L,53460L,53461L,53462L,53463L,53464L,53465L,53466L,53467L, -53468L,53469L,53470L,53471L,53472L,53473L,53474L,53475L,53476L,53477L, -53478L,53479L,53480L,53481L,53482L,53483L,53484L,53485L,53486L,53487L, -53488L,53489L,53490L,53491L,53492L,53493L,53494L,53495L,53496L,53497L, -53498L,53499L,53500L,53501L,53502L,53503L,53504L,53505L,53506L,53507L, -53508L,53509L,53510L,53511L,53512L,53513L,53514L,53515L,53516L,53517L, -53518L,53519L,53520L,53521L,53522L,53523L,53524L,53525L,53526L,53527L, -53528L,53529L,53530L,53531L,53532L,53533L,53534L,53535L,53536L,53537L, -53538L,53539L,53540L,53541L,53542L,53543L,53544L,53545L,53546L,53547L, -53548L,53549L,53550L,53551L,53552L,53553L,53554L,53555L,53556L,53557L, -53558L,53559L,53560L,53561L,53562L,53563L,53564L,53565L,53566L,53567L, -53568L,53569L,53570L,53571L,53572L,53573L,53574L,53575L,53576L,53577L, -53578L,53579L,53580L,53581L,53582L,53583L,53584L,53585L,53586L,53587L, -53588L,53589L,53590L,53591L,53592L,53593L,53594L,53595L,53596L,53597L, -53598L,53599L,53600L,53601L,53602L,53603L,53604L,53605L,53606L,53607L, -53608L,53609L,53610L,53611L,53612L,53613L,53614L,53615L,53616L,53617L, -53618L,53619L,53620L,53621L,53622L,53623L,53624L,53625L,53626L,53627L, -53628L,53629L,53630L,53631L,53632L,53633L,53634L,53635L,53636L,53637L, -53638L,53639L,53640L,53641L,53642L,53643L,53644L,53645L,53646L,53647L, -53648L,53649L,53650L,53651L,53652L,53653L,53654L,53655L,53656L,53657L, -53658L,53659L,53660L,53661L,53662L,53663L,53664L,53665L,53666L,53667L, -53668L,53669L,53670L,53671L,53672L,53673L,53674L,53675L,53676L,53677L, -53678L,53679L,53680L,53681L,53682L,53683L,53684L,53685L,53686L,53687L, -53688L,53689L,53690L,53691L,53692L,53693L,53694L,53695L,53696L,53697L, -53698L,53699L,53700L,53701L,53702L,53703L,53704L,53705L,53706L,53707L, -53708L,53709L,53710L,53711L,53712L,53713L,53714L,53715L,53716L,53717L, -53718L,53719L,53720L,53721L,53722L,53723L,53724L,53725L,53726L,53727L, -53728L,53729L,53730L,53731L,53732L,53733L,53734L,53735L,53736L,53737L, -53738L,53739L,53740L,53741L,53742L,53743L,53744L,53745L,53746L,53747L, -53748L,53749L,53750L,53751L,53752L,53753L,53754L,53755L,53756L,53757L, -53758L,53759L,53760L,53761L,53762L,53763L,53764L,53765L,53766L,53767L, -53768L,53769L,53770L,53771L,53772L,53773L,53774L,53775L,53776L,53777L, -53778L,53779L,53780L,53781L,53782L,53783L,53784L,53785L,53786L,53787L, -53788L,53789L,53790L,53791L,53792L,53793L,53794L,53795L,53796L,53797L, -53798L,53799L,53800L,53801L,53802L,53803L,53804L,53805L,53806L,53807L, -53808L,53809L,53810L,53811L,53812L,53813L,53814L,53815L,53816L,53817L, -53818L,53819L,53820L,53821L,53822L,53823L,53824L,53825L,53826L,53827L, -53828L,53829L,53830L,53831L,53832L,53833L,53834L,53835L,53836L,53837L, -53838L,53839L,53840L,53841L,53842L,53843L,53844L,53845L,53846L,53847L, -53848L,53849L,53850L,53851L,53852L,53853L,53854L,53855L,53856L,53857L, -53858L,53859L,53860L,53861L,53862L,53863L,53864L,53865L,53866L,53867L, -53868L,53869L,53870L,53871L,53872L,53873L,53874L,53875L,53876L,53877L, -53878L,53879L,53880L,53881L,53882L,53883L,53884L,53885L,53886L,53887L, -53888L,53889L,53890L,53891L,53892L,53893L,53894L,53895L,53896L,53897L, -53898L,53899L,53900L,53901L,53902L,53903L,53904L,53905L,53906L,53907L, -53908L,53909L,53910L,53911L,53912L,53913L,53914L,53915L,53916L,53917L, -53918L,53919L,53920L,53921L,53922L,53923L,53924L,53925L,53926L,53927L, -53928L,53929L,53930L,53931L,53932L,53933L,53934L,53935L,53936L,53937L, -53938L,53939L,53940L,53941L,53942L,53943L,53944L,53945L,53946L,53947L, -53948L,53949L,53950L,53951L,53952L,53953L,53954L,53955L,53956L,53957L, -53958L,53959L,53960L,53961L,53962L,53963L,53964L,53965L,53966L,53967L, -53968L,53969L,53970L,53971L,53972L,53973L,53974L,53975L,53976L,53977L, -53978L,53979L,53980L,53981L,53982L,53983L,53984L,53985L,53986L,53987L, -53988L,53989L,53990L,53991L,53992L,53993L,53994L,53995L,53996L,53997L, -53998L,53999L,54000L,54001L,54002L,54003L,54004L,54005L,54006L,54007L, -54008L,54009L,54010L,54011L,54012L,54013L,54014L,54015L,54016L,54017L, -54018L,54019L,54020L,54021L,54022L,54023L,54024L,54025L,54026L,54027L, -54028L,54029L,54030L,54031L,54032L,54033L,54034L,54035L,54036L,54037L, -54038L,54039L,54040L,54041L,54042L,54043L,54044L,54045L,54046L,54047L, -54048L,54049L,54050L,54051L,54052L,54053L,54054L,54055L,54056L,54057L, -54058L,54059L,54060L,54061L,54062L,54063L,54064L,54065L,54066L,54067L, -54068L,54069L,54070L,54071L,54072L,54073L,54074L,54075L,54076L,54077L, -54078L,54079L,54080L,54081L,54082L,54083L,54084L,54085L,54086L,54087L, -54088L,54089L,54090L,54091L,54092L,54093L,54094L,54095L,54096L,54097L, -54098L,54099L,54100L,54101L,54102L,54103L,54104L,54105L,54106L,54107L, -54108L,54109L,54110L,54111L,54112L,54113L,54114L,54115L,54116L,54117L, -54118L,54119L,54120L,54121L,54122L,54123L,54124L,54125L,54126L,54127L, -54128L,54129L,54130L,54131L,54132L,54133L,54134L,54135L,54136L,54137L, -54138L,54139L,54140L,54141L,54142L,54143L,54144L,54145L,54146L,54147L, -54148L,54149L,54150L,54151L,54152L,54153L,54154L,54155L,54156L,54157L, -54158L,54159L,54160L,54161L,54162L,54163L,54164L,54165L,54166L,54167L, -54168L,54169L,54170L,54171L,54172L,54173L,54174L,54175L,54176L,54177L, -54178L,54179L,54180L,54181L,54182L,54183L,54184L,54185L,54186L,54187L, -54188L,54189L,54190L,54191L,54192L,54193L,54194L,54195L,54196L,54197L, -54198L,54199L,54200L,54201L,54202L,54203L,54204L,54205L,54206L,54207L, -54208L,54209L,54210L,54211L,54212L,54213L,54214L,54215L,54216L,54217L, -54218L,54219L,54220L,54221L,54222L,54223L,54224L,54225L,54226L,54227L, -54228L,54229L,54230L,54231L,54232L,54233L,54234L,54235L,54236L,54237L, -54238L,54239L,54240L,54241L,54242L,54243L,54244L,54245L,54246L,54247L, -54248L,54249L,54250L,54251L,54252L,54253L,54254L,54255L,54256L,54257L, -54258L,54259L,54260L,54261L,54262L,54263L,54264L,54265L,54266L,54267L, -54268L,54269L,54270L,54271L,54272L,54273L,54274L,54275L,54276L,54277L, -54278L,54279L,54280L,54281L,54282L,54283L,54284L,54285L,54286L,54287L, -54288L,54289L,54290L,54291L,54292L,54293L,54294L,54295L,54296L,54297L, -54298L,54299L,54300L,54301L,54302L,54303L,54304L,54305L,54306L,54307L, -54308L,54309L,54310L,54311L,54312L,54313L,54314L,54315L,54316L,54317L, -54318L,54319L,54320L,54321L,54322L,54323L,54324L,54325L,54326L,54327L, -54328L,54329L,54330L,54331L,54332L,54333L,54334L,54335L,54336L,54337L, -54338L,54339L,54340L,54341L,54342L,54343L,54344L,54345L,54346L,54347L, -54348L,54349L,54350L,54351L,54352L,54353L,54354L,54355L,54356L,54357L, -54358L,54359L,54360L,54361L,54362L,54363L,54364L,54365L,54366L,54367L, -54368L,54369L,54370L,54371L,54372L,54373L,54374L,54375L,54376L,54377L, -54378L,54379L,54380L,54381L,54382L,54383L,54384L,54385L,54386L,54387L, -54388L,54389L,54390L,54391L,54392L,54393L,54394L,54395L,54396L,54397L, -54398L,54399L,54400L,54401L,54402L,54403L,54404L,54405L,54406L,54407L, -54408L,54409L,54410L,54411L,54412L,54413L,54414L,54415L,54416L,54417L, -54418L,54419L,54420L,54421L,54422L,54423L,54424L,54425L,54426L,54427L, -54428L,54429L,54430L,54431L,54432L,54433L,54434L,54435L,54436L,54437L, -54438L,54439L,54440L,54441L,54442L,54443L,54444L,54445L,54446L,54447L, -54448L,54449L,54450L,54451L,54452L,54453L,54454L,54455L,54456L,54457L, -54458L,54459L,54460L,54461L,54462L,54463L,54464L,54465L,54466L,54467L, -54468L,54469L,54470L,54471L,54472L,54473L,54474L,54475L,54476L,54477L, -54478L,54479L,54480L,54481L,54482L,54483L,54484L,54485L,54486L,54487L, -54488L,54489L,54490L,54491L,54492L,54493L,54494L,54495L,54496L,54497L, -54498L,54499L,54500L,54501L,54502L,54503L,54504L,54505L,54506L,54507L, -54508L,54509L,54510L,54511L,54512L,54513L,54514L,54515L,54516L,54517L, -54518L,54519L,54520L,54521L,54522L,54523L,54524L,54525L,54526L,54527L, -54528L,54529L,54530L,54531L,54532L,54533L,54534L,54535L,54536L,54537L, -54538L,54539L,54540L,54541L,54542L,54543L,54544L,54545L,54546L,54547L, -54548L,54549L,54550L,54551L,54552L,54553L,54554L,54555L,54556L,54557L, -54558L,54559L,54560L,54561L,54562L,54563L,54564L,54565L,54566L,54567L, -54568L,54569L,54570L,54571L,54572L,54573L,54574L,54575L,54576L,54577L, -54578L,54579L,54580L,54581L,54582L,54583L,54584L,54585L,54586L,54587L, -54588L,54589L,54590L,54591L,54592L,54593L,54594L,54595L,54596L,54597L, -54598L,54599L,54600L,54601L,54602L,54603L,54604L,54605L,54606L,54607L, -54608L,54609L,54610L,54611L,54612L,54613L,54614L,54615L,54616L,54617L, -54618L,54619L,54620L,54621L,54622L,54623L,54624L,54625L,54626L,54627L, -54628L,54629L,54630L,54631L,54632L,54633L,54634L,54635L,54636L,54637L, -54638L,54639L,54640L,54641L,54642L,54643L,54644L,54645L,54646L,54647L, -54648L,54649L,54650L,54651L,54652L,54653L,54654L,54655L,54656L,54657L, -54658L,54659L,54660L,54661L,54662L,54663L,54664L,54665L,54666L,54667L, -54668L,54669L,54670L,54671L,54672L,54673L,54674L,54675L,54676L,54677L, -54678L,54679L,54680L,54681L,54682L,54683L,54684L,54685L,54686L,54687L, -54688L,54689L,54690L,54691L,54692L,54693L,54694L,54695L,54696L,54697L, -54698L,54699L,54700L,54701L,54702L,54703L,54704L,54705L,54706L,54707L, -54708L,54709L,54710L,54711L,54712L,54713L,54714L,54715L,54716L,54717L, -54718L,54719L,54720L,54721L,54722L,54723L,54724L,54725L,54726L,54727L, -54728L,54729L,54730L,54731L,54732L,54733L,54734L,54735L,54736L,54737L, -54738L,54739L,54740L,54741L,54742L,54743L,54744L,54745L,54746L,54747L, -54748L,54749L,54750L,54751L,54752L,54753L,54754L,54755L,54756L,54757L, -54758L,54759L,54760L,54761L,54762L,54763L,54764L,54765L,54766L,54767L, -54768L,54769L,54770L,54771L,54772L,54773L,54774L,54775L,54776L,54777L, -54778L,54779L,54780L,54781L,54782L,54783L,54784L,54785L,54786L,54787L, -54788L,54789L,54790L,54791L,54792L,54793L,54794L,54795L,54796L,54797L, -54798L,54799L,54800L,54801L,54802L,54803L,54804L,54805L,54806L,54807L, -54808L,54809L,54810L,54811L,54812L,54813L,54814L,54815L,54816L,54817L, -54818L,54819L,54820L,54821L,54822L,54823L,54824L,54825L,54826L,54827L, -54828L,54829L,54830L,54831L,54832L,54833L,54834L,54835L,54836L,54837L, -54838L,54839L,54840L,54841L,54842L,54843L,54844L,54845L,54846L,54847L, -54848L,54849L,54850L,54851L,54852L,54853L,54854L,54855L,54856L,54857L, -54858L,54859L,54860L,54861L,54862L,54863L,54864L,54865L,54866L,54867L, -54868L,54869L,54870L,54871L,54872L,54873L,54874L,54875L,54876L,54877L, -54878L,54879L,54880L,54881L,54882L,54883L,54884L,54885L,54886L,54887L, -54888L,54889L,54890L,54891L,54892L,54893L,54894L,54895L,54896L,54897L, -54898L,54899L,54900L,54901L,54902L,54903L,54904L,54905L,54906L,54907L, -54908L,54909L,54910L,54911L,54912L,54913L,54914L,54915L,54916L,54917L, -54918L,54919L,54920L,54921L,54922L,54923L,54924L,54925L,54926L,54927L, -54928L,54929L,54930L,54931L,54932L,54933L,54934L,54935L,54936L,54937L, -54938L,54939L,54940L,54941L,54942L,54943L,54944L,54945L,54946L,54947L, -54948L,54949L,54950L,54951L,54952L,54953L,54954L,54955L,54956L,54957L, -54958L,54959L,54960L,54961L,54962L,54963L,54964L,54965L,54966L,54967L, -54968L,54969L,54970L,54971L,54972L,54973L,54974L,54975L,54976L,54977L, -54978L,54979L,54980L,54981L,54982L,54983L,54984L,54985L,54986L,54987L, -54988L,54989L,54990L,54991L,54992L,54993L,54994L,54995L,54996L,54997L, -54998L,54999L,55000L,55001L,55002L,55003L,55004L,55005L,55006L,55007L, -55008L,55009L,55010L,55011L,55012L,55013L,55014L,55015L,55016L,55017L, -55018L,55019L,55020L,55021L,55022L,55023L,55024L,55025L,55026L,55027L, -55028L,55029L,55030L,55031L,55032L,55033L,55034L,55035L,55036L,55037L, -55038L,55039L,55040L,55041L,55042L,55043L,55044L,55045L,55046L,55047L, -55048L,55049L,55050L,55051L,55052L,55053L,55054L,55055L,55056L,55057L, -55058L,55059L,55060L,55061L,55062L,55063L,55064L,55065L,55066L,55067L, -55068L,55069L,55070L,55071L,55072L,55073L,55074L,55075L,55076L,55077L, -55078L,55079L,55080L,55081L,55082L,55083L,55084L,55085L,55086L,55087L, -55088L,55089L,55090L,55091L,55092L,55093L,55094L,55095L,55096L,55097L, -55098L,55099L,55100L,55101L,55102L,55103L,55104L,55105L,55106L,55107L, -55108L,55109L,55110L,55111L,55112L,55113L,55114L,55115L,55116L,55117L, -55118L,55119L,55120L,55121L,55122L,55123L,55124L,55125L,55126L,55127L, -55128L,55129L,55130L,55131L,55132L,55133L,55134L,55135L,55136L,55137L, -55138L,55139L,55140L,55141L,55142L,55143L,55144L,55145L,55146L,55147L, -55148L,55149L,55150L,55151L,55152L,55153L,55154L,55155L,55156L,55157L, -55158L,55159L,55160L,55161L,55162L,55163L,55164L,55165L,55166L,55167L, -55168L,55169L,55170L,55171L,55172L,55173L,55174L,55175L,55176L,55177L, -55178L,55179L,55180L,55181L,55182L,55183L,55184L,55185L,55186L,55187L, -55188L,55189L,55190L,55191L,55192L,55193L,55194L,55195L,55196L,55197L, -55198L,55199L,55200L,55201L,55202L,55203L,55204L,55205L,55206L,55207L, -55208L,55209L,55210L,55211L,55212L,55213L,55214L,55215L,55216L,55217L, -55218L,55219L,55220L,55221L,55222L,55223L,55224L,55225L,55226L,55227L, -55228L,55229L,55230L,55231L,55232L,55233L,55234L,55235L,55236L,55237L, -55238L,55239L,55240L,55241L,55242L,55243L,55244L,55245L,55246L,55247L, -55248L,55249L,55250L,55251L,55252L,55253L,55254L,55255L,55256L,55257L, -55258L,55259L,55260L,55261L,55262L,55263L,55264L,55265L,55266L,55267L, -55268L,55269L,55270L,55271L,55272L,55273L,55274L,55275L,55276L,55277L, -55278L,55279L,55280L,55281L,55282L,55283L,55284L,55285L,55286L,55287L, -55288L,55289L,55290L,55291L,55292L,55293L,55294L,55295L,55296L,55297L, -55298L,55299L,55300L,55301L,55302L,55303L,55304L,55305L,55306L,55307L, -55308L,55309L,55310L,55311L,55312L,55313L,55314L,55315L,55316L,55317L, -55318L,55319L,55320L,55321L,55322L,55323L,55324L,55325L,55326L,55327L, -55328L,55329L,55330L,55331L,55332L,55333L,55334L,55335L,55336L,55337L, -55338L,55339L,55340L,55341L,55342L,55343L,55344L,55345L,55346L,55347L, -55348L,55349L,55350L,55351L,55352L,55353L,55354L,55355L,55356L,55357L, -55358L,55359L,55360L,55361L,55362L,55363L,55364L,55365L,55366L,55367L, -55368L,55369L,55370L,55371L,55372L,55373L,55374L,55375L,55376L,55377L, -55378L,55379L,55380L,55381L,55382L,55383L,55384L,55385L,55386L,55387L, -55388L,55389L,55390L,55391L,55392L,55393L,55394L,55395L,55396L,55397L, -55398L,55399L,55400L,55401L,55402L,55403L,55404L,55405L,55406L,55407L, -55408L,55409L,55410L,55411L,55412L,55413L,55414L,55415L,55416L,55417L, -55418L,55419L,55420L,55421L,55422L,55423L,55424L,55425L,55426L,55427L, -55428L,55429L,55430L,55431L,55432L,55433L,55434L,55435L,55436L,55437L, -55438L,55439L,55440L,55441L,55442L,55443L,55444L,55445L,55446L,55447L, -55448L,55449L,55450L,55451L,55452L,55453L,55454L,55455L,55456L,55457L, -55458L,55459L,55460L,55461L,55462L,55463L,55464L,55465L,55466L,55467L, -55468L,55469L,55470L,55471L,55472L,55473L,55474L,55475L,55476L,55477L, -55478L,55479L,55480L,55481L,55482L,55483L,55484L,55485L,55486L,55487L, -55488L,55489L,55490L,55491L,55492L,55493L,55494L,55495L,55496L,55497L, -55498L,55499L,55500L,55501L,55502L,55503L,55504L,55505L,55506L,55507L, -55508L,55509L,55510L,55511L,55512L,55513L,55514L,55515L,55516L,55517L, -55518L,55519L,55520L,55521L,55522L,55523L,55524L,55525L,55526L,55527L, -55528L,55529L,55530L,55531L,55532L,55533L,55534L,55535L,55536L,55537L, -55538L,55539L,55540L,55541L,55542L,55543L,55544L,55545L,55546L,55547L, -55548L,55549L,55550L,55551L,55552L,55553L,55554L,55555L,55556L,55557L, -55558L,55559L,55560L,55561L,55562L,55563L,55564L,55565L,55566L,55567L, -55568L,55569L,55570L,55571L,55572L,55573L,55574L,55575L,55576L,55577L, -55578L,55579L,55580L,55581L,55582L,55583L,55584L,55585L,55586L,55587L, -55588L,55589L,55590L,55591L,55592L,55593L,55594L,55595L,55596L,55597L, -55598L,55599L,55600L,55601L,55602L,55603L,55604L,55605L,55606L,55607L, -55608L,55609L,55610L,55611L,55612L,55613L,55614L,55615L,55616L,55617L, -55618L,55619L,55620L,55621L,55622L,55623L,55624L,55625L,55626L,55627L, -55628L,55629L,55630L,55631L,55632L,55633L,55634L,55635L,55636L,55637L, -55638L,55639L,55640L,55641L,55642L,55643L,55644L,55645L,55646L,55647L, -55648L,55649L,55650L,55651L,55652L,55653L,55654L,55655L,55656L,55657L, -55658L,55659L,55660L,55661L,55662L,55663L,55664L,55665L,55666L,55667L, -55668L,55669L,55670L,55671L,55672L,55673L,55674L,55675L,55676L,55677L, -55678L,55679L,55680L,55681L,55682L,55683L,55684L,55685L,55686L,55687L, -55688L,55689L,55690L,55691L,55692L,55693L,55694L,55695L,55696L,55697L, -55698L,55699L,55700L,55701L,55702L,55703L,55704L,55705L,55706L,55707L, -55708L,55709L,55710L,55711L,55712L,55713L,55714L,55715L,55716L,55717L, -55718L,55719L,55720L,55721L,55722L,55723L,55724L,55725L,55726L,55727L, -55728L,55729L,55730L,55731L,55732L,55733L,55734L,55735L,55736L,55737L, -55738L,55739L,55740L,55741L,55742L,55743L,55744L,55745L,55746L,55747L, -55748L,55749L,55750L,55751L,55752L,55753L,55754L,55755L,55756L,55757L, -55758L,55759L,55760L,55761L,55762L,55763L,55764L,55765L,55766L,55767L, -55768L,55769L,55770L,55771L,55772L,55773L,55774L,55775L,55776L,55777L, -55778L,55779L,55780L,55781L,55782L,55783L,55784L,55785L,55786L,55787L, -55788L,55789L,55790L,55791L,55792L,55793L,55794L,55795L,55796L,55797L, -55798L,55799L,55800L,55801L,55802L,55803L,55804L,55805L,55806L,55807L, -55808L,55809L,55810L,55811L,55812L,55813L,55814L,55815L,55816L,55817L, -55818L,55819L,55820L,55821L,55822L,55823L,55824L,55825L,55826L,55827L, -55828L,55829L,55830L,55831L,55832L,55833L,55834L,55835L,55836L,55837L, -55838L,55839L,55840L,55841L,55842L,55843L,55844L,55845L,55846L,55847L, -55848L,55849L,55850L,55851L,55852L,55853L,55854L,55855L,55856L,55857L, -55858L,55859L,55860L,55861L,55862L,55863L,55864L,55865L,55866L,55867L, -55868L,55869L,55870L,55871L,55872L,55873L,55874L,55875L,55876L,55877L, -55878L,55879L,55880L,55881L,55882L,55883L,55884L,55885L,55886L,55887L, -55888L,55889L,55890L,55891L,55892L,55893L,55894L,55895L,55896L,55897L, -55898L,55899L,55900L,55901L,55902L,55903L,55904L,55905L,55906L,55907L, -55908L,55909L,55910L,55911L,55912L,55913L,55914L,55915L,55916L,55917L, -55918L,55919L,55920L,55921L,55922L,55923L,55924L,55925L,55926L,55927L, -55928L,55929L,55930L,55931L,55932L,55933L,55934L,55935L,55936L,55937L, -55938L,55939L,55940L,55941L,55942L,55943L,55944L,55945L,55946L,55947L, -55948L,55949L,55950L,55951L,55952L,55953L,55954L,55955L,55956L,55957L, -55958L,55959L,55960L,55961L,55962L,55963L,55964L,55965L,55966L,55967L, -55968L,55969L,55970L,55971L,55972L,55973L,55974L,55975L,55976L,55977L, -55978L,55979L,55980L,55981L,55982L,55983L,55984L,55985L,55986L,55987L, -55988L,55989L,55990L,55991L,55992L,55993L,55994L,55995L,55996L,55997L, -55998L,55999L,56000L,56001L,56002L,56003L,56004L,56005L,56006L,56007L, -56008L,56009L,56010L,56011L,56012L,56013L,56014L,56015L,56016L,56017L, -56018L,56019L,56020L,56021L,56022L,56023L,56024L,56025L,56026L,56027L, -56028L,56029L,56030L,56031L,56032L,56033L,56034L,56035L,56036L,56037L, -56038L,56039L,56040L,56041L,56042L,56043L,56044L,56045L,56046L,56047L, -56048L,56049L,56050L,56051L,56052L,56053L,56054L,56055L,56056L,56057L, -56058L,56059L,56060L,56061L,56062L,56063L,56064L,56065L,56066L,56067L, -56068L,56069L,56070L,56071L,56072L,56073L,56074L,56075L,56076L,56077L, -56078L,56079L,56080L,56081L,56082L,56083L,56084L,56085L,56086L,56087L, -56088L,56089L,56090L,56091L,56092L,56093L,56094L,56095L,56096L,56097L, -56098L,56099L,56100L,56101L,56102L,56103L,56104L,56105L,56106L,56107L, -56108L,56109L,56110L,56111L,56112L,56113L,56114L,56115L,56116L,56117L, -56118L,56119L,56120L,56121L,56122L,56123L,56124L,56125L,56126L,56127L, -56128L,56129L,56130L,56131L,56132L,56133L,56134L,56135L,56136L,56137L, -56138L,56139L,56140L,56141L,56142L,56143L,56144L,56145L,56146L,56147L, -56148L,56149L,56150L,56151L,56152L,56153L,56154L,56155L,56156L,56157L, -56158L,56159L,56160L,56161L,56162L,56163L,56164L,56165L,56166L,56167L, -56168L,56169L,56170L,56171L,56172L,56173L,56174L,56175L,56176L,56177L, -56178L,56179L,56180L,56181L,56182L,56183L,56184L,56185L,56186L,56187L, -56188L,56189L,56190L,56191L,56192L,56193L,56194L,56195L,56196L,56197L, -56198L,56199L,56200L,56201L,56202L,56203L,56204L,56205L,56206L,56207L, -56208L,56209L,56210L,56211L,56212L,56213L,56214L,56215L,56216L,56217L, -56218L,56219L,56220L,56221L,56222L,56223L,56224L,56225L,56226L,56227L, -56228L,56229L,56230L,56231L,56232L,56233L,56234L,56235L,56236L,56237L, -56238L,56239L,56240L,56241L,56242L,56243L,56244L,56245L,56246L,56247L, -56248L,56249L,56250L,56251L,56252L,56253L,56254L,56255L,56256L,56257L, -56258L,56259L,56260L,56261L,56262L,56263L,56264L,56265L,56266L,56267L, -56268L,56269L,56270L,56271L,56272L,56273L,56274L,56275L,56276L,56277L, -56278L,56279L,56280L,56281L,56282L,56283L,56284L,56285L,56286L,56287L, -56288L,56289L,56290L,56291L,56292L,56293L,56294L,56295L,56296L,56297L, -56298L,56299L,56300L,56301L,56302L,56303L,56304L,56305L,56306L,56307L, -56308L,56309L,56310L,56311L,56312L,56313L,56314L,56315L,56316L,56317L, -56318L,56319L,56320L,56321L,56322L,56323L,56324L,56325L,56326L,56327L, -56328L,56329L,56330L,56331L,56332L,56333L,56334L,56335L,56336L,56337L, -56338L,56339L,56340L,56341L,56342L,56343L,56344L,56345L,56346L,56347L, -56348L,56349L,56350L,56351L,56352L,56353L,56354L,56355L,56356L,56357L, -56358L,56359L,56360L,56361L,56362L,56363L,56364L,56365L,56366L,56367L, -56368L,56369L,56370L,56371L,56372L,56373L,56374L,56375L,56376L,56377L, -56378L,56379L,56380L,56381L,56382L,56383L,56384L,56385L,56386L,56387L, -56388L,56389L,56390L,56391L,56392L,56393L,56394L,56395L,56396L,56397L, -56398L,56399L,56400L,56401L,56402L,56403L,56404L,56405L,56406L,56407L, -56408L,56409L,56410L,56411L,56412L,56413L,56414L,56415L,56416L,56417L, -56418L,56419L,56420L,56421L,56422L,56423L,56424L,56425L,56426L,56427L, -56428L,56429L,56430L,56431L,56432L,56433L,56434L,56435L,56436L,56437L, -56438L,56439L,56440L,56441L,56442L,56443L,56444L,56445L,56446L,56447L, -56448L,56449L,56450L,56451L,56452L,56453L,56454L,56455L,56456L,56457L, -56458L,56459L,56460L,56461L,56462L,56463L,56464L,56465L,56466L,56467L, -56468L,56469L,56470L,56471L,56472L,56473L,56474L,56475L,56476L,56477L, -56478L,56479L,56480L,56481L,56482L,56483L,56484L,56485L,56486L,56487L, -56488L,56489L,56490L,56491L,56492L,56493L,56494L,56495L,56496L,56497L, -56498L,56499L,56500L,56501L,56502L,56503L,56504L,56505L,56506L,56507L, -56508L,56509L,56510L,56511L,56512L,56513L,56514L,56515L,56516L,56517L, -56518L,56519L,56520L,56521L,56522L,56523L,56524L,56525L,56526L,56527L, -56528L,56529L,56530L,56531L,56532L,56533L,56534L,56535L,56536L,56537L, -56538L,56539L,56540L,56541L,56542L,56543L,56544L,56545L,56546L,56547L, -56548L,56549L,56550L,56551L,56552L,56553L,56554L,56555L,56556L,56557L, -56558L,56559L,56560L,56561L,56562L,56563L,56564L,56565L,56566L,56567L, -56568L,56569L,56570L,56571L,56572L,56573L,56574L,56575L,56576L,56577L, -56578L,56579L,56580L,56581L,56582L,56583L,56584L,56585L,56586L,56587L, -56588L,56589L,56590L,56591L,56592L,56593L,56594L,56595L,56596L,56597L, -56598L,56599L,56600L,56601L,56602L,56603L,56604L,56605L,56606L,56607L, -56608L,56609L,56610L,56611L,56612L,56613L,56614L,56615L,56616L,56617L, -56618L,56619L,56620L,56621L,56622L,56623L,56624L,56625L,56626L,56627L, -56628L,56629L,56630L,56631L,56632L,56633L,56634L,56635L,56636L,56637L, -56638L,56639L,56640L,56641L,56642L,56643L,56644L,56645L,56646L,56647L, -56648L,56649L,56650L,56651L,56652L,56653L,56654L,56655L,56656L,56657L, -56658L,56659L,56660L,56661L,56662L,56663L,56664L,56665L,56666L,56667L, -56668L,56669L,56670L,56671L,56672L,56673L,56674L,56675L,56676L,56677L, -56678L,56679L,56680L,56681L,56682L,56683L,56684L,56685L,56686L,56687L, -56688L,56689L,56690L,56691L,56692L,56693L,56694L,56695L,56696L,56697L, -56698L,56699L,56700L,56701L,56702L,56703L,56704L,56705L,56706L,56707L, -56708L,56709L,56710L,56711L,56712L,56713L,56714L,56715L,56716L,56717L, -56718L,56719L,56720L,56721L,56722L,56723L,56724L,56725L,56726L,56727L, -56728L,56729L,56730L,56731L,56732L,56733L,56734L,56735L,56736L,56737L, -56738L,56739L,56740L,56741L,56742L,56743L,56744L,56745L,56746L,56747L, -56748L,56749L,56750L,56751L,56752L,56753L,56754L,56755L,56756L,56757L, -56758L,56759L,56760L,56761L,56762L,56763L,56764L,56765L,56766L,56767L, -56768L,56769L,56770L,56771L,56772L,56773L,56774L,56775L,56776L,56777L, -56778L,56779L,56780L,56781L,56782L,56783L,56784L,56785L,56786L,56787L, -56788L,56789L,56790L,56791L,56792L,56793L,56794L,56795L,56796L,56797L, -56798L,56799L,56800L,56801L,56802L,56803L,56804L,56805L,56806L,56807L, -56808L,56809L,56810L,56811L,56812L,56813L,56814L,56815L,56816L,56817L, -56818L,56819L,56820L,56821L,56822L,56823L,56824L,56825L,56826L,56827L, -56828L,56829L,56830L,56831L,56832L,56833L,56834L,56835L,56836L,56837L, -56838L,56839L,56840L,56841L,56842L,56843L,56844L,56845L,56846L,56847L, -56848L,56849L,56850L,56851L,56852L,56853L,56854L,56855L,56856L,56857L, -56858L,56859L,56860L,56861L,56862L,56863L,56864L,56865L,56866L,56867L, -56868L,56869L,56870L,56871L,56872L,56873L,56874L,56875L,56876L,56877L, -56878L,56879L,56880L,56881L,56882L,56883L,56884L,56885L,56886L,56887L, -56888L,56889L,56890L,56891L,56892L,56893L,56894L,56895L,56896L,56897L, -56898L,56899L,56900L,56901L,56902L,56903L,56904L,56905L,56906L,56907L, -56908L,56909L,56910L,56911L,56912L,56913L,56914L,56915L,56916L,56917L, -56918L,56919L,56920L,56921L,56922L,56923L,56924L,56925L,56926L,56927L, -56928L,56929L,56930L,56931L,56932L,56933L,56934L,56935L,56936L,56937L, -56938L,56939L,56940L,56941L,56942L,56943L,56944L,56945L,56946L,56947L, -56948L,56949L,56950L,56951L,56952L,56953L,56954L,56955L,56956L,56957L, -56958L,56959L,56960L,56961L,56962L,56963L,56964L,56965L,56966L,56967L, -56968L,56969L,56970L,56971L,56972L,56973L,56974L,56975L,56976L,56977L, -56978L,56979L,56980L,56981L,56982L,56983L,56984L,56985L,56986L,56987L, -56988L,56989L,56990L,56991L,56992L,56993L,56994L,56995L,56996L,56997L, -56998L,56999L,57000L,57001L,57002L,57003L,57004L,57005L,57006L,57007L, -57008L,57009L,57010L,57011L,57012L,57013L,57014L,57015L,57016L,57017L, -57018L,57019L,57020L,57021L,57022L,57023L,57024L,57025L,57026L,57027L, -57028L,57029L,57030L,57031L,57032L,57033L,57034L,57035L,57036L,57037L, -57038L,57039L,57040L,57041L,57042L,57043L,57044L,57045L,57046L,57047L, -57048L,57049L,57050L,57051L,57052L,57053L,57054L,57055L,57056L,57057L, -57058L,57059L,57060L,57061L,57062L,57063L,57064L,57065L,57066L,57067L, -57068L,57069L,57070L,57071L,57072L,57073L,57074L,57075L,57076L,57077L, -57078L,57079L,57080L,57081L,57082L,57083L,57084L,57085L,57086L,57087L, -57088L,57089L,57090L,57091L,57092L,57093L,57094L,57095L,57096L,57097L, -57098L,57099L,57100L,57101L,57102L,57103L,57104L,57105L,57106L,57107L, -57108L,57109L,57110L,57111L,57112L,57113L,57114L,57115L,57116L,57117L, -57118L,57119L,57120L,57121L,57122L,57123L,57124L,57125L,57126L,57127L, -57128L,57129L,57130L,57131L,57132L,57133L,57134L,57135L,57136L,57137L, -57138L,57139L,57140L,57141L,57142L,57143L,57144L,57145L,57146L,57147L, -57148L,57149L,57150L,57151L,57152L,57153L,57154L,57155L,57156L,57157L, -57158L,57159L,57160L,57161L,57162L,57163L,57164L,57165L,57166L,57167L, -57168L,57169L,57170L,57171L,57172L,57173L,57174L,57175L,57176L,57177L, -57178L,57179L,57180L,57181L,57182L,57183L,57184L,57185L,57186L,57187L, -57188L,57189L,57190L,57191L,57192L,57193L,57194L,57195L,57196L,57197L, -57198L,57199L,57200L,57201L,57202L,57203L,57204L,57205L,57206L,57207L, -57208L,57209L,57210L,57211L,57212L,57213L,57214L,57215L,57216L,57217L, -57218L,57219L,57220L,57221L,57222L,57223L,57224L,57225L,57226L,57227L, -57228L,57229L,57230L,57231L,57232L,57233L,57234L,57235L,57236L,57237L, -57238L,57239L,57240L,57241L,57242L,57243L,57244L,57245L,57246L,57247L, -57248L,57249L,57250L,57251L,57252L,57253L,57254L,57255L,57256L,57257L, -57258L,57259L,57260L,57261L,57262L,57263L,57264L,57265L,57266L,57267L, -57268L,57269L,57270L,57271L,57272L,57273L,57274L,57275L,57276L,57277L, -57278L,57279L,57280L,57281L,57282L,57283L,57284L,57285L,57286L,57287L, -57288L,57289L,57290L,57291L,57292L,57293L,57294L,57295L,57296L,57297L, -57298L,57299L,57300L,57301L,57302L,57303L,57304L,57305L,57306L,57307L, -57308L,57309L,57310L,57311L,57312L,57313L,57314L,57315L,57316L,57317L, -57318L,57319L,57320L,57321L,57322L,57323L,57324L,57325L,57326L,57327L, -57328L,57329L,57330L,57331L,57332L,57333L,57334L,57335L,57336L,57337L, -57338L,57339L,57340L,57341L,57342L,57343L,57344L,57345L,57346L,57347L, -57348L,57349L,57350L,57351L,57352L,57353L,57354L,57355L,57356L,57357L, -57358L,57359L,57360L,57361L,57362L,57363L,57364L,57365L,57366L,57367L, -57368L,57369L,57370L,57371L,57372L,57373L,57374L,57375L,57376L,57377L, -57378L,57379L,57380L,57381L,57382L,57383L,57384L,57385L,57386L,57387L, -57388L,57389L,57390L,57391L,57392L,57393L,57394L,57395L,57396L,57397L, -57398L,57399L,57400L,57401L,57402L,57403L,57404L,57405L,57406L,57407L, -57408L,57409L,57410L,57411L,57412L,57413L,57414L,57415L,57416L,57417L, -57418L,57419L,57420L,57421L,57422L,57423L,57424L,57425L,57426L,57427L, -57428L,57429L,57430L,57431L,57432L,57433L,57434L,57435L,57436L,57437L, -57438L,57439L,57440L,57441L,57442L,57443L,57444L,57445L,57446L,57447L, -57448L,57449L,57450L,57451L,57452L,57453L,57454L,57455L,57456L,57457L, -57458L,57459L,57460L,57461L,57462L,57463L,57464L,57465L,57466L,57467L, -57468L,57469L,57470L,57471L,57472L,57473L,57474L,57475L,57476L,57477L, -57478L,57479L,57480L,57481L,57482L,57483L,57484L,57485L,57486L,57487L, -57488L,57489L,57490L,57491L,57492L,57493L,57494L,57495L,57496L,57497L, -57498L,57499L,57500L,57501L,57502L,57503L,57504L,57505L,57506L,57507L, -57508L,57509L,57510L,57511L,57512L,57513L,57514L,57515L,57516L,57517L, -57518L,57519L,57520L,57521L,57522L,57523L,57524L,57525L,57526L,57527L, -57528L,57529L,57530L,57531L,57532L,57533L,57534L,57535L,57536L,57537L, -57538L,57539L,57540L,57541L,57542L,57543L,57544L,57545L,57546L,57547L, -57548L,57549L,57550L,57551L,57552L,57553L,57554L,57555L,57556L,57557L, -57558L,57559L,57560L,57561L,57562L,57563L,57564L,57565L,57566L,57567L, -57568L,57569L,57570L,57571L,57572L,57573L,57574L,57575L,57576L,57577L, -57578L,57579L,57580L,57581L,57582L,57583L,57584L,57585L,57586L,57587L, -57588L,57589L,57590L,57591L,57592L,57593L,57594L,57595L,57596L,57597L, -57598L,57599L,57600L,57601L,57602L,57603L,57604L,57605L,57606L,57607L, -57608L,57609L,57610L,57611L,57612L,57613L,57614L,57615L,57616L,57617L, -57618L,57619L,57620L,57621L,57622L,57623L,57624L,57625L,57626L,57627L, -57628L,57629L,57630L,57631L,57632L,57633L,57634L,57635L,57636L,57637L, -57638L,57639L,57640L,57641L,57642L,57643L,57644L,57645L,57646L,57647L, -57648L,57649L,57650L,57651L,57652L,57653L,57654L,57655L,57656L,57657L, -57658L,57659L,57660L,57661L,57662L,57663L,57664L,57665L,57666L,57667L, -57668L,57669L,57670L,57671L,57672L,57673L,57674L,57675L,57676L,57677L, -57678L,57679L,57680L,57681L,57682L,57683L,57684L,57685L,57686L,57687L, -57688L,57689L,57690L,57691L,57692L,57693L,57694L,57695L,57696L,57697L, -57698L,57699L,57700L,57701L,57702L,57703L,57704L,57705L,57706L,57707L, -57708L,57709L,57710L,57711L,57712L,57713L,57714L,57715L,57716L,57717L, -57718L,57719L,57720L,57721L,57722L,57723L,57724L,57725L,57726L,57727L, -57728L,57729L,57730L,57731L,57732L,57733L,57734L,57735L,57736L,57737L, -57738L,57739L,57740L,57741L,57742L,57743L,57744L,57745L,57746L,57747L, -57748L,57749L,57750L,57751L,57752L,57753L,57754L,57755L,57756L,57757L, -57758L,57759L,57760L,57761L,57762L,57763L,57764L,57765L,57766L,57767L, -57768L,57769L,57770L,57771L,57772L,57773L,57774L,57775L,57776L,57777L, -57778L,57779L,57780L,57781L,57782L,57783L,57784L,57785L,57786L,57787L, -57788L,57789L,57790L,57791L,57792L,57793L,57794L,57795L,57796L,57797L, -57798L,57799L,57800L,57801L,57802L,57803L,57804L,57805L,57806L,57807L, -57808L,57809L,57810L,57811L,57812L,57813L,57814L,57815L,57816L,57817L, -57818L,57819L,57820L,57821L,57822L,57823L,57824L,57825L,57826L,57827L, -57828L,57829L,57830L,57831L,57832L,57833L,57834L,57835L,57836L,57837L, -57838L,57839L,57840L,57841L,57842L,57843L,57844L,57845L,57846L,57847L, -57848L,57849L,57850L,57851L,57852L,57853L,57854L,57855L,57856L,57857L, -57858L,57859L,57860L,57861L,57862L,57863L,57864L,57865L,57866L,57867L, -57868L,57869L,57870L,57871L,57872L,57873L,57874L,57875L,57876L,57877L, -57878L,57879L,57880L,57881L,57882L,57883L,57884L,57885L,57886L,57887L, -57888L,57889L,57890L,57891L,57892L,57893L,57894L,57895L,57896L,57897L, -57898L,57899L,57900L,57901L,57902L,57903L,57904L,57905L,57906L,57907L, -57908L,57909L,57910L,57911L,57912L,57913L,57914L,57915L,57916L,57917L, -57918L,57919L,57920L,57921L,57922L,57923L,57924L,57925L,57926L,57927L, -57928L,57929L,57930L,57931L,57932L,57933L,57934L,57935L,57936L,57937L, -57938L,57939L,57940L,57941L,57942L,57943L,57944L,57945L,57946L,57947L, -57948L,57949L,57950L,57951L,57952L,57953L,57954L,57955L,57956L,57957L, -57958L,57959L,57960L,57961L,57962L,57963L,57964L,57965L,57966L,57967L, -57968L,57969L,57970L,57971L,57972L,57973L,57974L,57975L,57976L,57977L, -57978L,57979L,57980L,57981L,57982L,57983L,57984L,57985L,57986L,57987L, -57988L,57989L,57990L,57991L,57992L,57993L,57994L,57995L,57996L,57997L, -57998L,57999L,58000L,58001L,58002L,58003L,58004L,58005L,58006L,58007L, -58008L,58009L,58010L,58011L,58012L,58013L,58014L,58015L,58016L,58017L, -58018L,58019L,58020L,58021L,58022L,58023L,58024L,58025L,58026L,58027L, -58028L,58029L,58030L,58031L,58032L,58033L,58034L,58035L,58036L,58037L, -58038L,58039L,58040L,58041L,58042L,58043L,58044L,58045L,58046L,58047L, -58048L,58049L,58050L,58051L,58052L,58053L,58054L,58055L,58056L,58057L, -58058L,58059L,58060L,58061L,58062L,58063L,58064L,58065L,58066L,58067L, -58068L,58069L,58070L,58071L,58072L,58073L,58074L,58075L,58076L,58077L, -58078L,58079L,58080L,58081L,58082L,58083L,58084L,58085L,58086L,58087L, -58088L,58089L,58090L,58091L,58092L,58093L,58094L,58095L,58096L,58097L, -58098L,58099L,58100L,58101L,58102L,58103L,58104L,58105L,58106L,58107L, -58108L,58109L,58110L,58111L,58112L,58113L,58114L,58115L,58116L,58117L, -58118L,58119L,58120L,58121L,58122L,58123L,58124L,58125L,58126L,58127L, -58128L,58129L,58130L,58131L,58132L,58133L,58134L,58135L,58136L,58137L, -58138L,58139L,58140L,58141L,58142L,58143L,58144L,58145L,58146L,58147L, -58148L,58149L,58150L,58151L,58152L,58153L,58154L,58155L,58156L,58157L, -58158L,58159L,58160L,58161L,58162L,58163L,58164L,58165L,58166L,58167L, -58168L,58169L,58170L,58171L,58172L,58173L,58174L,58175L,58176L,58177L, -58178L,58179L,58180L,58181L,58182L,58183L,58184L,58185L,58186L,58187L, -58188L,58189L,58190L,58191L,58192L,58193L,58194L,58195L,58196L,58197L, -58198L,58199L,58200L,58201L,58202L,58203L,58204L,58205L,58206L,58207L, -58208L,58209L,58210L,58211L,58212L,58213L,58214L,58215L,58216L,58217L, -58218L,58219L,58220L,58221L,58222L,58223L,58224L,58225L,58226L,58227L, -58228L,58229L,58230L,58231L,58232L,58233L,58234L,58235L,58236L,58237L, -58238L,58239L,58240L,58241L,58242L,58243L,58244L,58245L,58246L,58247L, -58248L,58249L,58250L,58251L,58252L,58253L,58254L,58255L,58256L,58257L, -58258L,58259L,58260L,58261L,58262L,58263L,58264L,58265L,58266L,58267L, -58268L,58269L,58270L,58271L,58272L,58273L,58274L,58275L,58276L,58277L, -58278L,58279L,58280L,58281L,58282L,58283L,58284L,58285L,58286L,58287L, -58288L,58289L,58290L,58291L,58292L,58293L,58294L,58295L,58296L,58297L, -58298L,58299L,58300L,58301L,58302L,58303L,58304L,58305L,58306L,58307L, -58308L,58309L,58310L,58311L,58312L,58313L,58314L,58315L,58316L,58317L, -58318L,58319L,58320L,58321L,58322L,58323L,58324L,58325L,58326L,58327L, -58328L,58329L,58330L,58331L,58332L,58333L,58334L,58335L,58336L,58337L, -58338L,58339L,58340L,58341L,58342L,58343L,58344L,58345L,58346L,58347L, -58348L,58349L,58350L,58351L,58352L,58353L,58354L,58355L,58356L,58357L, -58358L,58359L,58360L,58361L,58362L,58363L,58364L,58365L,58366L,58367L, -58368L,58369L,58370L,58371L,58372L,58373L,58374L,58375L,58376L,58377L, -58378L,58379L,58380L,58381L,58382L,58383L,58384L,58385L,58386L,58387L, -58388L,58389L,58390L,58391L,58392L,58393L,58394L,58395L,58396L,58397L, -58398L,58399L,58400L,58401L,58402L,58403L,58404L,58405L,58406L,58407L, -58408L,58409L,58410L,58411L,58412L,58413L,58414L,58415L,58416L,58417L, -58418L,58419L,58420L,58421L,58422L,58423L,58424L,58425L,58426L,58427L, -58428L,58429L,58430L,58431L,58432L,58433L,58434L,58435L,58436L,58437L, -58438L,58439L,58440L,58441L,58442L,58443L,58444L,58445L,58446L,58447L, -58448L,58449L,58450L,58451L,58452L,58453L,58454L,58455L,58456L,58457L, -58458L,58459L,58460L,58461L,58462L,58463L,58464L,58465L,58466L,58467L, -58468L,58469L,58470L,58471L,58472L,58473L,58474L,58475L,58476L,58477L, -58478L,58479L,58480L,58481L,58482L,58483L,58484L,58485L,58486L,58487L, -58488L,58489L,58490L,58491L,58492L,58493L,58494L,58495L,58496L,58497L, -58498L,58499L,58500L,58501L,58502L,58503L,58504L,58505L,58506L,58507L, -58508L,58509L,58510L,58511L,58512L,58513L,58514L,58515L,58516L,58517L, -58518L,58519L,58520L,58521L,58522L,58523L,58524L,58525L,58526L,58527L, -58528L,58529L,58530L,58531L,58532L,58533L,58534L,58535L,58536L,58537L, -58538L,58539L,58540L,58541L,58542L,58543L,58544L,58545L,58546L,58547L, -58548L,58549L,58550L,58551L,58552L,58553L,58554L,58555L,58556L,58557L, -58558L,58559L,58560L,58561L,58562L,58563L,58564L,58565L,58566L,58567L, -58568L,58569L,58570L,58571L,58572L,58573L,58574L,58575L,58576L,58577L, -58578L,58579L,58580L,58581L,58582L,58583L,58584L,58585L,58586L,58587L, -58588L,58589L,58590L,58591L,58592L,58593L,58594L,58595L,58596L,58597L, -58598L,58599L,58600L,58601L,58602L,58603L,58604L,58605L,58606L,58607L, -58608L,58609L,58610L,58611L,58612L,58613L,58614L,58615L,58616L,58617L, -58618L,58619L,58620L,58621L,58622L,58623L,58624L,58625L,58626L,58627L, -58628L,58629L,58630L,58631L,58632L,58633L,58634L,58635L,58636L,58637L, -58638L,58639L,58640L,58641L,58642L,58643L,58644L,58645L,58646L,58647L, -58648L,58649L,58650L,58651L,58652L,58653L,58654L,58655L,58656L,58657L, -58658L,58659L,58660L,58661L,58662L,58663L,58664L,58665L,58666L,58667L, -58668L,58669L,58670L,58671L,58672L,58673L,58674L,58675L,58676L,58677L, -58678L,58679L,58680L,58681L,58682L,58683L,58684L,58685L,58686L,58687L, -58688L,58689L,58690L,58691L,58692L,58693L,58694L,58695L,58696L,58697L, -58698L,58699L,58700L,58701L,58702L,58703L,58704L,58705L,58706L,58707L, -58708L,58709L,58710L,58711L,58712L,58713L,58714L,58715L,58716L,58717L, -58718L,58719L,58720L,58721L,58722L,58723L,58724L,58725L,58726L,58727L, -58728L,58729L,58730L,58731L,58732L,58733L,58734L,58735L,58736L,58737L, -58738L,58739L,58740L,58741L,58742L,58743L,58744L,58745L,58746L,58747L, -58748L,58749L,58750L,58751L,58752L,58753L,58754L,58755L,58756L,58757L, -58758L,58759L,58760L,58761L,58762L,58763L,58764L,58765L,58766L,58767L, -58768L,58769L,58770L,58771L,58772L,58773L,58774L,58775L,58776L,58777L, -58778L,58779L,58780L,58781L,58782L,58783L,58784L,58785L,58786L,58787L, -58788L,58789L,58790L,58791L,58792L,58793L,58794L,58795L,58796L,58797L, -58798L,58799L,58800L,58801L,58802L,58803L,58804L,58805L,58806L,58807L, -58808L,58809L,58810L,58811L,58812L,58813L,58814L,58815L,58816L,58817L, -58818L,58819L,58820L,58821L,58822L,58823L,58824L,58825L,58826L,58827L, -58828L,58829L,58830L,58831L,58832L,58833L,58834L,58835L,58836L,58837L, -58838L,58839L,58840L,58841L,58842L,58843L,58844L,58845L,58846L,58847L, -58848L,58849L,58850L,58851L,58852L,58853L,58854L,58855L,58856L,58857L, -58858L,58859L,58860L,58861L,58862L,58863L,58864L,58865L,58866L,58867L, -58868L,58869L,58870L,58871L,58872L,58873L,58874L,58875L,58876L,58877L, -58878L,58879L,58880L,58881L,58882L,58883L,58884L,58885L,58886L,58887L, -58888L,58889L,58890L,58891L,58892L,58893L,58894L,58895L,58896L,58897L, -58898L,58899L,58900L,58901L,58902L,58903L,58904L,58905L,58906L,58907L, -58908L,58909L,58910L,58911L,58912L,58913L,58914L,58915L,58916L,58917L, -58918L,58919L,58920L,58921L,58922L,58923L,58924L,58925L,58926L,58927L, -58928L,58929L,58930L,58931L,58932L,58933L,58934L,58935L,58936L,58937L, -58938L,58939L,58940L,58941L,58942L,58943L,58944L,58945L,58946L,58947L, -58948L,58949L,58950L,58951L,58952L,58953L,58954L,58955L,58956L,58957L, -58958L,58959L,58960L,58961L,58962L,58963L,58964L,58965L,58966L,58967L, -58968L,58969L,58970L,58971L,58972L,58973L,58974L,58975L,58976L,58977L, -58978L,58979L,58980L,58981L,58982L,58983L,58984L,58985L,58986L,58987L, -58988L,58989L,58990L,58991L,58992L,58993L,58994L,58995L,58996L,58997L, -58998L,58999L,59000L,59001L,59002L,59003L,59004L,59005L,59006L,59007L, -59008L,59009L,59010L,59011L,59012L,59013L,59014L,59015L,59016L,59017L, -59018L,59019L,59020L,59021L,59022L,59023L,59024L,59025L,59026L,59027L, -59028L,59029L,59030L,59031L,59032L,59033L,59034L,59035L,59036L,59037L, -59038L,59039L,59040L,59041L,59042L,59043L,59044L,59045L,59046L,59047L, -59048L,59049L,59050L,59051L,59052L,59053L,59054L,59055L,59056L,59057L, -59058L,59059L,59060L,59061L,59062L,59063L,59064L,59065L,59066L,59067L, -59068L,59069L,59070L,59071L,59072L,59073L,59074L,59075L,59076L,59077L, -59078L,59079L,59080L,59081L,59082L,59083L,59084L,59085L,59086L,59087L, -59088L,59089L,59090L,59091L,59092L,59093L,59094L,59095L,59096L,59097L, -59098L,59099L,59100L,59101L,59102L,59103L,59104L,59105L,59106L,59107L, -59108L,59109L,59110L,59111L,59112L,59113L,59114L,59115L,59116L,59117L, -59118L,59119L,59120L,59121L,59122L,59123L,59124L,59125L,59126L,59127L, -59128L,59129L,59130L,59131L,59132L,59133L,59134L,59135L,59136L,59137L, -59138L,59139L,59140L,59141L,59142L,59143L,59144L,59145L,59146L,59147L, -59148L,59149L,59150L,59151L,59152L,59153L,59154L,59155L,59156L,59157L, -59158L,59159L,59160L,59161L,59162L,59163L,59164L,59165L,59166L,59167L, -59168L,59169L,59170L,59171L,59172L,59173L,59174L,59175L,59176L,59177L, -59178L,59179L,59180L,59181L,59182L,59183L,59184L,59185L,59186L,59187L, -59188L,59189L,59190L,59191L,59192L,59193L,59194L,59195L,59196L,59197L, -59198L,59199L,59200L,59201L,59202L,59203L,59204L,59205L,59206L,59207L, -59208L,59209L,59210L,59211L,59212L,59213L,59214L,59215L,59216L,59217L, -59218L,59219L,59220L,59221L,59222L,59223L,59224L,59225L,59226L,59227L, -59228L,59229L,59230L,59231L,59232L,59233L,59234L,59235L,59236L,59237L, -59238L,59239L,59240L,59241L,59242L,59243L,59244L,59245L,59246L,59247L, -59248L,59249L,59250L,59251L,59252L,59253L,59254L,59255L,59256L,59257L, -59258L,59259L,59260L,59261L,59262L,59263L,59264L,59265L,59266L,59267L, -59268L,59269L,59270L,59271L,59272L,59273L,59274L,59275L,59276L,59277L, -59278L,59279L,59280L,59281L,59282L,59283L,59284L,59285L,59286L,59287L, -59288L,59289L,59290L,59291L,59292L,59293L,59294L,59295L,59296L,59297L, -59298L,59299L,59300L,59301L,59302L,59303L,59304L,59305L,59306L,59307L, -59308L,59309L,59310L,59311L,59312L,59313L,59314L,59315L,59316L,59317L, -59318L,59319L,59320L,59321L,59322L,59323L,59324L,59325L,59326L,59327L, -59328L,59329L,59330L,59331L,59332L,59333L,59334L,59335L,59336L,59337L, -59338L,59339L,59340L,59341L,59342L,59343L,59344L,59345L,59346L,59347L, -59348L,59349L,59350L,59351L,59352L,59353L,59354L,59355L,59356L,59357L, -59358L,59359L,59360L,59361L,59362L,59363L,59364L,59365L,59366L,59367L, -59368L,59369L,59370L,59371L,59372L,59373L,59374L,59375L,59376L,59377L, -59378L,59379L,59380L,59381L,59382L,59383L,59384L,59385L,59386L,59387L, -59388L,59389L,59390L,59391L,59392L,59393L,59394L,59395L,59396L,59397L, -59398L,59399L,59400L,59401L,59402L,59403L,59404L,59405L,59406L,59407L, -59408L,59409L,59410L,59411L,59412L,59413L,59414L,59415L,59416L,59417L, -59418L,59419L,59420L,59421L,59422L,59423L,59424L,59425L,59426L,59427L, -59428L,59429L,59430L,59431L,59432L,59433L,59434L,59435L,59436L,59437L, -59438L,59439L,59440L,59441L,59442L,59443L,59444L,59445L,59446L,59447L, -59448L,59449L,59450L,59451L,59452L,59453L,59454L,59455L,59456L,59457L, -59458L,59459L,59460L,59461L,59462L,59463L,59464L,59465L,59466L,59467L, -59468L,59469L,59470L,59471L,59472L,59473L,59474L,59475L,59476L,59477L, -59478L,59479L,59480L,59481L,59482L,59483L,59484L,59485L,59486L,59487L, -59488L,59489L,59490L,59491L,59492L,59493L,59494L,59495L,59496L,59497L, -59498L,59499L,59500L,59501L,59502L,59503L,59504L,59505L,59506L,59507L, -59508L,59509L,59510L,59511L,59512L,59513L,59514L,59515L,59516L,59517L, -59518L,59519L,59520L,59521L,59522L,59523L,59524L,59525L,59526L,59527L, -59528L,59529L,59530L,59531L,59532L,59533L,59534L,59535L,59536L,59537L, -59538L,59539L,59540L,59541L,59542L,59543L,59544L,59545L,59546L,59547L, -59548L,59549L,59550L,59551L,59552L,59553L,59554L,59555L,59556L,59557L, -59558L,59559L,59560L,59561L,59562L,59563L,59564L,59565L,59566L,59567L, -59568L,59569L,59570L,59571L,59572L,59573L,59574L,59575L,59576L,59577L, -59578L,59579L,59580L,59581L,59582L,59583L,59584L,59585L,59586L,59587L, -59588L,59589L,59590L,59591L,59592L,59593L,59594L,59595L,59596L,59597L, -59598L,59599L,59600L,59601L,59602L,59603L,59604L,59605L,59606L,59607L, -59608L,59609L,59610L,59611L,59612L,59613L,59614L,59615L,59616L,59617L, -59618L,59619L,59620L,59621L,59622L,59623L,59624L,59625L,59626L,59627L, -59628L,59629L,59630L,59631L,59632L,59633L,59634L,59635L,59636L,59637L, -59638L,59639L,59640L,59641L,59642L,59643L,59644L,59645L,59646L,59647L, -59648L,59649L,59650L,59651L,59652L,59653L,59654L,59655L,59656L,59657L, -59658L,59659L,59660L,59661L,59662L,59663L,59664L,59665L,59666L,59667L, -59668L,59669L,59670L,59671L,59672L,59673L,59674L,59675L,59676L,59677L, -59678L,59679L,59680L,59681L,59682L,59683L,59684L,59685L,59686L,59687L, -59688L,59689L,59690L,59691L,59692L,59693L,59694L,59695L,59696L,59697L, -59698L,59699L,59700L,59701L,59702L,59703L,59704L,59705L,59706L,59707L, -59708L,59709L,59710L,59711L,59712L,59713L,59714L,59715L,59716L,59717L, -59718L,59719L,59720L,59721L,59722L,59723L,59724L,59725L,59726L,59727L, -59728L,59729L,59730L,59731L,59732L,59733L,59734L,59735L,59736L,59737L, -59738L,59739L,59740L,59741L,59742L,59743L,59744L,59745L,59746L,59747L, -59748L,59749L,59750L,59751L,59752L,59753L,59754L,59755L,59756L,59757L, -59758L,59759L,59760L,59761L,59762L,59763L,59764L,59765L,59766L,59767L, -59768L,59769L,59770L,59771L,59772L,59773L,59774L,59775L,59776L,59777L, -59778L,59779L,59780L,59781L,59782L,59783L,59784L,59785L,59786L,59787L, -59788L,59789L,59790L,59791L,59792L,59793L,59794L,59795L,59796L,59797L, -59798L,59799L,59800L,59801L,59802L,59803L,59804L,59805L,59806L,59807L, -59808L,59809L,59810L,59811L,59812L,59813L,59814L,59815L,59816L,59817L, -59818L,59819L,59820L,59821L,59822L,59823L,59824L,59825L,59826L,59827L, -59828L,59829L,59830L,59831L,59832L,59833L,59834L,59835L,59836L,59837L, -59838L,59839L,59840L,59841L,59842L,59843L,59844L,59845L,59846L,59847L, -59848L,59849L,59850L,59851L,59852L,59853L,59854L,59855L,59856L,59857L, -59858L,59859L,59860L,59861L,59862L,59863L,59864L,59865L,59866L,59867L, -59868L,59869L,59870L,59871L,59872L,59873L,59874L,59875L,59876L,59877L, -59878L,59879L,59880L,59881L,59882L,59883L,59884L,59885L,59886L,59887L, -59888L,59889L,59890L,59891L,59892L,59893L,59894L,59895L,59896L,59897L, -59898L,59899L,59900L,59901L,59902L,59903L,59904L,59905L,59906L,59907L, -59908L,59909L,59910L,59911L,59912L,59913L,59914L,59915L,59916L,59917L, -59918L,59919L,59920L,59921L,59922L,59923L,59924L,59925L,59926L,59927L, -59928L,59929L,59930L,59931L,59932L,59933L,59934L,59935L,59936L,59937L, -59938L,59939L,59940L,59941L,59942L,59943L,59944L,59945L,59946L,59947L, -59948L,59949L,59950L,59951L,59952L,59953L,59954L,59955L,59956L,59957L, -59958L,59959L,59960L,59961L,59962L,59963L,59964L,59965L,59966L,59967L, -59968L,59969L,59970L,59971L,59972L,59973L,59974L,59975L,59976L,59977L, -59978L,59979L,59980L,59981L,59982L,59983L,59984L,59985L,59986L,59987L, -59988L,59989L,59990L,59991L,59992L,59993L,59994L,59995L,59996L,59997L, -59998L,59999L,60000L,60001L,60002L,60003L,60004L,60005L,60006L,60007L, -60008L,60009L,60010L,60011L,60012L,60013L,60014L,60015L,60016L,60017L, -60018L,60019L,60020L,60021L,60022L,60023L,60024L,60025L,60026L,60027L, -60028L,60029L,60030L,60031L,60032L,60033L,60034L,60035L,60036L,60037L, -60038L,60039L,60040L,60041L,60042L,60043L,60044L,60045L,60046L,60047L, -60048L,60049L,60050L,60051L,60052L,60053L,60054L,60055L,60056L,60057L, -60058L,60059L,60060L,60061L,60062L,60063L,60064L,60065L,60066L,60067L, -60068L,60069L,60070L,60071L,60072L,60073L,60074L,60075L,60076L,60077L, -60078L,60079L,60080L,60081L,60082L,60083L,60084L,60085L,60086L,60087L, -60088L,60089L,60090L,60091L,60092L,60093L,60094L,60095L,60096L,60097L, -60098L,60099L,60100L,60101L,60102L,60103L,60104L,60105L,60106L,60107L, -60108L,60109L,60110L,60111L,60112L,60113L,60114L,60115L,60116L,60117L, -60118L,60119L,60120L,60121L,60122L,60123L,60124L,60125L,60126L,60127L, -60128L,60129L,60130L,60131L,60132L,60133L,60134L,60135L,60136L,60137L, -60138L,60139L,60140L,60141L,60142L,60143L,60144L,60145L,60146L,60147L, -60148L,60149L,60150L,60151L,60152L,60153L,60154L,60155L,60156L,60157L, -60158L,60159L,60160L,60161L,60162L,60163L,60164L,60165L,60166L,60167L, -60168L,60169L,60170L,60171L,60172L,60173L,60174L,60175L,60176L,60177L, -60178L,60179L,60180L,60181L,60182L,60183L,60184L,60185L,60186L,60187L, -60188L,60189L,60190L,60191L,60192L,60193L,60194L,60195L,60196L,60197L, -60198L,60199L,60200L,60201L,60202L,60203L,60204L,60205L,60206L,60207L, -60208L,60209L,60210L,60211L,60212L,60213L,60214L,60215L,60216L,60217L, -60218L,60219L,60220L,60221L,60222L,60223L,60224L,60225L,60226L,60227L, -60228L,60229L,60230L,60231L,60232L,60233L,60234L,60235L,60236L,60237L, -60238L,60239L,60240L,60241L,60242L,60243L,60244L,60245L,60246L,60247L, -60248L,60249L,60250L,60251L,60252L,60253L,60254L,60255L,60256L,60257L, -60258L,60259L,60260L,60261L,60262L,60263L,60264L,60265L,60266L,60267L, -60268L,60269L,60270L,60271L,60272L,60273L,60274L,60275L,60276L,60277L, -60278L,60279L,60280L,60281L,60282L,60283L,60284L,60285L,60286L,60287L, -60288L,60289L,60290L,60291L,60292L,60293L,60294L,60295L,60296L,60297L, -60298L,60299L,60300L,60301L,60302L,60303L,60304L,60305L,60306L,60307L, -60308L,60309L,60310L,60311L,60312L,60313L,60314L,60315L,60316L,60317L, -60318L,60319L,60320L,60321L,60322L,60323L,60324L,60325L,60326L,60327L, -60328L,60329L,60330L,60331L,60332L,60333L,60334L,60335L,60336L,60337L, -60338L,60339L,60340L,60341L,60342L,60343L,60344L,60345L,60346L,60347L, -60348L,60349L,60350L,60351L,60352L,60353L,60354L,60355L,60356L,60357L, -60358L,60359L,60360L,60361L,60362L,60363L,60364L,60365L,60366L,60367L, -60368L,60369L,60370L,60371L,60372L,60373L,60374L,60375L,60376L,60377L, -60378L,60379L,60380L,60381L,60382L,60383L,60384L,60385L,60386L,60387L, -60388L,60389L,60390L,60391L,60392L,60393L,60394L,60395L,60396L,60397L, -60398L,60399L,60400L,60401L,60402L,60403L,60404L,60405L,60406L,60407L, -60408L,60409L,60410L,60411L,60412L,60413L,60414L,60415L,60416L,60417L, -60418L,60419L,60420L,60421L,60422L,60423L,60424L,60425L,60426L,60427L, -60428L,60429L,60430L,60431L,60432L,60433L,60434L,60435L,60436L,60437L, -60438L,60439L,60440L,60441L,60442L,60443L,60444L,60445L,60446L,60447L, -60448L,60449L,60450L,60451L,60452L,60453L,60454L,60455L,60456L,60457L, -60458L,60459L,60460L,60461L,60462L,60463L,60464L,60465L,60466L,60467L, -60468L,60469L,60470L,60471L,60472L,60473L,60474L,60475L,60476L,60477L, -60478L,60479L,60480L,60481L,60482L,60483L,60484L,60485L,60486L,60487L, -60488L,60489L,60490L,60491L,60492L,60493L,60494L,60495L,60496L,60497L, -60498L,60499L,60500L,60501L,60502L,60503L,60504L,60505L,60506L,60507L, -60508L,60509L,60510L,60511L,60512L,60513L,60514L,60515L,60516L,60517L, -60518L,60519L,60520L,60521L,60522L,60523L,60524L,60525L,60526L,60527L, -60528L,60529L,60530L,60531L,60532L,60533L,60534L,60535L,60536L,60537L, -60538L,60539L,60540L,60541L,60542L,60543L,60544L,60545L,60546L,60547L, -60548L,60549L,60550L,60551L,60552L,60553L,60554L,60555L,60556L,60557L, -60558L,60559L,60560L,60561L,60562L,60563L,60564L,60565L,60566L,60567L, -60568L,60569L,60570L,60571L,60572L,60573L,60574L,60575L,60576L,60577L, -60578L,60579L,60580L,60581L,60582L,60583L,60584L,60585L,60586L,60587L, -60588L,60589L,60590L,60591L,60592L,60593L,60594L,60595L,60596L,60597L, -60598L,60599L,60600L,60601L,60602L,60603L,60604L,60605L,60606L,60607L, -60608L,60609L,60610L,60611L,60612L,60613L,60614L,60615L,60616L,60617L, -60618L,60619L,60620L,60621L,60622L,60623L,60624L,60625L,60626L,60627L, -60628L,60629L,60630L,60631L,60632L,60633L,60634L,60635L,60636L,60637L, -60638L,60639L,60640L,60641L,60642L,60643L,60644L,60645L,60646L,60647L, -60648L,60649L,60650L,60651L,60652L,60653L,60654L,60655L,60656L,60657L, -60658L,60659L,60660L,60661L,60662L,60663L,60664L,60665L,60666L,60667L, -60668L,60669L,60670L,60671L,60672L,60673L,60674L,60675L,60676L,60677L, -60678L,60679L,60680L,60681L,60682L,60683L,60684L,60685L,60686L,60687L, -60688L,60689L,60690L,60691L,60692L,60693L,60694L,60695L,60696L,60697L, -60698L,60699L,60700L,60701L,60702L,60703L,60704L,60705L,60706L,60707L, -60708L,60709L,60710L,60711L,60712L,60713L,60714L,60715L,60716L,60717L, -60718L,60719L,60720L,60721L,60722L,60723L,60724L,60725L,60726L,60727L, -60728L,60729L,60730L,60731L,60732L,60733L,60734L,60735L,60736L,60737L, -60738L,60739L,60740L,60741L,60742L,60743L,60744L,60745L,60746L,60747L, -60748L,60749L,60750L,60751L,60752L,60753L,60754L,60755L,60756L,60757L, -60758L,60759L,60760L,60761L,60762L,60763L,60764L,60765L,60766L,60767L, -60768L,60769L,60770L,60771L,60772L,60773L,60774L,60775L,60776L,60777L, -60778L,60779L,60780L,60781L,60782L,60783L,60784L,60785L,60786L,60787L, -60788L,60789L,60790L,60791L,60792L,60793L,60794L,60795L,60796L,60797L, -60798L,60799L,60800L,60801L,60802L,60803L,60804L,60805L,60806L,60807L, -60808L,60809L,60810L,60811L,60812L,60813L,60814L,60815L,60816L,60817L, -60818L,60819L,60820L,60821L,60822L,60823L,60824L,60825L,60826L,60827L, -60828L,60829L,60830L,60831L,60832L,60833L,60834L,60835L,60836L,60837L, -60838L,60839L,60840L,60841L,60842L,60843L,60844L,60845L,60846L,60847L, -60848L,60849L,60850L,60851L,60852L,60853L,60854L,60855L,60856L,60857L, -60858L,60859L,60860L,60861L,60862L,60863L,60864L,60865L,60866L,60867L, -60868L,60869L,60870L,60871L,60872L,60873L,60874L,60875L,60876L,60877L, -60878L,60879L,60880L,60881L,60882L,60883L,60884L,60885L,60886L,60887L, -60888L,60889L,60890L,60891L,60892L,60893L,60894L,60895L,60896L,60897L, -60898L,60899L,60900L,60901L,60902L,60903L,60904L,60905L,60906L,60907L, -60908L,60909L,60910L,60911L,60912L,60913L,60914L,60915L,60916L,60917L, -60918L,60919L,60920L,60921L,60922L,60923L,60924L,60925L,60926L,60927L, -60928L,60929L,60930L,60931L,60932L,60933L,60934L,60935L,60936L,60937L, -60938L,60939L,60940L,60941L,60942L,60943L,60944L,60945L,60946L,60947L, -60948L,60949L,60950L,60951L,60952L,60953L,60954L,60955L,60956L,60957L, -60958L,60959L,60960L,60961L,60962L,60963L,60964L,60965L,60966L,60967L, -60968L,60969L,60970L,60971L,60972L,60973L,60974L,60975L,60976L,60977L, -60978L,60979L,60980L,60981L,60982L,60983L,60984L,60985L,60986L,60987L, -60988L,60989L,60990L,60991L,60992L,60993L,60994L,60995L,60996L,60997L, -60998L,60999L,61000L,61001L,61002L,61003L,61004L,61005L,61006L,61007L, -61008L,61009L,61010L,61011L,61012L,61013L,61014L,61015L,61016L,61017L, -61018L,61019L,61020L,61021L,61022L,61023L,61024L,61025L,61026L,61027L, -61028L,61029L,61030L,61031L,61032L,61033L,61034L,61035L,61036L,61037L, -61038L,61039L,61040L,61041L,61042L,61043L,61044L,61045L,61046L,61047L, -61048L,61049L,61050L,61051L,61052L,61053L,61054L,61055L,61056L,61057L, -61058L,61059L,61060L,61061L,61062L,61063L,61064L,61065L,61066L,61067L, -61068L,61069L,61070L,61071L,61072L,61073L,61074L,61075L,61076L,61077L, -61078L,61079L,61080L,61081L,61082L,61083L,61084L,61085L,61086L,61087L, -61088L,61089L,61090L,61091L,61092L,61093L,61094L,61095L,61096L,61097L, -61098L,61099L,61100L,61101L,61102L,61103L,61104L,61105L,61106L,61107L, -61108L,61109L,61110L,61111L,61112L,61113L,61114L,61115L,61116L,61117L, -61118L,61119L,61120L,61121L,61122L,61123L,61124L,61125L,61126L,61127L, -61128L,61129L,61130L,61131L,61132L,61133L,61134L,61135L,61136L,61137L, -61138L,61139L,61140L,61141L,61142L,61143L,61144L,61145L,61146L,61147L, -61148L,61149L,61150L,61151L,61152L,61153L,61154L,61155L,61156L,61157L, -61158L,61159L,61160L,61161L,61162L,61163L,61164L,61165L,61166L,61167L, -61168L,61169L,61170L,61171L,61172L,61173L,61174L,61175L,61176L,61177L, -61178L,61179L,61180L,61181L,61182L,61183L,61184L,61185L,61186L,61187L, -61188L,61189L,61190L,61191L,61192L,61193L,61194L,61195L,61196L,61197L, -61198L,61199L,61200L,61201L,61202L,61203L,61204L,61205L,61206L,61207L, -61208L,61209L,61210L,61211L,61212L,61213L,61214L,61215L,61216L,61217L, -61218L,61219L,61220L,61221L,61222L,61223L,61224L,61225L,61226L,61227L, -61228L,61229L,61230L,61231L,61232L,61233L,61234L,61235L,61236L,61237L, -61238L,61239L,61240L,61241L,61242L,61243L,61244L,61245L,61246L,61247L, -61248L,61249L,61250L,61251L,61252L,61253L,61254L,61255L,61256L,61257L, -61258L,61259L,61260L,61261L,61262L,61263L,61264L,61265L,61266L,61267L, -61268L,61269L,61270L,61271L,61272L,61273L,61274L,61275L,61276L,61277L, -61278L,61279L,61280L,61281L,61282L,61283L,61284L,61285L,61286L,61287L, -61288L,61289L,61290L,61291L,61292L,61293L,61294L,61295L,61296L,61297L, -61298L,61299L,61300L,61301L,61302L,61303L,61304L,61305L,61306L,61307L, -61308L,61309L,61310L,61311L,61312L,61313L,61314L,61315L,61316L,61317L, -61318L,61319L,61320L,61321L,61322L,61323L,61324L,61325L,61326L,61327L, -61328L,61329L,61330L,61331L,61332L,61333L,61334L,61335L,61336L,61337L, -61338L,61339L,61340L,61341L,61342L,61343L,61344L,61345L,61346L,61347L, -61348L,61349L,61350L,61351L,61352L,61353L,61354L,61355L,61356L,61357L, -61358L,61359L,61360L,61361L,61362L,61363L,61364L,61365L,61366L,61367L, -61368L,61369L,61370L,61371L,61372L,61373L,61374L,61375L,61376L,61377L, -61378L,61379L,61380L,61381L,61382L,61383L,61384L,61385L,61386L,61387L, -61388L,61389L,61390L,61391L,61392L,61393L,61394L,61395L,61396L,61397L, -61398L,61399L,61400L,61401L,61402L,61403L,61404L,61405L,61406L,61407L, -61408L,61409L,61410L,61411L,61412L,61413L,61414L,61415L,61416L,61417L, -61418L,61419L,61420L,61421L,61422L,61423L,61424L,61425L,61426L,61427L, -61428L,61429L,61430L,61431L,61432L,61433L,61434L,61435L,61436L,61437L, -61438L,61439L,61440L,61441L,61442L,61443L,61444L,61445L,61446L,61447L, -61448L,61449L,61450L,61451L,61452L,61453L,61454L,61455L,61456L,61457L, -61458L,61459L,61460L,61461L,61462L,61463L,61464L,61465L,61466L,61467L, -61468L,61469L,61470L,61471L,61472L,61473L,61474L,61475L,61476L,61477L, -61478L,61479L,61480L,61481L,61482L,61483L,61484L,61485L,61486L,61487L, -61488L,61489L,61490L,61491L,61492L,61493L,61494L,61495L,61496L,61497L, -61498L,61499L,61500L,61501L,61502L,61503L,61504L,61505L,61506L,61507L, -61508L,61509L,61510L,61511L,61512L,61513L,61514L,61515L,61516L,61517L, -61518L,61519L,61520L,61521L,61522L,61523L,61524L,61525L,61526L,61527L, -61528L,61529L,61530L,61531L,61532L,61533L,61534L,61535L,61536L,61537L, -61538L,61539L,61540L,61541L,61542L,61543L,61544L,61545L,61546L,61547L, -61548L,61549L,61550L,61551L,61552L,61553L,61554L,61555L,61556L,61557L, -61558L,61559L,61560L,61561L,61562L,61563L,61564L,61565L,61566L,61567L, -61568L,61569L,61570L,61571L,61572L,61573L,61574L,61575L,61576L,61577L, -61578L,61579L,61580L,61581L,61582L,61583L,61584L,61585L,61586L,61587L, -61588L,61589L,61590L,61591L,61592L,61593L,61594L,61595L,61596L,61597L, -61598L,61599L,61600L,61601L,61602L,61603L,61604L,61605L,61606L,61607L, -61608L,61609L,61610L,61611L,61612L,61613L,61614L,61615L,61616L,61617L, -61618L,61619L,61620L,61621L,61622L,61623L,61624L,61625L,61626L,61627L, -61628L,61629L,61630L,61631L,61632L,61633L,61634L,61635L,61636L,61637L, -61638L,61639L,61640L,61641L,61642L,61643L,61644L,61645L,61646L,61647L, -61648L,61649L,61650L,61651L,61652L,61653L,61654L,61655L,61656L,61657L, -61658L,61659L,61660L,61661L,61662L,61663L,61664L,61665L,61666L,61667L, -61668L,61669L,61670L,61671L,61672L,61673L,61674L,61675L,61676L,61677L, -61678L,61679L,61680L,61681L,61682L,61683L,61684L,61685L,61686L,61687L, -61688L,61689L,61690L,61691L,61692L,61693L,61694L,61695L,61696L,61697L, -61698L,61699L,61700L,61701L,61702L,61703L,61704L,61705L,61706L,61707L, -61708L,61709L,61710L,61711L,61712L,61713L,61714L,61715L,61716L,61717L, -61718L,61719L,61720L,61721L,61722L,61723L,61724L,61725L,61726L,61727L, -61728L,61729L,61730L,61731L,61732L,61733L,61734L,61735L,61736L,61737L, -61738L,61739L,61740L,61741L,61742L,61743L,61744L,61745L,61746L,61747L, -61748L,61749L,61750L,61751L,61752L,61753L,61754L,61755L,61756L,61757L, -61758L,61759L,61760L,61761L,61762L,61763L,61764L,61765L,61766L,61767L, -61768L,61769L,61770L,61771L,61772L,61773L,61774L,61775L,61776L,61777L, -61778L,61779L,61780L,61781L,61782L,61783L,61784L,61785L,61786L,61787L, -61788L,61789L,61790L,61791L,61792L,61793L,61794L,61795L,61796L,61797L, -61798L,61799L,61800L,61801L,61802L,61803L,61804L,61805L,61806L,61807L, -61808L,61809L,61810L,61811L,61812L,61813L,61814L,61815L,61816L,61817L, -61818L,61819L,61820L,61821L,61822L,61823L,61824L,61825L,61826L,61827L, -61828L,61829L,61830L,61831L,61832L,61833L,61834L,61835L,61836L,61837L, -61838L,61839L,61840L,61841L,61842L,61843L,61844L,61845L,61846L,61847L, -61848L,61849L,61850L,61851L,61852L,61853L,61854L,61855L,61856L,61857L, -61858L,61859L,61860L,61861L,61862L,61863L,61864L,61865L,61866L,61867L, -61868L,61869L,61870L,61871L,61872L,61873L,61874L,61875L,61876L,61877L, -61878L,61879L,61880L,61881L,61882L,61883L,61884L,61885L,61886L,61887L, -61888L,61889L,61890L,61891L,61892L,61893L,61894L,61895L,61896L,61897L, -61898L,61899L,61900L,61901L,61902L,61903L,61904L,61905L,61906L,61907L, -61908L,61909L,61910L,61911L,61912L,61913L,61914L,61915L,61916L,61917L, -61918L,61919L,61920L,61921L,61922L,61923L,61924L,61925L,61926L,61927L, -61928L,61929L,61930L,61931L,61932L,61933L,61934L,61935L,61936L,61937L, -61938L,61939L,61940L,61941L,61942L,61943L,61944L,61945L,61946L,61947L, -61948L,61949L,61950L,61951L,61952L,61953L,61954L,61955L,61956L,61957L, -61958L,61959L,61960L,61961L,61962L,61963L,61964L,61965L,61966L,61967L, -61968L,61969L,61970L,61971L,61972L,61973L,61974L,61975L,61976L,61977L, -61978L,61979L,61980L,61981L,61982L,61983L,61984L,61985L,61986L,61987L, -61988L,61989L,61990L,61991L,61992L,61993L,61994L,61995L,61996L,61997L, -61998L,61999L,62000L,62001L,62002L,62003L,62004L,62005L,62006L,62007L, -62008L,62009L,62010L,62011L,62012L,62013L,62014L,62015L,62016L,62017L, -62018L,62019L,62020L,62021L,62022L,62023L,62024L,62025L,62026L,62027L, -62028L,62029L,62030L,62031L,62032L,62033L,62034L,62035L,62036L,62037L, -62038L,62039L,62040L,62041L,62042L,62043L,62044L,62045L,62046L,62047L, -62048L,62049L,62050L,62051L,62052L,62053L,62054L,62055L,62056L,62057L, -62058L,62059L,62060L,62061L,62062L,62063L,62064L,62065L,62066L,62067L, -62068L,62069L,62070L,62071L,62072L,62073L,62074L,62075L,62076L,62077L, -62078L,62079L,62080L,62081L,62082L,62083L,62084L,62085L,62086L,62087L, -62088L,62089L,62090L,62091L,62092L,62093L,62094L,62095L,62096L,62097L, -62098L,62099L,62100L,62101L,62102L,62103L,62104L,62105L,62106L,62107L, -62108L,62109L,62110L,62111L,62112L,62113L,62114L,62115L,62116L,62117L, -62118L,62119L,62120L,62121L,62122L,62123L,62124L,62125L,62126L,62127L, -62128L,62129L,62130L,62131L,62132L,62133L,62134L,62135L,62136L,62137L, -62138L,62139L,62140L,62141L,62142L,62143L,62144L,62145L,62146L,62147L, -62148L,62149L,62150L,62151L,62152L,62153L,62154L,62155L,62156L,62157L, -62158L,62159L,62160L,62161L,62162L,62163L,62164L,62165L,62166L,62167L, -62168L,62169L,62170L,62171L,62172L,62173L,62174L,62175L,62176L,62177L, -62178L,62179L,62180L,62181L,62182L,62183L,62184L,62185L,62186L,62187L, -62188L,62189L,62190L,62191L,62192L,62193L,62194L,62195L,62196L,62197L, -62198L,62199L,62200L,62201L,62202L,62203L,62204L,62205L,62206L,62207L, -62208L,62209L,62210L,62211L,62212L,62213L,62214L,62215L,62216L,62217L, -62218L,62219L,62220L,62221L,62222L,62223L,62224L,62225L,62226L,62227L, -62228L,62229L,62230L,62231L,62232L,62233L,62234L,62235L,62236L,62237L, -62238L,62239L,62240L,62241L,62242L,62243L,62244L,62245L,62246L,62247L, -62248L,62249L,62250L,62251L,62252L,62253L,62254L,62255L,62256L,62257L, -62258L,62259L,62260L,62261L,62262L,62263L,62264L,62265L,62266L,62267L, -62268L,62269L,62270L,62271L,62272L,62273L,62274L,62275L,62276L,62277L, -62278L,62279L,62280L,62281L,62282L,62283L,62284L,62285L,62286L,62287L, -62288L,62289L,62290L,62291L,62292L,62293L,62294L,62295L,62296L,62297L, -62298L,62299L,62300L,62301L,62302L,62303L,62304L,62305L,62306L,62307L, -62308L,62309L,62310L,62311L,62312L,62313L,62314L,62315L,62316L,62317L, -62318L,62319L,62320L,62321L,62322L,62323L,62324L,62325L,62326L,62327L, -62328L,62329L,62330L,62331L,62332L,62333L,62334L,62335L,62336L,62337L, -62338L,62339L,62340L,62341L,62342L,62343L,62344L,62345L,62346L,62347L, -62348L,62349L,62350L,62351L,62352L,62353L,62354L,62355L,62356L,62357L, -62358L,62359L,62360L,62361L,62362L,62363L,62364L,62365L,62366L,62367L, -62368L,62369L,62370L,62371L,62372L,62373L,62374L,62375L,62376L,62377L, -62378L,62379L,62380L,62381L,62382L,62383L,62384L,62385L,62386L,62387L, -62388L,62389L,62390L,62391L,62392L,62393L,62394L,62395L,62396L,62397L, -62398L,62399L,62400L,62401L,62402L,62403L,62404L,62405L,62406L,62407L, -62408L,62409L,62410L,62411L,62412L,62413L,62414L,62415L,62416L,62417L, -62418L,62419L,62420L,62421L,62422L,62423L,62424L,62425L,62426L,62427L, -62428L,62429L,62430L,62431L,62432L,62433L,62434L,62435L,62436L,62437L, -62438L,62439L,62440L,62441L,62442L,62443L,62444L,62445L,62446L,62447L, -62448L,62449L,62450L,62451L,62452L,62453L,62454L,62455L,62456L,62457L, -62458L,62459L,62460L,62461L,62462L,62463L,62464L,62465L,62466L,62467L, -62468L,62469L,62470L,62471L,62472L,62473L,62474L,62475L,62476L,62477L, -62478L,62479L,62480L,62481L,62482L,62483L,62484L,62485L,62486L,62487L, -62488L,62489L,62490L,62491L,62492L,62493L,62494L,62495L,62496L,62497L, -62498L,62499L,62500L,62501L,62502L,62503L,62504L,62505L,62506L,62507L, -62508L,62509L,62510L,62511L,62512L,62513L,62514L,62515L,62516L,62517L, -62518L,62519L,62520L,62521L,62522L,62523L,62524L,62525L,62526L,62527L, -62528L,62529L,62530L,62531L,62532L,62533L,62534L,62535L,62536L,62537L, -62538L,62539L,62540L,62541L,62542L,62543L,62544L,62545L,62546L,62547L, -62548L,62549L,62550L,62551L,62552L,62553L,62554L,62555L,62556L,62557L, -62558L,62559L,62560L,62561L,62562L,62563L,62564L,62565L,62566L,62567L, -62568L,62569L,62570L,62571L,62572L,62573L,62574L,62575L,62576L,62577L, -62578L,62579L,62580L,62581L,62582L,62583L,62584L,62585L,62586L,62587L, -62588L,62589L,62590L,62591L,62592L,62593L,62594L,62595L,62596L,62597L, -62598L,62599L,62600L,62601L,62602L,62603L,62604L,62605L,62606L,62607L, -62608L,62609L,62610L,62611L,62612L,62613L,62614L,62615L,62616L,62617L, -62618L,62619L,62620L,62621L,62622L,62623L,62624L,62625L,62626L,62627L, -62628L,62629L,62630L,62631L,62632L,62633L,62634L,62635L,62636L,62637L, -62638L,62639L,62640L,62641L,62642L,62643L,62644L,62645L,62646L,62647L, -62648L,62649L,62650L,62651L,62652L,62653L,62654L,62655L,62656L,62657L, -62658L,62659L,62660L,62661L,62662L,62663L,62664L,62665L,62666L,62667L, -62668L,62669L,62670L,62671L,62672L,62673L,62674L,62675L,62676L,62677L, -62678L,62679L,62680L,62681L,62682L,62683L,62684L,62685L,62686L,62687L, -62688L,62689L,62690L,62691L,62692L,62693L,62694L,62695L,62696L,62697L, -62698L,62699L,62700L,62701L,62702L,62703L,62704L,62705L,62706L,62707L, -62708L,62709L,62710L,62711L,62712L,62713L,62714L,62715L,62716L,62717L, -62718L,62719L,62720L,62721L,62722L,62723L,62724L,62725L,62726L,62727L, -62728L,62729L,62730L,62731L,62732L,62733L,62734L,62735L,62736L,62737L, -62738L,62739L,62740L,62741L,62742L,62743L,62744L,62745L,62746L,62747L, -62748L,62749L,62750L,62751L,62752L,62753L,62754L,62755L,62756L,62757L, -62758L,62759L,62760L,62761L,62762L,62763L,62764L,62765L,62766L,62767L, -62768L,62769L,62770L,62771L,62772L,62773L,62774L,62775L,62776L,62777L, -62778L,62779L,62780L,62781L,62782L,62783L,62784L,62785L,62786L,62787L, -62788L,62789L,62790L,62791L,62792L,62793L,62794L,62795L,62796L,62797L, -62798L,62799L,62800L,62801L,62802L,62803L,62804L,62805L,62806L,62807L, -62808L,62809L,62810L,62811L,62812L,62813L,62814L,62815L,62816L,62817L, -62818L,62819L,62820L,62821L,62822L,62823L,62824L,62825L,62826L,62827L, -62828L,62829L,62830L,62831L,62832L,62833L,62834L,62835L,62836L,62837L, -62838L,62839L,62840L,62841L,62842L,62843L,62844L,62845L,62846L,62847L, -62848L,62849L,62850L,62851L,62852L,62853L,62854L,62855L,62856L,62857L, -62858L,62859L,62860L,62861L,62862L,62863L,62864L,62865L,62866L,62867L, -62868L,62869L,62870L,62871L,62872L,62873L,62874L,62875L,62876L,62877L, -62878L,62879L,62880L,62881L,62882L,62883L,62884L,62885L,62886L,62887L, -62888L,62889L,62890L,62891L,62892L,62893L,62894L,62895L,62896L,62897L, -62898L,62899L,62900L,62901L,62902L,62903L,62904L,62905L,62906L,62907L, -62908L,62909L,62910L,62911L,62912L,62913L,62914L,62915L,62916L,62917L, -62918L,62919L,62920L,62921L,62922L,62923L,62924L,62925L,62926L,62927L, -62928L,62929L,62930L,62931L,62932L,62933L,62934L,62935L,62936L,62937L, -62938L,62939L,62940L,62941L,62942L,62943L,62944L,62945L,62946L,62947L, -62948L,62949L,62950L,62951L,62952L,62953L,62954L,62955L,62956L,62957L, -62958L,62959L,62960L,62961L,62962L,62963L,62964L,62965L,62966L,62967L, -62968L,62969L,62970L,62971L,62972L,62973L,62974L,62975L,62976L,62977L, -62978L,62979L,62980L,62981L,62982L,62983L,62984L,62985L,62986L,62987L, -62988L,62989L,62990L,62991L,62992L,62993L,62994L,62995L,62996L,62997L, -62998L,62999L,63000L,63001L,63002L,63003L,63004L,63005L,63006L,63007L, -63008L,63009L,63010L,63011L,63012L,63013L,63014L,63015L,63016L,63017L, -63018L,63019L,63020L,63021L,63022L,63023L,63024L,63025L,63026L,63027L, -63028L,63029L,63030L,63031L,63032L,63033L,63034L,63035L,63036L,63037L, -63038L,63039L,63040L,63041L,63042L,63043L,63044L,63045L,63046L,63047L, -63048L,63049L,63050L,63051L,63052L,63053L,63054L,63055L,63056L,63057L, -63058L,63059L,63060L,63061L,63062L,63063L,63064L,63065L,63066L,63067L, -63068L,63069L,63070L,63071L,63072L,63073L,63074L,63075L,63076L,63077L, -63078L,63079L,63080L,63081L,63082L,63083L,63084L,63085L,63086L,63087L, -63088L,63089L,63090L,63091L,63092L,63093L,63094L,63095L,63096L,63097L, -63098L,63099L,63100L,63101L,63102L,63103L,63104L,63105L,63106L,63107L, -63108L,63109L,63110L,63111L,63112L,63113L,63114L,63115L,63116L,63117L, -63118L,63119L,63120L,63121L,63122L,63123L,63124L,63125L,63126L,63127L, -63128L,63129L,63130L,63131L,63132L,63133L,63134L,63135L,63136L,63137L, -63138L,63139L,63140L,63141L,63142L,63143L,63144L,63145L,63146L,63147L, -63148L,63149L,63150L,63151L,63152L,63153L,63154L,63155L,63156L,63157L, -63158L,63159L,63160L,63161L,63162L,63163L,63164L,63165L,63166L,63167L, -63168L,63169L,63170L,63171L,63172L,63173L,63174L,63175L,63176L,63177L, -63178L,63179L,63180L,63181L,63182L,63183L,63184L,63185L,63186L,63187L, -63188L,63189L,63190L,63191L,63192L,63193L,63194L,63195L,63196L,63197L, -63198L,63199L,63200L,63201L,63202L,63203L,63204L,63205L,63206L,63207L, -63208L,63209L,63210L,63211L,63212L,63213L,63214L,63215L,63216L,63217L, -63218L,63219L,63220L,63221L,63222L,63223L,63224L,63225L,63226L,63227L, -63228L,63229L,63230L,63231L,63232L,63233L,63234L,63235L,63236L,63237L, -63238L,63239L,63240L,63241L,63242L,63243L,63244L,63245L,63246L,63247L, -63248L,63249L,63250L,63251L,63252L,63253L,63254L,63255L,63256L,63257L, -63258L,63259L,63260L,63261L,63262L,63263L,63264L,63265L,63266L,63267L, -63268L,63269L,63270L,63271L,63272L,63273L,63274L,63275L,63276L,63277L, -63278L,63279L,63280L,63281L,63282L,63283L,63284L,63285L,63286L,63287L, -63288L,63289L,63290L,63291L,63292L,63293L,63294L,63295L,63296L,63297L, -63298L,63299L,63300L,63301L,63302L,63303L,63304L,63305L,63306L,63307L, -63308L,63309L,63310L,63311L,63312L,63313L,63314L,63315L,63316L,63317L, -63318L,63319L,63320L,63321L,63322L,63323L,63324L,63325L,63326L,63327L, -63328L,63329L,63330L,63331L,63332L,63333L,63334L,63335L,63336L,63337L, -63338L,63339L,63340L,63341L,63342L,63343L,63344L,63345L,63346L,63347L, -63348L,63349L,63350L,63351L,63352L,63353L,63354L,63355L,63356L,63357L, -63358L,63359L,63360L,63361L,63362L,63363L,63364L,63365L,63366L,63367L, -63368L,63369L,63370L,63371L,63372L,63373L,63374L,63375L,63376L,63377L, -63378L,63379L,63380L,63381L,63382L,63383L,63384L,63385L,63386L,63387L, -63388L,63389L,63390L,63391L,63392L,63393L,63394L,63395L,63396L,63397L, -63398L,63399L,63400L,63401L,63402L,63403L,63404L,63405L,63406L,63407L, -63408L,63409L,63410L,63411L,63412L,63413L,63414L,63415L,63416L,63417L, -63418L,63419L,63420L,63421L,63422L,63423L,63424L,63425L,63426L,63427L, -63428L,63429L,63430L,63431L,63432L,63433L,63434L,63435L,63436L,63437L, -63438L,63439L,63440L,63441L,63442L,63443L,63444L,63445L,63446L,63447L, -63448L,63449L,63450L,63451L,63452L,63453L,63454L,63455L,63456L,63457L, -63458L,63459L,63460L,63461L,63462L,63463L,63464L,63465L,63466L,63467L, -63468L,63469L,63470L,63471L,63472L,63473L,63474L,63475L,63476L,63477L, -63478L,63479L,63480L,63481L,63482L,63483L,63484L,63485L,63486L,63487L, -63488L,63489L,63490L,63491L,63492L,63493L,63494L,63495L,63496L,63497L, -63498L,63499L,63500L,63501L,63502L,63503L,63504L,63505L,63506L,63507L, -63508L,63509L,63510L,63511L,63512L,63513L,63514L,63515L,63516L,63517L, -63518L,63519L,63520L,63521L,63522L,63523L,63524L,63525L,63526L,63527L, -63528L,63529L,63530L,63531L,63532L,63533L,63534L,63535L,63536L,63537L, -63538L,63539L,63540L,63541L,63542L,63543L,63544L,63545L,63546L,63547L, -63548L,63549L,63550L,63551L,63552L,63553L,63554L,63555L,63556L,63557L, -63558L,63559L,63560L,63561L,63562L,63563L,63564L,63565L,63566L,63567L, -63568L,63569L,63570L,63571L,63572L,63573L,63574L,63575L,63576L,63577L, -63578L,63579L,63580L,63581L,63582L,63583L,63584L,63585L,63586L,63587L, -63588L,63589L,63590L,63591L,63592L,63593L,63594L,63595L,63596L,63597L, -63598L,63599L,63600L,63601L,63602L,63603L,63604L,63605L,63606L,63607L, -63608L,63609L,63610L,63611L,63612L,63613L,63614L,63615L,63616L,63617L, -63618L,63619L,63620L,63621L,63622L,63623L,63624L,63625L,63626L,63627L, -63628L,63629L,63630L,63631L,63632L,63633L,63634L,63635L,63636L,63637L, -63638L,63639L,63640L,63641L,63642L,63643L,63644L,63645L,63646L,63647L, -63648L,63649L,63650L,63651L,63652L,63653L,63654L,63655L,63656L,63657L, -63658L,63659L,63660L,63661L,63662L,63663L,63664L,63665L,63666L,63667L, -63668L,63669L,63670L,63671L,63672L,63673L,63674L,63675L,63676L,63677L, -63678L,63679L,63680L,63681L,63682L,63683L,63684L,63685L,63686L,63687L, -63688L,63689L,63690L,63691L,63692L,63693L,63694L,63695L,63696L,63697L, -63698L,63699L,63700L,63701L,63702L,63703L,63704L,63705L,63706L,63707L, -63708L,63709L,63710L,63711L,63712L,63713L,63714L,63715L,63716L,63717L, -63718L,63719L,63720L,63721L,63722L,63723L,63724L,63725L,63726L,63727L, -63728L,63729L,63730L,63731L,63732L,63733L,63734L,63735L,63736L,63737L, -63738L,63739L,63740L,63741L,63742L,63743L,63744L,63745L,63746L,63747L, -63748L,63749L,63750L,63751L,63752L,63753L,63754L,63755L,63756L,63757L, -63758L,63759L,63760L,63761L,63762L,63763L,63764L,63765L,63766L,63767L, -63768L,63769L,63770L,63771L,63772L,63773L,63774L,63775L,63776L,63777L, -63778L,63779L,63780L,63781L,63782L,63783L,63784L,63785L,63786L,63787L, -63788L,63789L,63790L,63791L,63792L,63793L,63794L,63795L,63796L,63797L, -63798L,63799L,63800L,63801L,63802L,63803L,63804L,63805L,63806L,63807L, -63808L,63809L,63810L,63811L,63812L,63813L,63814L,63815L,63816L,63817L, -63818L,63819L,63820L,63821L,63822L,63823L,63824L,63825L,63826L,63827L, -63828L,63829L,63830L,63831L,63832L,63833L,63834L,63835L,63836L,63837L, -63838L,63839L,63840L,63841L,63842L,63843L,63844L,63845L,63846L,63847L, -63848L,63849L,63850L,63851L,63852L,63853L,63854L,63855L,63856L,63857L, -63858L,63859L,63860L,63861L,63862L,63863L,63864L,63865L,63866L,63867L, -63868L,63869L,63870L,63871L,63872L,63873L,63874L,63875L,63876L,63877L, -63878L,63879L,63880L,63881L,63882L,63883L,63884L,63885L,63886L,63887L, -63888L,63889L,63890L,63891L,63892L,63893L,63894L,63895L,63896L,63897L, -63898L,63899L,63900L,63901L,63902L,63903L,63904L,63905L,63906L,63907L, -63908L,63909L,63910L,63911L,63912L,63913L,63914L,63915L,63916L,63917L, -63918L,63919L,63920L,63921L,63922L,63923L,63924L,63925L,63926L,63927L, -63928L,63929L,63930L,63931L,63932L,63933L,63934L,63935L,63936L,63937L, -63938L,63939L,63940L,63941L,63942L,63943L,63944L,63945L,63946L,63947L, -63948L,63949L,63950L,63951L,63952L,63953L,63954L,63955L,63956L,63957L, -63958L,63959L,63960L,63961L,63962L,63963L,63964L,63965L,63966L,63967L, -63968L,63969L,63970L,63971L,63972L,63973L,63974L,63975L,63976L,63977L, -63978L,63979L,63980L,63981L,63982L,63983L,63984L,63985L,63986L,63987L, -63988L,63989L,63990L,63991L,63992L,63993L,63994L,63995L,63996L,63997L, -63998L,63999L,64000L,64001L,64002L,64003L,64004L,64005L,64006L,64007L, -64008L,64009L,64010L,64011L,64012L,64013L,64014L,64015L,64016L,64017L, -64018L,64019L,64020L,64021L,64022L,64023L,64024L,64025L,64026L,64027L, -64028L,64029L,64030L,64031L,64032L,64033L,64034L,64035L,64036L,64037L, -64038L,64039L,64040L,64041L,64042L,64043L,64044L,64045L,64046L,64047L, -64048L,64049L,64050L,64051L,64052L,64053L,64054L,64055L,64056L,64057L, -64058L,64059L,64060L,64061L,64062L,64063L,64064L,64065L,64066L,64067L, -64068L,64069L,64070L,64071L,64072L,64073L,64074L,64075L,64076L,64077L, -64078L,64079L,64080L,64081L,64082L,64083L,64084L,64085L,64086L,64087L, -64088L,64089L,64090L,64091L,64092L,64093L,64094L,64095L,64096L,64097L, -64098L,64099L,64100L,64101L,64102L,64103L,64104L,64105L,64106L,64107L, -64108L,64109L,64110L,64111L,64112L,64113L,64114L,64115L,64116L,64117L, -64118L,64119L,64120L,64121L,64122L,64123L,64124L,64125L,64126L,64127L, -64128L,64129L,64130L,64131L,64132L,64133L,64134L,64135L,64136L,64137L, -64138L,64139L,64140L,64141L,64142L,64143L,64144L,64145L,64146L,64147L, -64148L,64149L,64150L,64151L,64152L,64153L,64154L,64155L,64156L,64157L, -64158L,64159L,64160L,64161L,64162L,64163L,64164L,64165L,64166L,64167L, -64168L,64169L,64170L,64171L,64172L,64173L,64174L,64175L,64176L,64177L, -64178L,64179L,64180L,64181L,64182L,64183L,64184L,64185L,64186L,64187L, -64188L,64189L,64190L,64191L,64192L,64193L,64194L,64195L,64196L,64197L, -64198L,64199L,64200L,64201L,64202L,64203L,64204L,64205L,64206L,64207L, -64208L,64209L,64210L,64211L,64212L,64213L,64214L,64215L,64216L,64217L, -64218L,64219L,64220L,64221L,64222L,64223L,64224L,64225L,64226L,64227L, -64228L,64229L,64230L,64231L,64232L,64233L,64234L,64235L,64236L,64237L, -64238L,64239L,64240L,64241L,64242L,64243L,64244L,64245L,64246L,64247L, -64248L,64249L,64250L,64251L,64252L,64253L,64254L,64255L,64256L,64257L, -64258L,64259L,64260L,64261L,64262L,64263L,64264L,64265L,64266L,64267L, -64268L,64269L,64270L,64271L,64272L,64273L,64274L,64275L,64276L,64277L, -64278L,64279L,64280L,64281L,64282L,64283L,64284L,64285L,64286L,64287L, -64288L,64289L,64290L,64291L,64292L,64293L,64294L,64295L,64296L,64297L, -64298L,64299L,64300L,64301L,64302L,64303L,64304L,64305L,64306L,64307L, -64308L,64309L,64310L,64311L,64312L,64313L,64314L,64315L,64316L,64317L, -64318L,64319L,64320L,64321L,64322L,64323L,64324L,64325L,64326L,64327L, -64328L,64329L,64330L,64331L,64332L,64333L,64334L,64335L,64336L,64337L, -64338L,64339L,64340L,64341L,64342L,64343L,64344L,64345L,64346L,64347L, -64348L,64349L,64350L,64351L,64352L,64353L,64354L,64355L,64356L,64357L, -64358L,64359L,64360L,64361L,64362L,64363L,64364L,64365L,64366L,64367L, -64368L,64369L,64370L,64371L,64372L,64373L,64374L,64375L,64376L,64377L, -64378L,64379L,64380L,64381L,64382L,64383L,64384L,64385L,64386L,64387L, -64388L,64389L,64390L,64391L,64392L,64393L,64394L,64395L,64396L,64397L, -64398L,64399L,64400L,64401L,64402L,64403L,64404L,64405L,64406L,64407L, -64408L,64409L,64410L,64411L,64412L,64413L,64414L,64415L,64416L,64417L, -64418L,64419L,64420L,64421L,64422L,64423L,64424L,64425L,64426L,64427L, -64428L,64429L,64430L,64431L,64432L,64433L,64434L,64435L,64436L,64437L, -64438L,64439L,64440L,64441L,64442L,64443L,64444L,64445L,64446L,64447L, -64448L,64449L,64450L,64451L,64452L,64453L,64454L,64455L,64456L,64457L, -64458L,64459L,64460L,64461L,64462L,64463L,64464L,64465L,64466L,64467L, -64468L,64469L,64470L,64471L,64472L,64473L,64474L,64475L,64476L,64477L, -64478L,64479L,64480L,64481L,64482L,64483L,64484L,64485L,64486L,64487L, -64488L,64489L,64490L,64491L,64492L,64493L,64494L,64495L,64496L,64497L, -64498L,64499L,64500L,64501L,64502L,64503L,64504L,64505L,64506L,64507L, -64508L,64509L,64510L,64511L,64512L,64513L,64514L,64515L,64516L,64517L, -64518L,64519L,64520L,64521L,64522L,64523L,64524L,64525L,64526L,64527L, -64528L,64529L,64530L,64531L,64532L,64533L,64534L,64535L,64536L,64537L, -64538L,64539L,64540L,64541L,64542L,64543L,64544L,64545L,64546L,64547L, -64548L,64549L,64550L,64551L,64552L,64553L,64554L,64555L,64556L,64557L, -64558L,64559L,64560L,64561L,64562L,64563L,64564L,64565L,64566L,64567L, -64568L,64569L,64570L,64571L,64572L,64573L,64574L,64575L,64576L,64577L, -64578L,64579L,64580L,64581L,64582L,64583L,64584L,64585L,64586L,64587L, -64588L,64589L,64590L,64591L,64592L,64593L,64594L,64595L,64596L,64597L, -64598L,64599L,64600L,64601L,64602L,64603L,64604L,64605L,64606L,64607L, -64608L,64609L,64610L,64611L,64612L,64613L,64614L,64615L,64616L,64617L, -64618L,64619L,64620L,64621L,64622L,64623L,64624L,64625L,64626L,64627L, -64628L,64629L,64630L,64631L,64632L,64633L,64634L,64635L,64636L,64637L, -64638L,64639L,64640L,64641L,64642L,64643L,64644L,64645L,64646L,64647L, -64648L,64649L,64650L,64651L,64652L,64653L,64654L,64655L,64656L,64657L, -64658L,64659L,64660L,64661L,64662L,64663L,64664L,64665L,64666L,64667L, -64668L,64669L,64670L,64671L,64672L,64673L,64674L,64675L,64676L,64677L, -64678L,64679L,64680L,64681L,64682L,64683L,64684L,64685L,64686L,64687L, -64688L,64689L,64690L,64691L,64692L,64693L,64694L,64695L,64696L,64697L, -64698L,64699L,64700L,64701L,64702L,64703L,64704L,64705L,64706L,64707L, -64708L,64709L,64710L,64711L,64712L,64713L,64714L,64715L,64716L,64717L, -64718L,64719L,64720L,64721L,64722L,64723L,64724L,64725L,64726L,64727L, -64728L,64729L,64730L,64731L,64732L,64733L,64734L,64735L,64736L,64737L, -64738L,64739L,64740L,64741L,64742L,64743L,64744L,64745L,64746L,64747L, -64748L,64749L,64750L,64751L,64752L,64753L,64754L,64755L,64756L,64757L, -64758L,64759L,64760L,64761L,64762L,64763L,64764L,64765L,64766L,64767L, -64768L,64769L,64770L,64771L,64772L,64773L,64774L,64775L,64776L,64777L, -64778L,64779L,64780L,64781L,64782L,64783L,64784L,64785L,64786L,64787L, -64788L,64789L,64790L,64791L,64792L,64793L,64794L,64795L,64796L,64797L, -64798L,64799L,64800L,64801L,64802L,64803L,64804L,64805L,64806L,64807L, -64808L,64809L,64810L,64811L,64812L,64813L,64814L,64815L,64816L,64817L, -64818L,64819L,64820L,64821L,64822L,64823L,64824L,64825L,64826L,64827L, -64828L,64829L,64830L,64831L,64832L,64833L,64834L,64835L,64836L,64837L, -64838L,64839L,64840L,64841L,64842L,64843L,64844L,64845L,64846L,64847L, -64848L,64849L,64850L,64851L,64852L,64853L,64854L,64855L,64856L,64857L, -64858L,64859L,64860L,64861L,64862L,64863L,64864L,64865L,64866L,64867L, -64868L,64869L,64870L,64871L,64872L,64873L,64874L,64875L,64876L,64877L, -64878L,64879L,64880L,64881L,64882L,64883L,64884L,64885L,64886L,64887L, -64888L,64889L,64890L,64891L,64892L,64893L,64894L,64895L,64896L,64897L, -64898L,64899L,64900L,64901L,64902L,64903L,64904L,64905L,64906L,64907L, -64908L,64909L,64910L,64911L,64912L,64913L,64914L,64915L,64916L,64917L, -64918L,64919L,64920L,64921L,64922L,64923L,64924L,64925L,64926L,64927L, -64928L,64929L,64930L,64931L,64932L,64933L,64934L,64935L,64936L,64937L, -64938L,64939L,64940L,64941L,64942L,64943L,64944L,64945L,64946L,64947L, -64948L,64949L,64950L,64951L,64952L,64953L,64954L,64955L,64956L,64957L, -64958L,64959L,64960L,64961L,64962L,64963L,64964L,64965L,64966L,64967L, -64968L,64969L,64970L,64971L,64972L,64973L,64974L,64975L,64976L,64977L, -64978L,64979L,64980L,64981L,64982L,64983L,64984L,64985L,64986L,64987L, -64988L,64989L,64990L,64991L,64992L,64993L,64994L,64995L,64996L,64997L, -64998L,64999L,65000L,65001L,65002L,65003L,65004L,65005L,65006L,65007L, -65008L,65009L,65010L,65011L,65012L,65013L,65014L,65015L,65016L,65017L, -65018L,65019L,65020L,65021L,65022L,65023L,65024L,65025L,65026L,65027L, -65028L,65029L,65030L,65031L,65032L,65033L,65034L,65035L,65036L,65037L, -65038L,65039L,65040L,65041L,65042L,65043L,65044L,65045L,65046L,65047L, -65048L,65049L,65050L,65051L,65052L,65053L,65054L,65055L,65056L,65057L, -65058L,65059L,65060L,65061L,65062L,65063L,65064L,65065L,65066L,65067L, -65068L,65069L,65070L,65071L,65072L,65073L,65074L,65075L,65076L,65077L, -65078L,65079L,65080L,65081L,65082L,65083L,65084L,65085L,65086L,65087L, -65088L,65089L,65090L,65091L,65092L,65093L,65094L,65095L,65096L,65097L, -65098L,65099L,65100L,65101L,65102L,65103L,65104L,65105L,65106L,65107L, -65108L,65109L,65110L,65111L,65112L,65113L,65114L,65115L,65116L,65117L, -65118L,65119L,65120L,65121L,65122L,65123L,65124L,65125L,65126L,65127L, -65128L,65129L,65130L,65131L,65132L,65133L,65134L,65135L,65136L,65137L, -65138L,65139L,65140L,65141L,65142L,65143L,65144L,65145L,65146L,65147L, -65148L,65149L,65150L,65151L,65152L,65153L,65154L,65155L,65156L,65157L, -65158L,65159L,65160L,65161L,65162L,65163L,65164L,65165L,65166L,65167L, -65168L,65169L,65170L,65171L,65172L,65173L,65174L,65175L,65176L,65177L, -65178L,65179L,65180L,65181L,65182L,65183L,65184L,65185L,65186L,65187L, -65188L,65189L,65190L,65191L,65192L,65193L,65194L,65195L,65196L,65197L, -65198L,65199L,65200L,65201L,65202L,65203L,65204L,65205L,65206L,65207L, -65208L,65209L,65210L,65211L,65212L,65213L,65214L,65215L,65216L,65217L, -65218L,65219L,65220L,65221L,65222L,65223L,65224L,65225L,65226L,65227L, -65228L,65229L,65230L,65231L,65232L,65233L,65234L,65235L,65236L,65237L, -65238L,65239L,65240L,65241L,65242L,65243L,65244L,65245L,65246L,65247L, -65248L,65249L,65250L,65251L,65252L,65253L,65254L,65255L,65256L,65257L, -65258L,65259L,65260L,65261L,65262L,65263L,65264L,65265L,65266L,65267L, -65268L,65269L,65270L,65271L,65272L,65273L,65274L,65275L,65276L,65277L, -65278L,65279L,65280L,65281L,65282L,65283L,65284L,65285L,65286L,65287L, -65288L,65289L,65290L,65291L,65292L,65293L,65294L,65295L,65296L,65297L, -65298L,65299L,65300L,65301L,65302L,65303L,65304L,65305L,65306L,65307L, -65308L,65309L,65310L,65311L,65312L,65313L,65314L,65315L,65316L,65317L, -65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,65326L,65327L, -65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,65336L,65337L, -65338L,65339L,65340L,65341L,65342L,65343L,65344L,65313L,65314L,65315L, -65316L,65317L,65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L, -65326L,65327L,65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L, -65336L,65337L,65338L,65371L,65372L,65373L,65374L,65375L,65376L,65377L, -65378L,65379L,65380L,65381L,65382L,65383L,65384L,65385L,65386L,65387L, -65388L,65389L,65390L,65391L,65392L,65393L,65394L,65395L,65396L,65397L, -65398L,65399L,65400L,65401L,65402L,65403L,65404L,65405L,65406L,65407L, -65408L,65409L,65410L,65411L,65412L,65413L,65414L,65415L,65416L,65417L, -65418L,65419L,65420L,65421L,65422L,65423L,65424L,65425L,65426L,65427L, -65428L,65429L,65430L,65431L,65432L,65433L,65434L,65435L,65436L,65437L, -65438L,65439L,65440L,65441L,65442L,65443L,65444L,65445L,65446L,65447L, -65448L,65449L,65450L,65451L,65452L,65453L,65454L,65455L,65456L,65457L, -65458L,65459L,65460L,65461L,65462L,65463L,65464L,65465L,65466L,65467L, -65468L,65469L,65470L,65471L,65472L,65473L,65474L,65475L,65476L,65477L, -65478L,65479L,65480L,65481L,65482L,65483L,65484L,65485L,65486L,65487L, -65488L,65489L,65490L,65491L,65492L,65493L,65494L,65495L,65496L,65497L, -65498L,65499L,65500L,65501L,65502L,65503L,65504L,65505L,65506L,65507L, -65508L,65509L,65510L,65511L,65512L,65513L,65514L,65515L,65516L,65517L, -65518L,65519L,65520L,65521L,65522L,65523L,65524L,65525L,65526L,65527L, -65528L,65529L,65530L,65531L,65532L,65533L,65534L,65535L, -}; -#endif - -#if defined(DUK_USE_REGEXP_CANON_BITMAP) -/* - * Automatically generated by extract_caseconv.py, do not edit! - */ - -const duk_uint8_t duk_unicode_re_canon_bitmap[256] = { -23,0,224,19,1,228,255,255,255,255,255,255,255,255,255,255,255,255,255,127, -255,255,255,255,255,255,255,255,231,247,0,16,255,227,255,255,63,255,255, -255,255,255,255,255,1,252,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -227,193,255,255,255,147,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251, -}; -#endif -#line 1 "duk_util_bitdecoder.c" -/* - * Bitstream decoder. - */ - -/* #include duk_internal.h -> already included */ - -/* Decode 'bits' bits from the input stream (bits must be 1...24). - * When reading past bitstream end, zeroes are shifted in. The result - * is signed to match duk_bd_decode_flagged. - */ -DUK_INTERNAL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) { - duk_small_int_t shift; - duk_uint32_t mask; - duk_uint32_t tmp; - - /* Note: cannot read more than 24 bits without possibly shifting top bits out. - * Fixable, but adds complexity. - */ - DUK_ASSERT(bits >= 1 && bits <= 24); - - while (ctx->currbits < bits) { -#if 0 - DUK_DDD(DUK_DDDPRINT("decode_bits: shift more data (bits=%ld, currbits=%ld)", - (long) bits, (long) ctx->currbits)); -#endif - ctx->currval <<= 8; - if (ctx->offset < ctx->length) { - /* If ctx->offset >= ctx->length, we "shift zeroes in" - * instead of croaking. - */ - ctx->currval |= ctx->data[ctx->offset++]; - } - ctx->currbits += 8; - } -#if 0 - DUK_DDD(DUK_DDDPRINT("decode_bits: bits=%ld, currbits=%ld, currval=0x%08lx", - (long) bits, (long) ctx->currbits, (unsigned long) ctx->currval)); -#endif - - /* Extract 'top' bits of currval; note that the extracted bits do not need - * to be cleared, we just ignore them on next round. - */ - shift = ctx->currbits - bits; - mask = (((duk_uint32_t) 1U) << bits) - 1U; - tmp = (ctx->currval >> shift) & mask; - ctx->currbits = shift; /* remaining */ - -#if 0 - DUK_DDD(DUK_DDDPRINT("decode_bits: %ld bits -> 0x%08lx (%ld), currbits=%ld, currval=0x%08lx", - (long) bits, (unsigned long) tmp, (long) tmp, (long) ctx->currbits, (unsigned long) ctx->currval)); -#endif - - return tmp; -} - -DUK_INTERNAL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) { - return (duk_small_uint_t) duk_bd_decode(ctx, 1); -} - -/* Decode a one-bit flag, and if set, decode a value of 'bits', otherwise return - * default value. - */ -DUK_INTERNAL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value) { - if (duk_bd_decode_flag(ctx)) { - return duk_bd_decode(ctx, bits); - } else { - return def_value; - } -} - -/* Signed variant, allows negative marker value. */ -DUK_INTERNAL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value) { - return (duk_int32_t) duk_bd_decode_flagged(ctx, bits, (duk_uint32_t) def_value); -} - -/* Shared varint encoding. Match dukutil.py BitEncode.varuint(). */ -DUK_INTERNAL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx) { - duk_small_uint_t t; - - /* The bit encoding choices here are based on manual testing against - * the actual varuints generated by genbuiltins.py. - */ - switch (duk_bd_decode(ctx, 2)) { - case 0: - return 0; /* [0,0] */ - case 1: - return duk_bd_decode(ctx, 2) + 1; /* [1,4] */ - case 2: - return duk_bd_decode(ctx, 5) + 5; /* [5,36] */ - default: - t = duk_bd_decode(ctx, 7); - if (t == 0) { - return duk_bd_decode(ctx, 20); - } - return (t - 1) + 37; /* [37,163] */ - } -} - -/* Decode a bit packed string from a custom format used by genbuiltins.py. - * This function is here because it's used for both heap and thread inits. - * Caller must supply the output buffer whose size is NOT checked! - */ - -#define DUK__BITPACK_LETTER_LIMIT 26 -#define DUK__BITPACK_LOOKUP1 26 -#define DUK__BITPACK_LOOKUP2 27 -#define DUK__BITPACK_SWITCH1 28 -#define DUK__BITPACK_SWITCH 29 -#define DUK__BITPACK_UNUSED1 30 -#define DUK__BITPACK_EIGHTBIT 31 - -DUK_LOCAL const duk_uint8_t duk__bitpacked_lookup[16] = { - DUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3, - DUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7, - DUK_ASC_8, DUK_ASC_9, DUK_ASC_UNDERSCORE, DUK_ASC_SPACE, - 0x82, 0x80, DUK_ASC_DOUBLEQUOTE, DUK_ASC_LCURLY -}; - -DUK_INTERNAL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out) { - duk_small_uint_t len; - duk_small_uint_t mode; - duk_small_uint_t t; - duk_small_uint_t i; - - len = duk_bd_decode(bd, 5); - if (len == 31) { - len = duk_bd_decode(bd, 8); /* Support up to 256 bytes; rare. */ - } - - mode = 32; /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */ - for (i = 0; i < len; i++) { - t = duk_bd_decode(bd, 5); - if (t < DUK__BITPACK_LETTER_LIMIT) { - t = t + DUK_ASC_UC_A + mode; - } else if (t == DUK__BITPACK_LOOKUP1) { - t = duk__bitpacked_lookup[duk_bd_decode(bd, 3)]; - } else if (t == DUK__BITPACK_LOOKUP2) { - t = duk__bitpacked_lookup[8 + duk_bd_decode(bd, 3)]; - } else if (t == DUK__BITPACK_SWITCH1) { - t = duk_bd_decode(bd, 5); - DUK_ASSERT_DISABLE(t >= 0); /* unsigned */ - DUK_ASSERT(t <= 25); - t = t + DUK_ASC_UC_A + (mode ^ 32); - } else if (t == DUK__BITPACK_SWITCH) { - mode = mode ^ 32; - t = duk_bd_decode(bd, 5); - DUK_ASSERT_DISABLE(t >= 0); - DUK_ASSERT(t <= 25); - t = t + DUK_ASC_UC_A + mode; - } else if (t == DUK__BITPACK_EIGHTBIT) { - t = duk_bd_decode(bd, 8); - } - out[i] = (duk_uint8_t) t; - } - - return len; -} - -/* automatic undefs */ -#undef DUK__BITPACK_EIGHTBIT -#undef DUK__BITPACK_LETTER_LIMIT -#undef DUK__BITPACK_LOOKUP1 -#undef DUK__BITPACK_LOOKUP2 -#undef DUK__BITPACK_SWITCH -#undef DUK__BITPACK_SWITCH1 -#undef DUK__BITPACK_UNUSED1 -#line 1 "duk_util_bitencoder.c" -/* - * Bitstream encoder. - */ - -/* #include duk_internal.h -> already included */ - -DUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) { - duk_uint8_t tmp; - - DUK_ASSERT(ctx != NULL); - DUK_ASSERT(ctx->currbits < 8); - - /* This limitation would be fixable but adds unnecessary complexity. */ - DUK_ASSERT(bits >= 1 && bits <= 24); - - ctx->currval = (ctx->currval << bits) | data; - ctx->currbits += bits; - - while (ctx->currbits >= 8) { - if (ctx->offset < ctx->length) { - tmp = (duk_uint8_t) ((ctx->currval >> (ctx->currbits - 8)) & 0xff); - ctx->data[ctx->offset++] = tmp; - } else { - /* If buffer has been exhausted, truncate bitstream */ - ctx->truncated = 1; - } - - ctx->currbits -= 8; - } -} - -DUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) { - duk_small_int_t npad; - - DUK_ASSERT(ctx != NULL); - DUK_ASSERT(ctx->currbits < 8); - - npad = (duk_small_int_t) (8 - ctx->currbits); - if (npad > 0) { - duk_be_encode(ctx, 0, npad); - } - DUK_ASSERT(ctx->currbits == 0); -} -#line 1 "duk_util_bufwriter.c" -/* - * Fast buffer writer with slack management. - */ - -/* #include duk_internal.h -> already included */ - -/* - * Macro support functions (use only macros in calling code) - */ - -DUK_LOCAL void duk__bw_update_ptrs(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t curr_offset, duk_size_t new_length) { - duk_uint8_t *p; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw_ctx != NULL); - DUK_UNREF(thr); - - p = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, bw_ctx->buf); - DUK_ASSERT(p != NULL || (DUK_HBUFFER_DYNAMIC_GET_SIZE(bw_ctx->buf) == 0 && curr_offset == 0 && new_length == 0)); - bw_ctx->p = p + curr_offset; - bw_ctx->p_base = p; - bw_ctx->p_limit = p + new_length; -} - -DUK_INTERNAL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf) { - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw_ctx != NULL); - DUK_ASSERT(h_buf != NULL); - - bw_ctx->buf = h_buf; - duk__bw_update_ptrs(thr, bw_ctx, 0, DUK_HBUFFER_DYNAMIC_GET_SIZE(h_buf)); -} - -DUK_INTERNAL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw_ctx != NULL); - - (void) duk_push_dynamic_buffer(thr, buf_size); - bw_ctx->buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1); - duk__bw_update_ptrs(thr, bw_ctx, 0, buf_size); -} - -/* Resize target buffer for requested size. Called by the macro only when the - * fast path test (= there is space) fails. - */ -DUK_INTERNAL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz) { - duk_size_t curr_off; - duk_size_t add_sz; - duk_size_t new_sz; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw_ctx != NULL); - - /* We could do this operation without caller updating bw_ctx->ptr, - * but by writing it back here we can share code better. - */ - - curr_off = (duk_size_t) (bw_ctx->p - bw_ctx->p_base); - add_sz = (curr_off >> DUK_BW_SLACK_SHIFT) + DUK_BW_SLACK_ADD; - new_sz = curr_off + sz + add_sz; - if (DUK_UNLIKELY(new_sz < curr_off)) { - /* overflow */ - DUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG); - return NULL; /* not reachable */ - } -#if 0 /* for manual torture testing: tight allocation, useful with valgrind */ - new_sz = curr_off + sz; -#endif - - /* This is important to ensure dynamic buffer data pointer is not - * NULL (which is possible if buffer size is zero), which in turn - * causes portability issues with e.g. memmove() and memcpy(). - */ - DUK_ASSERT(new_sz >= 1); - - DUK_DD(DUK_DDPRINT("resize bufferwriter from %ld to %ld (add_sz=%ld)", (long) curr_off, (long) new_sz, (long) add_sz)); - - duk_hbuffer_resize(thr, bw_ctx->buf, new_sz); - duk__bw_update_ptrs(thr, bw_ctx, curr_off, new_sz); - return bw_ctx->p; -} - -/* Make buffer compact, matching current written size. */ -DUK_INTERNAL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx) { - duk_size_t len; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw_ctx != NULL); - DUK_UNREF(thr); - - len = (duk_size_t) (bw_ctx->p - bw_ctx->p_base); - duk_hbuffer_resize(thr, bw_ctx->buf, len); - duk__bw_update_ptrs(thr, bw_ctx, len, len); -} - -DUK_INTERNAL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) { - duk_uint8_t *p_base; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_UNREF(thr); - - p_base = bw->p_base; - DUK_MEMCPY((void *) bw->p, - (const void *) (p_base + src_off), - (size_t) len); - bw->p += len; -} - -DUK_INTERNAL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); - - DUK_BW_ENSURE(thr, bw, len); - duk_bw_write_raw_slice(thr, bw, src_off, len); -} - -DUK_INTERNAL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) { - duk_uint8_t *p_base; - duk_size_t buf_sz, move_sz; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(buf != NULL); - DUK_UNREF(thr); - - p_base = bw->p_base; - buf_sz = (duk_size_t) (bw->p - p_base); /* constrained by maximum buffer size */ - move_sz = buf_sz - dst_off; - - DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */ - DUK_MEMMOVE((void *) (p_base + dst_off + len), - (const void *) (p_base + dst_off), - (size_t) move_sz); - DUK_MEMCPY((void *) (p_base + dst_off), - (const void *) buf, - (size_t) len); - bw->p += len; -} - -DUK_INTERNAL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(buf != NULL); - - DUK_BW_ENSURE(thr, bw, len); - duk_bw_insert_raw_bytes(thr, bw, dst_off, buf, len); -} - -DUK_INTERNAL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) { - duk_uint8_t *p_base; - duk_size_t buf_sz, move_sz; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_UNREF(thr); - - p_base = bw->p_base; - - /* Don't support "straddled" source now. */ - DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len); - - if (dst_off <= src_off) { - /* Target is before source. Source offset is expressed as - * a "before change" offset. Account for the memmove. - */ - src_off += len; - } - - buf_sz = (duk_size_t) (bw->p - p_base); - move_sz = buf_sz - dst_off; - - DUK_ASSERT(p_base != NULL); /* buffer size is >= 1 */ - DUK_MEMMOVE((void *) (p_base + dst_off + len), - (const void *) (p_base + dst_off), - (size_t) move_sz); - DUK_MEMCPY((void *) (p_base + dst_off), - (const void *) (p_base + src_off), - (size_t) len); - bw->p += len; -} - -DUK_INTERNAL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw)); - - /* Don't support "straddled" source now. */ - DUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len); - - DUK_BW_ENSURE(thr, bw, len); - duk_bw_insert_raw_slice(thr, bw, dst_off, src_off, len); -} - -DUK_INTERNAL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { - duk_uint8_t *p_base, *p_dst, *p_src; - duk_size_t buf_sz, move_sz; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_UNREF(thr); - - p_base = bw->p_base; - buf_sz = (duk_size_t) (bw->p - p_base); - move_sz = buf_sz - off; - p_dst = p_base + off + len; - p_src = p_base + off; - DUK_MEMMOVE((void *) p_dst, (const void *) p_src, (size_t) move_sz); - return p_src; /* point to start of 'reserved area' */ -} - -DUK_INTERNAL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); - - DUK_BW_ENSURE(thr, bw, len); - return duk_bw_insert_raw_area(thr, bw, off, len); -} - -DUK_INTERNAL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) { - duk_size_t move_sz; - - duk_uint8_t *p_base; - duk_uint8_t *p_src; - duk_uint8_t *p_dst; - - DUK_ASSERT(thr != NULL); - DUK_ASSERT(bw != NULL); - DUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_ASSERT(off + len <= DUK_BW_GET_SIZE(thr, bw)); - DUK_UNREF(thr); - - p_base = bw->p_base; - p_dst = p_base + off; - p_src = p_dst + len; - move_sz = (duk_size_t) (bw->p - p_src); - DUK_MEMMOVE((void *) p_dst, - (const void *) p_src, - (size_t) move_sz); - bw->p -= len; -} - -/* - * Macro support functions for reading/writing raw data. - * - * These are done using mempcy to ensure they're valid even for unaligned - * reads/writes on platforms where alignment counts. On x86 at least gcc - * is able to compile these into a bswap+mov. "Always inline" is used to - * ensure these macros compile to minimal code. - * - * Not really bufwriter related, but currently used together. - */ - -DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p) { - union { - duk_uint8_t b[2]; - duk_uint16_t x; - } u; - - DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 2); - u.x = DUK_NTOH16(u.x); - *p += 2; - return u.x; -} - -DUK_INTERNAL DUK_ALWAYS_INLINE duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p) { - union { - duk_uint8_t b[4]; - duk_uint32_t x; - } u; - - DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4); - u.x = DUK_NTOH32(u.x); - *p += 4; - return u.x; -} - -DUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_raw_read_double_be(duk_uint8_t **p) { - duk_double_union du; - union { - duk_uint8_t b[4]; - duk_uint32_t x; - } u; - - DUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4); - u.x = DUK_NTOH32(u.x); - du.ui[DUK_DBL_IDX_UI0] = u.x; - DUK_MEMCPY((void *) u.b, (const void *) (*p + 4), (size_t) 4); - u.x = DUK_NTOH32(u.x); - du.ui[DUK_DBL_IDX_UI1] = u.x; - *p += 8; - - return du.d; -} - -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val) { - union { - duk_uint8_t b[2]; - duk_uint16_t x; - } u; - - u.x = DUK_HTON16(val); - DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 2); - *p += 2; -} - -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val) { - union { - duk_uint8_t b[4]; - duk_uint32_t x; - } u; - - u.x = DUK_HTON32(val); - DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4); - *p += 4; -} - -DUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val) { - duk_double_union du; - union { - duk_uint8_t b[4]; - duk_uint32_t x; - } u; - - du.d = val; - u.x = du.ui[DUK_DBL_IDX_UI0]; - u.x = DUK_HTON32(u.x); - DUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4); - u.x = du.ui[DUK_DBL_IDX_UI1]; - u.x = DUK_HTON32(u.x); - DUK_MEMCPY((void *) (*p + 4), (const void *) u.b, (size_t) 4); - *p += 8; -} -#line 1 "duk_util_hashbytes.c" -/* - * Hash function duk_util_hashbytes(). - * - * Currently, 32-bit MurmurHash2. - * - * Don't rely on specific hash values; hash function may be endianness - * dependent, for instance. - */ - -/* #include duk_internal.h -> already included */ - -#if defined(DUK_USE_STRHASH_DENSE) -/* 'magic' constants for Murmurhash2 */ -#define DUK__MAGIC_M ((duk_uint32_t) 0x5bd1e995UL) -#define DUK__MAGIC_R 24 - -DUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed) { - duk_uint32_t h = seed ^ ((duk_uint32_t) len); - - while (len >= 4) { - /* Portability workaround is required for platforms without - * unaligned access. The replacement code emulates little - * endian access even on big endian architectures, which is - * OK as long as it is consistent for a build. - */ -#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS) - duk_uint32_t k = *((const duk_uint32_t *) (const void *) data); -#else - duk_uint32_t k = ((duk_uint32_t) data[0]) | - (((duk_uint32_t) data[1]) << 8) | - (((duk_uint32_t) data[2]) << 16) | - (((duk_uint32_t) data[3]) << 24); -#endif - - k *= DUK__MAGIC_M; - k ^= k >> DUK__MAGIC_R; - k *= DUK__MAGIC_M; - h *= DUK__MAGIC_M; - h ^= k; - data += 4; - len -= 4; - } - - switch (len) { - case 3: h ^= data[2] << 16; - case 2: h ^= data[1] << 8; - case 1: h ^= data[0]; - h *= DUK__MAGIC_M; - } - - h ^= h >> 13; - h *= DUK__MAGIC_M; - h ^= h >> 15; - - return h; -} -#endif /* DUK_USE_STRHASH_DENSE */ - -/* automatic undefs */ -#undef DUK__MAGIC_M -#undef DUK__MAGIC_R -#line 1 "duk_util_tinyrandom.c" -/* - * A tiny random number generator used for Math.random() and other internals. - * - * Default algorithm is xoroshiro128+: http://xoroshiro.di.unimi.it/xoroshiro128plus.c - * with SplitMix64 seed preparation: http://xorshift.di.unimi.it/splitmix64.c. - * - * Low memory targets and targets without 64-bit types use a slightly smaller - * (but slower) algorithm by Adi Shamir: - * http://www.woodmann.com/forum/archive/index.php/t-3100.html. - * - */ - -/* #include duk_internal.h -> already included */ - -#if !defined(DUK_USE_GET_RANDOM_DOUBLE) - -#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS) -#define DUK__RANDOM_SHAMIR3OP -#else -#define DUK__RANDOM_XOROSHIRO128PLUS -#endif - -#if defined(DUK__RANDOM_SHAMIR3OP) -#define DUK__UPDATE_RND(rnd) do { \ - (rnd) += ((rnd) * (rnd)) | 0x05UL; \ - (rnd) = ((rnd) & 0xffffffffUL); /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \ - } while (0) - -#define DUK__RND_BIT(rnd) ((rnd) >> 31) /* only use the highest bit */ - -DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { - DUK_UNREF(thr); /* Nothing now. */ -} - -DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { - duk_double_t t; - duk_small_int_t n; - duk_uint32_t rnd; - - rnd = thr->heap->rnd_state; - - n = 53; /* enough to cover the whole mantissa */ - t = 0.0; - - do { - DUK__UPDATE_RND(rnd); - t += DUK__RND_BIT(rnd); - t /= 2.0; - } while (--n); - - thr->heap->rnd_state = rnd; - - DUK_ASSERT(t >= (duk_double_t) 0.0); - DUK_ASSERT(t < (duk_double_t) 1.0); - - return t; -} -#endif /* DUK__RANDOM_SHAMIR3OP */ - -#if defined(DUK__RANDOM_XOROSHIRO128PLUS) -DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_splitmix64(duk_uint64_t *x) { - duk_uint64_t z; - z = (*x += DUK_U64_CONSTANT(0x9E3779B97F4A7C15)); - z = (z ^ (z >> 30U)) * DUK_U64_CONSTANT(0xBF58476D1CE4E5B9); - z = (z ^ (z >> 27U)) * DUK_U64_CONSTANT(0x94D049BB133111EB); - return z ^ (z >> 31U); -} - -DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_rotl(const duk_uint64_t x, duk_small_uint_t k) { - return (x << k) | (x >> (64U - k)); -} - -DUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__xoroshiro128plus(duk_uint64_t *s) { - duk_uint64_t s0; - duk_uint64_t s1; - duk_uint64_t res; - - s0 = s[0]; - s1 = s[1]; - res = s0 + s1; - s1 ^= s0; - s[0] = duk__rnd_rotl(s0, 55) ^ s1 ^ (s1 << 14U); - s[1] = duk__rnd_rotl(s1, 36); - - return res; -} - -DUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) { - duk_small_uint_t i; - duk_uint64_t x; - - /* Mix both halves of the initial seed with SplitMix64. The intent - * is to ensure that very similar raw seeds (which is usually the case - * because current seed is Date.now()) result in different xoroshiro128+ - * seeds. - */ - x = thr->heap->rnd_state[0]; /* Only [0] is used as input here. */ - for (i = 0; i < 64; i++) { - thr->heap->rnd_state[i & 0x01] = duk__rnd_splitmix64(&x); /* Keep last 2 values. */ - } -} - -DUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) { - duk_uint64_t v; - duk_double_union du; - - /* For big and little endian the integer and IEEE double byte order - * is the same so a direct assignment works. For mixed endian the - * 32-bit parts must be swapped. - */ - v = (DUK_U64_CONSTANT(0x3ff) << 52U) | (duk__xoroshiro128plus((duk_uint64_t *) thr->heap->rnd_state) >> 12U); - du.ull[0] = v; -#if defined(DUK_USE_DOUBLE_ME) - do { - duk_uint32_t tmp; - tmp = du.ui[0]; - du.ui[0] = du.ui[1]; - du.ui[1] = tmp; - } while (0); -#endif - return du.d - 1.0; -} -#endif /* DUK__RANDOM_XOROSHIRO128PLUS */ - -#endif /* !DUK_USE_GET_RANDOM_DOUBLE */ - -/* automatic undefs */ -#undef DUK__RANDOM_SHAMIR3OP -#undef DUK__RANDOM_XOROSHIRO128PLUS -#undef DUK__RND_BIT -#undef DUK__UPDATE_RND diff --git a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.h b/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.h deleted file mode 100644 index bf330a1f..00000000 --- a/plugins/community/repos/BOKONTEPByteBeatMachine/src/duktape.h +++ /dev/null @@ -1,1349 +0,0 @@ -/* - * Duktape public API for Duktape 2.2.1. - * - * See the API reference for documentation on call semantics. The exposed, - * supported API is between the "BEGIN PUBLIC API" and "END PUBLIC API" - * comments. Other parts of the header are Duktape internal and related to - * e.g. platform/compiler/feature detection. - * - * Git commit 25420e773c5fbc50d5b46bf487fc45717e35b94f (v2.2.1). - * Git branch v2.2-maintenance. - * - * See Duktape AUTHORS.rst and LICENSE.txt for copyright and - * licensing information. - */ - -/* LICENSE.txt */ -/* - * =============== - * Duktape license - * =============== - * - * (http://opensource.org/licenses/MIT) - * - * Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/* AUTHORS.rst */ -/* - * =============== - * Duktape authors - * =============== - * - * Copyright - * ========= - * - * Duktape copyrights are held by its authors. Each author has a copyright - * to their contribution, and agrees to irrevocably license the contribution - * under the Duktape ``LICENSE.txt``. - * - * Authors - * ======= - * - * Please include an e-mail address, a link to your GitHub profile, or something - * similar to allow your contribution to be identified accurately. - * - * The following people have contributed code, website contents, or Wiki contents, - * and agreed to irrevocably license their contributions under the Duktape - * ``LICENSE.txt`` (in order of appearance): - * - * * Sami Vaarala - * * Niki Dobrev - * * Andreas \u00d6man - * * L\u00e1szl\u00f3 Lang\u00f3 - * * Legimet - * * Karl Skomski - * * Bruce Pascoe - * * Ren\u00e9 Hollander - * * Julien Hamaide (https://github.com/crazyjul) - * * Sebastian G\u00f6tte (https://github.com/jaseg) - * * Tomasz Magulski (https://github.com/magul) - * * \D. Bohdan (https://github.com/dbohdan) - * * Ond\u0159ej Jirman (https://github.com/megous) - * * Sa\u00fal Ibarra Corretg\u00e9 - * * Jeremy HU - * * Ole Andr\u00e9 Vadla Ravn\u00e5s (https://github.com/oleavr) - * * Harold Brenes (https://github.com/harold-b) - * * Oliver Crow (https://github.com/ocrow) - * * Jakub Ch\u0142api\u0144ski (https://github.com/jchlapinski) - * * Brett Vickers (https://github.com/beevik) - * * Dominik Okwieka (https://github.com/okitec) - * * Remko Tron\u00e7on (https://el-tramo.be) - * * Romero Malaquias (rbsm@ic.ufal.br) - * * Michael Drake - * * Steven Don (https://github.com/shdon) - * * Simon Stone (https://github.com/sstone1) - * * \J. McC. (https://github.com/jmhmccr) - * - * Other contributions - * =================== - * - * The following people have contributed something other than code (e.g. reported - * bugs, provided ideas, etc; roughly in order of appearance): - * - * * Greg Burns - * * Anthony Rabine - * * Carlos Costa - * * Aur\u00e9lien Bouilland - * * Preet Desai (Pris Matic) - * * judofyr (http://www.reddit.com/user/judofyr) - * * Jason Woofenden - * * Micha\u0142 Przyby\u015b - * * Anthony Howe - * * Conrad Pankoff - * * Jim Schimpf - * * Rajaran Gaunker (https://github.com/zimbabao) - * * Andreas \u00d6man - * * Doug Sanden - * * Josh Engebretson (https://github.com/JoshEngebretson) - * * Remo Eichenberger (https://github.com/remoe) - * * Mamod Mehyar (https://github.com/mamod) - * * David Demelier (https://github.com/markand) - * * Tim Caswell (https://github.com/creationix) - * * Mitchell Blank Jr (https://github.com/mitchblank) - * * https://github.com/yushli - * * Seo Sanghyeon (https://github.com/sanxiyn) - * * Han ChoongWoo (https://github.com/tunz) - * * Joshua Peek (https://github.com/josh) - * * Bruce E. Pascoe (https://github.com/fatcerberus) - * * https://github.com/Kelledin - * * https://github.com/sstruchtrup - * * Michael Drake (https://github.com/tlsa) - * * https://github.com/chris-y - * * Laurent Zubiaur (https://github.com/lzubiaur) - * * Neil Kolban (https://github.com/nkolban) - * - * If you are accidentally missing from this list, send me an e-mail - * (``sami.vaarala@iki.fi``) and I'll fix the omission. - */ - -#if !defined(DUKTAPE_H_INCLUDED) -#define DUKTAPE_H_INCLUDED - -#define DUK_SINGLE_FILE - -/* - * BEGIN PUBLIC API - */ - -/* - * Version and Git commit identification - */ - -/* Duktape version, (major * 10000) + (minor * 100) + patch. Allows C code - * to #if (DUK_VERSION >= NNN) against Duktape API version. The same value - * is also available to Ecmascript code in Duktape.version. Unofficial - * development snapshots have 99 for patch level (e.g. 0.10.99 would be a - * development version after 0.10.0 but before the next official release). - */ -#define DUK_VERSION 20201L - -/* Git commit, describe, and branch for Duktape build. Useful for - * non-official snapshot builds so that application code can easily log - * which Duktape snapshot was used. Not available in the Ecmascript - * environment. - */ -#define DUK_GIT_COMMIT "25420e773c5fbc50d5b46bf487fc45717e35b94f" -#define DUK_GIT_DESCRIBE "v2.2.1" -#define DUK_GIT_BRANCH "v2.2-maintenance" - -/* External duk_config.h provides platform/compiler/OS dependent - * typedefs and macros, and DUK_USE_xxx config options so that - * the rest of Duktape doesn't need to do any feature detection. - * DUK_VERSION is defined before including so that configuration - * snippets can react to it. - */ -#include "duk_config.h" - -/* - * Avoid C++ name mangling - */ - -#if defined(__cplusplus) -extern "C" { -#endif - -/* - * Some defines forwarded from feature detection - */ - -#undef DUK_API_VARIADIC_MACROS -#if defined(DUK_USE_VARIADIC_MACROS) -#define DUK_API_VARIADIC_MACROS -#endif - -#define DUK_API_NORETURN(decl) DUK_NORETURN(decl) - -/* - * Public API specific typedefs - * - * Many types are wrapped by Duktape for portability to rare platforms - * where e.g. 'int' is a 16-bit type. See practical typing discussion - * in Duktape web documentation. - */ - -struct duk_thread_state; -struct duk_memory_functions; -struct duk_function_list_entry; -struct duk_number_list_entry; -struct duk_time_components; - -/* duk_context is now defined in duk_config.h because it may also be - * referenced there by prototypes. - */ -typedef struct duk_thread_state duk_thread_state; -typedef struct duk_memory_functions duk_memory_functions; -typedef struct duk_function_list_entry duk_function_list_entry; -typedef struct duk_number_list_entry duk_number_list_entry; -typedef struct duk_time_components duk_time_components; - -typedef duk_ret_t (*duk_c_function)(duk_context *ctx); -typedef void *(*duk_alloc_function) (void *udata, duk_size_t size); -typedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size); -typedef void (*duk_free_function) (void *udata, void *ptr); -typedef void (*duk_fatal_function) (void *udata, const char *msg); -typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint); -typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint); -typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata); -typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length); -typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length); -typedef duk_size_t (*duk_debug_peek_function) (void *udata); -typedef void (*duk_debug_read_flush_function) (void *udata); -typedef void (*duk_debug_write_flush_function) (void *udata); -typedef duk_idx_t (*duk_debug_request_function) (duk_context *ctx, void *udata, duk_idx_t nvalues); -typedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata); - -struct duk_thread_state { - /* XXX: Enough space to hold internal suspend/resume structure. - * This is rather awkward and to be fixed when the internal - * structure is visible for the public API header. - */ - char data[128]; -}; - -struct duk_memory_functions { - duk_alloc_function alloc_func; - duk_realloc_function realloc_func; - duk_free_function free_func; - void *udata; -}; - -struct duk_function_list_entry { - const char *key; - duk_c_function value; - duk_idx_t nargs; -}; - -struct duk_number_list_entry { - const char *key; - duk_double_t value; -}; - -struct duk_time_components { - duk_double_t year; /* year, e.g. 2016, Ecmascript year range */ - duk_double_t month; /* month: 1-12 */ - duk_double_t day; /* day: 1-31 */ - duk_double_t hours; /* hour: 0-59 */ - duk_double_t minutes; /* minute: 0-59 */ - duk_double_t seconds; /* second: 0-59 (in POSIX time no leap second) */ - duk_double_t milliseconds; /* may contain sub-millisecond fractions */ - duk_double_t weekday; /* weekday: 0-6, 0=Sunday, 1=Monday, ..., 6=Saturday */ -}; - -/* - * Constants - */ - -/* Duktape debug protocol version used by this build. */ -#define DUK_DEBUG_PROTOCOL_VERSION 2 - -/* Used to represent invalid index; if caller uses this without checking, - * this index will map to a non-existent stack entry. Also used in some - * API calls as a marker to denote "no value". - */ -#define DUK_INVALID_INDEX DUK_IDX_MIN - -/* Indicates that a native function does not have a fixed number of args, - * and the argument stack should not be capped/extended at all. - */ -#define DUK_VARARGS ((duk_int_t) (-1)) - -/* Number of value stack entries (in addition to actual call arguments) - * guaranteed to be allocated on entry to a Duktape/C function. - */ -#define DUK_API_ENTRY_STACK 64U - -/* Value types, used by e.g. duk_get_type() */ -#define DUK_TYPE_MIN 0U -#define DUK_TYPE_NONE 0U /* no value, e.g. invalid index */ -#define DUK_TYPE_UNDEFINED 1U /* Ecmascript undefined */ -#define DUK_TYPE_NULL 2U /* Ecmascript null */ -#define DUK_TYPE_BOOLEAN 3U /* Ecmascript boolean: 0 or 1 */ -#define DUK_TYPE_NUMBER 4U /* Ecmascript number: double */ -#define DUK_TYPE_STRING 5U /* Ecmascript string: CESU-8 / extended UTF-8 encoded */ -#define DUK_TYPE_OBJECT 6U /* Ecmascript object: includes objects, arrays, functions, threads */ -#define DUK_TYPE_BUFFER 7U /* fixed or dynamic, garbage collected byte buffer */ -#define DUK_TYPE_POINTER 8U /* raw void pointer */ -#define DUK_TYPE_LIGHTFUNC 9U /* lightweight function pointer */ -#define DUK_TYPE_MAX 9U - -/* Value mask types, used by e.g. duk_get_type_mask() */ -#define DUK_TYPE_MASK_NONE (1U << DUK_TYPE_NONE) -#define DUK_TYPE_MASK_UNDEFINED (1U << DUK_TYPE_UNDEFINED) -#define DUK_TYPE_MASK_NULL (1U << DUK_TYPE_NULL) -#define DUK_TYPE_MASK_BOOLEAN (1U << DUK_TYPE_BOOLEAN) -#define DUK_TYPE_MASK_NUMBER (1U << DUK_TYPE_NUMBER) -#define DUK_TYPE_MASK_STRING (1U << DUK_TYPE_STRING) -#define DUK_TYPE_MASK_OBJECT (1U << DUK_TYPE_OBJECT) -#define DUK_TYPE_MASK_BUFFER (1U << DUK_TYPE_BUFFER) -#define DUK_TYPE_MASK_POINTER (1U << DUK_TYPE_POINTER) -#define DUK_TYPE_MASK_LIGHTFUNC (1U << DUK_TYPE_LIGHTFUNC) -#define DUK_TYPE_MASK_THROW (1U << 10) /* internal flag value: throw if mask doesn't match */ -#define DUK_TYPE_MASK_PROMOTE (1U << 11) /* internal flag value: promote to object if mask matches */ - -/* Coercion hints */ -#define DUK_HINT_NONE 0 /* prefer number, unless input is a Date, in which - * case prefer string (E5 Section 8.12.8) - */ -#define DUK_HINT_STRING 1 /* prefer string */ -#define DUK_HINT_NUMBER 2 /* prefer number */ - -/* Enumeration flags for duk_enum() */ -#define DUK_ENUM_INCLUDE_NONENUMERABLE (1U << 0) /* enumerate non-numerable properties in addition to enumerable */ -#define DUK_ENUM_INCLUDE_HIDDEN (1U << 1) /* enumerate hidden symbols too (in Duktape 1.x called internal properties) */ -#define DUK_ENUM_INCLUDE_SYMBOLS (1U << 2) /* enumerate symbols */ -#define DUK_ENUM_EXCLUDE_STRINGS (1U << 3) /* exclude strings */ -#define DUK_ENUM_OWN_PROPERTIES_ONLY (1U << 4) /* don't walk prototype chain, only check own properties */ -#define DUK_ENUM_ARRAY_INDICES_ONLY (1U << 5) /* only enumerate array indices */ -/* XXX: misleading name */ -#define DUK_ENUM_SORT_ARRAY_INDICES (1U << 6) /* sort array indices (applied to full enumeration result, including inherited array indices); XXX: misleading name */ -#define DUK_ENUM_NO_PROXY_BEHAVIOR (1U << 7) /* enumerate a proxy object itself without invoking proxy behavior */ - -/* Compilation flags for duk_compile() and duk_eval() */ -/* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument. - */ -#define DUK_COMPILE_EVAL (1U << 3) /* compile eval code (instead of global code) */ -#define DUK_COMPILE_FUNCTION (1U << 4) /* compile function code (instead of global code) */ -#define DUK_COMPILE_STRICT (1U << 5) /* use strict (outer) context for global, eval, or function code */ -#define DUK_COMPILE_SHEBANG (1U << 6) /* allow shebang ('#! ...') comment on first line of source */ -#define DUK_COMPILE_SAFE (1U << 7) /* (internal) catch compilation errors */ -#define DUK_COMPILE_NORESULT (1U << 8) /* (internal) omit eval result */ -#define DUK_COMPILE_NOSOURCE (1U << 9) /* (internal) no source string on stack */ -#define DUK_COMPILE_STRLEN (1U << 10) /* (internal) take strlen() of src_buffer (avoids double evaluation in macro) */ -#define DUK_COMPILE_NOFILENAME (1U << 11) /* (internal) no filename on stack */ -#define DUK_COMPILE_FUNCEXPR (1U << 12) /* (internal) source is a function expression (used for Function constructor) */ - -/* Flags for duk_def_prop() and its variants; base flags + a lot of convenience shorthands */ -#define DUK_DEFPROP_WRITABLE (1U << 0) /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */ -#define DUK_DEFPROP_ENUMERABLE (1U << 1) /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */ -#define DUK_DEFPROP_CONFIGURABLE (1U << 2) /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */ -#define DUK_DEFPROP_HAVE_WRITABLE (1U << 3) /* set/clear writable */ -#define DUK_DEFPROP_HAVE_ENUMERABLE (1U << 4) /* set/clear enumerable */ -#define DUK_DEFPROP_HAVE_CONFIGURABLE (1U << 5) /* set/clear configurable */ -#define DUK_DEFPROP_HAVE_VALUE (1U << 6) /* set value (given on value stack) */ -#define DUK_DEFPROP_HAVE_GETTER (1U << 7) /* set getter (given on value stack) */ -#define DUK_DEFPROP_HAVE_SETTER (1U << 8) /* set setter (given on value stack) */ -#define DUK_DEFPROP_FORCE (1U << 9) /* force change if possible, may still fail for e.g. virtual properties */ -#define DUK_DEFPROP_SET_WRITABLE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE) -#define DUK_DEFPROP_CLEAR_WRITABLE DUK_DEFPROP_HAVE_WRITABLE -#define DUK_DEFPROP_SET_ENUMERABLE (DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE) -#define DUK_DEFPROP_CLEAR_ENUMERABLE DUK_DEFPROP_HAVE_ENUMERABLE -#define DUK_DEFPROP_SET_CONFIGURABLE (DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE) -#define DUK_DEFPROP_CLEAR_CONFIGURABLE DUK_DEFPROP_HAVE_CONFIGURABLE -#define DUK_DEFPROP_W DUK_DEFPROP_WRITABLE -#define DUK_DEFPROP_E DUK_DEFPROP_ENUMERABLE -#define DUK_DEFPROP_C DUK_DEFPROP_CONFIGURABLE -#define DUK_DEFPROP_WE (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE) -#define DUK_DEFPROP_WC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_CONFIGURABLE) -#define DUK_DEFPROP_WEC (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE | DUK_DEFPROP_CONFIGURABLE) -#define DUK_DEFPROP_HAVE_W DUK_DEFPROP_HAVE_WRITABLE -#define DUK_DEFPROP_HAVE_E DUK_DEFPROP_HAVE_ENUMERABLE -#define DUK_DEFPROP_HAVE_C DUK_DEFPROP_HAVE_CONFIGURABLE -#define DUK_DEFPROP_HAVE_WE (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE) -#define DUK_DEFPROP_HAVE_WC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_CONFIGURABLE) -#define DUK_DEFPROP_HAVE_WEC (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE) -#define DUK_DEFPROP_SET_W DUK_DEFPROP_SET_WRITABLE -#define DUK_DEFPROP_SET_E DUK_DEFPROP_SET_ENUMERABLE -#define DUK_DEFPROP_SET_C DUK_DEFPROP_SET_CONFIGURABLE -#define DUK_DEFPROP_SET_WE (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE) -#define DUK_DEFPROP_SET_WC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE) -#define DUK_DEFPROP_SET_WEC (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE) -#define DUK_DEFPROP_CLEAR_W DUK_DEFPROP_CLEAR_WRITABLE -#define DUK_DEFPROP_CLEAR_E DUK_DEFPROP_CLEAR_ENUMERABLE -#define DUK_DEFPROP_CLEAR_C DUK_DEFPROP_CLEAR_CONFIGURABLE -#define DUK_DEFPROP_CLEAR_WE (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE) -#define DUK_DEFPROP_CLEAR_WC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE) -#define DUK_DEFPROP_CLEAR_WEC (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE) -#define DUK_DEFPROP_ATTR_W (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_W) -#define DUK_DEFPROP_ATTR_E (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_E) -#define DUK_DEFPROP_ATTR_C (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_C) -#define DUK_DEFPROP_ATTR_WE (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WE) -#define DUK_DEFPROP_ATTR_WC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WC) -#define DUK_DEFPROP_ATTR_WEC (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WEC) - -/* Flags for duk_push_thread_raw() */ -#define DUK_THREAD_NEW_GLOBAL_ENV (1U << 0) /* create a new global environment */ - -/* Flags for duk_gc() */ -#define DUK_GC_COMPACT (1U << 0) /* compact heap objects */ - -/* Error codes (must be 8 bits at most, see duk_error.h) */ -#define DUK_ERR_NONE 0 /* no error (e.g. from duk_get_error_code()) */ -#define DUK_ERR_ERROR 1 /* Error */ -#define DUK_ERR_EVAL_ERROR 2 /* EvalError */ -#define DUK_ERR_RANGE_ERROR 3 /* RangeError */ -#define DUK_ERR_REFERENCE_ERROR 4 /* ReferenceError */ -#define DUK_ERR_SYNTAX_ERROR 5 /* SyntaxError */ -#define DUK_ERR_TYPE_ERROR 6 /* TypeError */ -#define DUK_ERR_URI_ERROR 7 /* URIError */ - -/* Return codes for C functions (shortcut for throwing an error) */ -#define DUK_RET_ERROR (-DUK_ERR_ERROR) -#define DUK_RET_EVAL_ERROR (-DUK_ERR_EVAL_ERROR) -#define DUK_RET_RANGE_ERROR (-DUK_ERR_RANGE_ERROR) -#define DUK_RET_REFERENCE_ERROR (-DUK_ERR_REFERENCE_ERROR) -#define DUK_RET_SYNTAX_ERROR (-DUK_ERR_SYNTAX_ERROR) -#define DUK_RET_TYPE_ERROR (-DUK_ERR_TYPE_ERROR) -#define DUK_RET_URI_ERROR (-DUK_ERR_URI_ERROR) - -/* Return codes for protected calls (duk_safe_call(), duk_pcall()) */ -#define DUK_EXEC_SUCCESS 0 -#define DUK_EXEC_ERROR 1 - -/* Debug levels for DUK_USE_DEBUG_WRITE(). */ -#define DUK_LEVEL_DEBUG 0 -#define DUK_LEVEL_DDEBUG 1 -#define DUK_LEVEL_DDDEBUG 2 - -/* - * Macros to create Symbols as C statically constructed strings. - * - * Call e.g. as DUK_HIDDEN_SYMBOL("myProperty") <=> ("\xFF" "myProperty"). - * Local symbols have a unique suffix, caller should take care to avoid - * conflicting with the Duktape internal representation by e.g. prepending - * a '!' character: DUK_LOCAL_SYMBOL("myLocal", "!123"). - * - * Note that these can only be used for string constants, not dynamically - * created strings. - */ - -#define DUK_HIDDEN_SYMBOL(x) ("\xFF" x) -#define DUK_GLOBAL_SYMBOL(x) ("\x80" x) -#define DUK_LOCAL_SYMBOL(x,uniq) ("\x81" x "\xff" uniq) -#define DUK_WELLKNOWN_SYMBOL(x) ("\x81" x "\xff") - -/* - * If no variadic macros, __FILE__ and __LINE__ are passed through globals - * which is ugly and not thread safe. - */ - -#if !defined(DUK_API_VARIADIC_MACROS) -DUK_EXTERNAL_DECL const char *duk_api_global_filename; -DUK_EXTERNAL_DECL duk_int_t duk_api_global_line; -#endif - -/* - * Context management - */ - -DUK_EXTERNAL_DECL -duk_context *duk_create_heap(duk_alloc_function alloc_func, - duk_realloc_function realloc_func, - duk_free_function free_func, - void *heap_udata, - duk_fatal_function fatal_handler); -DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx); - -DUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state); -DUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state); - -#define duk_create_heap_default() \ - duk_create_heap(NULL, NULL, NULL, NULL, NULL) - -/* - * Memory management - * - * Raw functions have no side effects (cannot trigger GC). - */ - -DUK_EXTERNAL_DECL void *duk_alloc_raw(duk_context *ctx, duk_size_t size); -DUK_EXTERNAL_DECL void duk_free_raw(duk_context *ctx, void *ptr); -DUK_EXTERNAL_DECL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size); -DUK_EXTERNAL_DECL void *duk_alloc(duk_context *ctx, duk_size_t size); -DUK_EXTERNAL_DECL void duk_free(duk_context *ctx, void *ptr); -DUK_EXTERNAL_DECL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size); -DUK_EXTERNAL_DECL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs); -DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags); - -/* - * Error handling - */ - -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw_raw(duk_context *ctx)); -#define duk_throw(ctx) \ - (duk_throw_raw((ctx)), (duk_ret_t) 0) -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal_raw(duk_context *ctx, const char *err_msg)); -#define duk_fatal(ctx,err_msg) \ - (duk_fatal_raw((ctx), (err_msg)), (duk_ret_t) 0) -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...)); - -#if defined(DUK_API_VARIADIC_MACROS) -#define duk_error(ctx,err_code,...) \ - (duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_generic_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_eval_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_range_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_reference_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_syntax_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_type_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#define duk_uri_error(ctx,...) \ - (duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0) -#else /* DUK_API_VARIADIC_MACROS */ -/* For legacy compilers without variadic macros a macro hack is used to allow - * variable arguments. While the macro allows "return duk_error(...)", it - * will fail with e.g. "(void) duk_error(...)". The calls are noreturn but - * with a return value to allow the "return duk_error(...)" idiom. This may - * cause some compiler warnings, but without noreturn the generated code is - * often worse. The same approach as with variadic macros (using - * "(duk_error(...), 0)") won't work due to the macro hack structure. - */ -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_range_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_type_error_stash(duk_context *ctx, const char *fmt, ...)); -DUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_stash(duk_context *ctx, const char *fmt, ...)); -#define duk_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_error_stash) /* last value is func pointer, arguments follow in parens */ -#define duk_generic_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_generic_error_stash) -#define duk_eval_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_eval_error_stash) -#define duk_range_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_range_error_stash) -#define duk_reference_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_reference_error_stash) -#define duk_syntax_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_syntax_error_stash) -#define duk_type_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_type_error_stash) -#define duk_uri_error \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_uri_error_stash) -#endif /* DUK_API_VARIADIC_MACROS */ - -DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap)); - -#define duk_error_va(ctx,err_code,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_generic_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_eval_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_range_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_reference_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_syntax_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_type_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) -#define duk_uri_error_va(ctx,fmt,ap) \ - (duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0) - -/* - * Other state related functions - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_is_strict_call(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx); - -/* - * Stack management - */ - -DUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx); - -DUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx); -DUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx); - -/* Although extra/top could be an unsigned type here, using a signed type - * makes the API more robust to calling code calculation errors or corner - * cases (where caller might occasionally come up with negative values). - * Negative values are treated as zero, which is better than casting them - * to a large unsigned number. (This principle is used elsewhere in the - * API too.) - */ -DUK_EXTERNAL_DECL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra); -DUK_EXTERNAL_DECL void duk_require_stack(duk_context *ctx, duk_idx_t extra); -DUK_EXTERNAL_DECL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top); -DUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top); - -/* - * Stack manipulation (other than push/pop) - */ - -DUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); -DUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx); -DUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx); -DUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx); -DUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx); -DUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy); - -#define duk_xmove_top(to_ctx,from_ctx,count) \ - duk_xcopymove_raw((to_ctx), (from_ctx), (count), 0 /*is_copy*/) -#define duk_xcopy_top(to_ctx,from_ctx,count) \ - duk_xcopymove_raw((to_ctx), (from_ctx), (count), 1 /*is_copy*/) - -/* - * Push operations - * - * Push functions return the absolute (relative to bottom of frame) - * position of the pushed value for convenience. - * - * Note: duk_dup() is technically a push. - */ - -DUK_EXTERNAL_DECL void duk_push_undefined(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_null(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_boolean(duk_context *ctx, duk_bool_t val); -DUK_EXTERNAL_DECL void duk_push_true(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_false(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_number(duk_context *ctx, duk_double_t val); -DUK_EXTERNAL_DECL void duk_push_nan(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_int(duk_context *ctx, duk_int_t val); -DUK_EXTERNAL_DECL void duk_push_uint(duk_context *ctx, duk_uint_t val); -DUK_EXTERNAL_DECL const char *duk_push_string(duk_context *ctx, const char *str); -DUK_EXTERNAL_DECL const char *duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len); -DUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p); -DUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...); -DUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap); - -DUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_current_function(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_current_thread(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_global_object(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_heap_stash(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_global_stash(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx); - -DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx); -DUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx); -DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx); -DUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic); -DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags); -DUK_EXTERNAL_DECL duk_idx_t duk_push_proxy(duk_context *ctx, duk_uint_t proxy_flags); - -#define duk_push_thread(ctx) \ - duk_push_thread_raw((ctx), 0 /*flags*/) - -#define duk_push_thread_new_globalenv(ctx) \ - duk_push_thread_raw((ctx), DUK_THREAD_NEW_GLOBAL_ENV /*flags*/) - -DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...); - -#if defined(DUK_API_VARIADIC_MACROS) -#define duk_push_error_object(ctx,err_code,...) \ - duk_push_error_object_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__) -#else -DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...); -/* Note: parentheses are required so that the comma expression works in assignments. */ -#define duk_push_error_object \ - (duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \ - duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \ - duk_push_error_object_stash) /* last value is func pointer, arguments follow in parens */ -#endif - -DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap); -#define duk_push_error_object_va(ctx,err_code,fmt,ap) \ - duk_push_error_object_va_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)) - -#define DUK_BUF_FLAG_DYNAMIC (1 << 0) /* internal flag: dynamic buffer */ -#define DUK_BUF_FLAG_EXTERNAL (1 << 1) /* internal flag: external buffer */ -#define DUK_BUF_FLAG_NOZERO (1 << 2) /* internal flag: don't zero allocated buffer */ - -DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags); - -#define duk_push_buffer(ctx,size,dynamic) \ - duk_push_buffer_raw((ctx), (size), (dynamic) ? DUK_BUF_FLAG_DYNAMIC : 0) -#define duk_push_fixed_buffer(ctx,size) \ - duk_push_buffer_raw((ctx), (size), 0 /*flags*/) -#define duk_push_dynamic_buffer(ctx,size) \ - duk_push_buffer_raw((ctx), (size), DUK_BUF_FLAG_DYNAMIC /*flags*/) -#define duk_push_external_buffer(ctx) \ - ((void) duk_push_buffer_raw((ctx), 0, DUK_BUF_FLAG_DYNAMIC | DUK_BUF_FLAG_EXTERNAL)) - -#define DUK_BUFOBJ_ARRAYBUFFER 0 -#define DUK_BUFOBJ_NODEJS_BUFFER 1 -#define DUK_BUFOBJ_DATAVIEW 2 -#define DUK_BUFOBJ_INT8ARRAY 3 -#define DUK_BUFOBJ_UINT8ARRAY 4 -#define DUK_BUFOBJ_UINT8CLAMPEDARRAY 5 -#define DUK_BUFOBJ_INT16ARRAY 6 -#define DUK_BUFOBJ_UINT16ARRAY 7 -#define DUK_BUFOBJ_INT32ARRAY 8 -#define DUK_BUFOBJ_UINT32ARRAY 9 -#define DUK_BUFOBJ_FLOAT32ARRAY 10 -#define DUK_BUFOBJ_FLOAT64ARRAY 11 - -DUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags); - -DUK_EXTERNAL_DECL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr); - -/* - * Pop operations - */ - -DUK_EXTERNAL_DECL void duk_pop(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_pop_n(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_pop_2(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx); - -/* - * Type checks - * - * duk_is_none(), which would indicate whether index it outside of stack, - * is not needed; duk_is_valid_index() gives the same information. - */ - -DUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type); -DUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask); - -DUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx); -#define duk_is_null_or_undefined(ctx, idx) \ - ((duk_get_type_mask((ctx), (idx)) & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) ? 1 : 0) - -DUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx); - -DUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx); - -#define duk_is_callable(ctx,idx) \ - duk_is_function((ctx), (idx)) -DUK_EXTERNAL_DECL duk_bool_t duk_is_constructable(duk_context *ctx, duk_idx_t idx); - -DUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t idx); - -/* Buffers and lightfuncs are not considered primitive because they mimic - * objects and e.g. duk_to_primitive() will coerce them instead of returning - * them as is. Symbols are represented as strings internally. - */ -#define duk_is_primitive(ctx,idx) \ - duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_UNDEFINED | \ - DUK_TYPE_MASK_NULL | \ - DUK_TYPE_MASK_BOOLEAN | \ - DUK_TYPE_MASK_NUMBER | \ - DUK_TYPE_MASK_STRING | \ - DUK_TYPE_MASK_POINTER) - -/* Symbols are object coercible, covered by DUK_TYPE_MASK_STRING. */ -#define duk_is_object_coercible(ctx,idx) \ - duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ - DUK_TYPE_MASK_NUMBER | \ - DUK_TYPE_MASK_STRING | \ - DUK_TYPE_MASK_OBJECT | \ - DUK_TYPE_MASK_BUFFER | \ - DUK_TYPE_MASK_POINTER | \ - DUK_TYPE_MASK_LIGHTFUNC) - -DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx); -#define duk_is_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) != 0) -#define duk_is_eval_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_EVAL_ERROR) -#define duk_is_range_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_RANGE_ERROR) -#define duk_is_reference_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_REFERENCE_ERROR) -#define duk_is_syntax_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_SYNTAX_ERROR) -#define duk_is_type_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_TYPE_ERROR) -#define duk_is_uri_error(ctx,idx) \ - (duk_get_error_code((ctx), (idx)) == DUK_ERR_URI_ERROR) - -/* - * Get operations: no coercion, returns default value for invalid - * indices and invalid value types. - * - * duk_get_undefined() and duk_get_null() would be pointless and - * are not included. - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); -DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx); - -/* - * Get-with-explicit default operations: like get operations but with an - * explicit default value. - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_get_boolean_default(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value); -DUK_EXTERNAL_DECL duk_double_t duk_get_number_default(duk_context *ctx, duk_idx_t idx, duk_double_t def_value); -DUK_EXTERNAL_DECL duk_int_t duk_get_int_default(duk_context *ctx, duk_idx_t idx, duk_int_t def_value); -DUK_EXTERNAL_DECL duk_uint_t duk_get_uint_default(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value); -DUK_EXTERNAL_DECL const char *duk_get_string_default(duk_context *ctx, duk_idx_t idx, const char *def_value); -DUK_EXTERNAL_DECL const char *duk_get_lstring_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len); -DUK_EXTERNAL_DECL void *duk_get_buffer_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len); -DUK_EXTERNAL_DECL void *duk_get_buffer_data_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len); -DUK_EXTERNAL_DECL void *duk_get_pointer_default(duk_context *ctx, duk_idx_t idx, void *def_value); -DUK_EXTERNAL_DECL duk_c_function duk_get_c_function_default(duk_context *ctx, duk_idx_t idx, duk_c_function def_value); -DUK_EXTERNAL_DECL duk_context *duk_get_context_default(duk_context *ctx, duk_idx_t idx, duk_context *def_value); -DUK_EXTERNAL_DECL void *duk_get_heapptr_default(duk_context *ctx, duk_idx_t idx, void *def_value); - -/* - * Opt operations: like require operations but with an explicit default value - * when value is undefined or index is invalid, null and non-matching types - * cause a TypeError. - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_opt_boolean(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value); -DUK_EXTERNAL_DECL duk_double_t duk_opt_number(duk_context *ctx, duk_idx_t idx, duk_double_t def_value); -DUK_EXTERNAL_DECL duk_int_t duk_opt_int(duk_context *ctx, duk_idx_t idx, duk_int_t def_value); -DUK_EXTERNAL_DECL duk_uint_t duk_opt_uint(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value); -DUK_EXTERNAL_DECL const char *duk_opt_string(duk_context *ctx, duk_idx_t idx, const char *def_ptr); -DUK_EXTERNAL_DECL const char *duk_opt_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len); -DUK_EXTERNAL_DECL void *duk_opt_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size); -DUK_EXTERNAL_DECL void *duk_opt_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size); -DUK_EXTERNAL_DECL void *duk_opt_pointer(duk_context *ctx, duk_idx_t idx, void *def_value); -DUK_EXTERNAL_DECL duk_c_function duk_opt_c_function(duk_context *ctx, duk_idx_t idx, duk_c_function def_value); -DUK_EXTERNAL_DECL duk_context *duk_opt_context(duk_context *ctx, duk_idx_t idx, duk_context *def_value); -DUK_EXTERNAL_DECL void *duk_opt_heapptr(duk_context *ctx, duk_idx_t idx, void *def_value); - -/* - * Require operations: no coercion, throw error if index or type - * is incorrect. No defaulting. - */ - -#define duk_require_type_mask(ctx,idx,mask) \ - ((void) duk_check_type_mask((ctx), (idx), (mask) | DUK_TYPE_MASK_THROW)) - -DUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); -DUK_EXTERNAL_DECL void duk_require_object(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); -DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx); -#define duk_require_callable(ctx,idx) \ - duk_require_function((ctx), (idx)) -DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx); - -/* Symbols are object coercible and covered by DUK_TYPE_MASK_STRING. */ -#define duk_require_object_coercible(ctx,idx) \ - ((void) duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \ - DUK_TYPE_MASK_NUMBER | \ - DUK_TYPE_MASK_STRING | \ - DUK_TYPE_MASK_OBJECT | \ - DUK_TYPE_MASK_BUFFER | \ - DUK_TYPE_MASK_POINTER | \ - DUK_TYPE_MASK_LIGHTFUNC | \ - DUK_TYPE_MASK_THROW)) - -/* - * Coercion operations: in-place coercion, return coerced value where - * applicable. If index is invalid, throw error. Some coercions may - * throw an expected error (e.g. from a toString() or valueOf() call) - * or an internal error (e.g. from out of memory). - */ - -DUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); -DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, duk_uint_t flags); -DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint); - -#define DUK_BUF_MODE_FIXED 0 /* internal: request fixed buffer result */ -#define DUK_BUF_MODE_DYNAMIC 1 /* internal: request dynamic buffer result */ -#define DUK_BUF_MODE_DONTCARE 2 /* internal: don't care about fixed/dynamic nature */ - -#define duk_to_buffer(ctx,idx,out_size) \ - duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DONTCARE) -#define duk_to_fixed_buffer(ctx,idx,out_size) \ - duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_FIXED) -#define duk_to_dynamic_buffer(ctx,idx,out_size) \ - duk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DYNAMIC) - -/* safe variants of a few coercion operations */ -DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len); -#define duk_safe_to_string(ctx,idx) \ - duk_safe_to_lstring((ctx), (idx), NULL) - -/* - * Value length - */ - -DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len); -#if 0 -/* duk_require_length()? */ -/* duk_opt_length()? */ -#endif - -/* - * Misc conversion - */ - -DUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx); - -DUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx); - -/* - * Buffer - */ - -DUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size); -DUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size); -DUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len); - -/* - * Property access - * - * The basic function assumes key is on stack. The _string variant takes - * a C string as a property name, while the _index variant takes an array - * index as a property name (e.g. 123 is equivalent to the key "123"). - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_get_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_put_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx); -DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr); - -DUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); -DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags); - -DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); -DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key); -DUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len); - -/* - * Inspection - */ - -DUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level); - -/* - * Object prototype - */ - -DUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx); - -/* - * Object finalizer - */ - -DUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx); - -/* - * Global object - */ - -DUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx); - -/* - * Duktape/C function magic value - */ - -DUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic); -DUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx); - -/* - * Module helpers: put multiple function or constant properties - */ - -DUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs); -DUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers); - -/* - * Object operations - */ - -DUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags); -DUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value); -DUK_EXTERNAL_DECL void duk_seal(duk_context *ctx, duk_idx_t obj_idx); -DUK_EXTERNAL_DECL void duk_freeze(duk_context *ctx, duk_idx_t obj_idx); - -/* - * String manipulation - */ - -DUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count); -DUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata); -DUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata); -DUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset); -DUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx); -DUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset); - -/* - * Ecmascript operators - */ - -DUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); -DUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); -DUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); -DUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2); - -/* - * Function (method) calls - */ - -DUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs); -DUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs); -DUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets); - -/* - * Thread management - */ - -/* There are currently no native functions to yield/resume, due to the internal - * limitations on coroutine handling. These will be added later. - */ - -/* - * Compilation and evaluation - */ - -DUK_EXTERNAL_DECL duk_int_t duk_eval_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags); -DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags); - -/* plain */ -#define duk_eval(ctx) \ - ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME)) - -#define duk_eval_noresult(ctx) \ - ((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_peval(ctx) \ - (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) - -#define duk_peval_noresult(ctx) \ - (duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_compile(ctx,flags) \ - ((void) duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags))) - -#define duk_pcompile(ctx,flags) \ - (duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE)) - -/* string */ -#define duk_eval_string(ctx,src) \ - ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) - -#define duk_eval_string_noresult(ctx,src) \ - ((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_peval_string(ctx,src) \ - (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) - -#define duk_peval_string_noresult(ctx,src) \ - (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_compile_string(ctx,flags,src) \ - ((void) duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) - -#define duk_compile_string_filename(ctx,flags,src) \ - ((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) - -#define duk_pcompile_string(ctx,flags,src) \ - (duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) - -#define duk_pcompile_string_filename(ctx,flags,src) \ - (duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN)) - -/* lstring */ -#define duk_eval_lstring(ctx,buf,len) \ - ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) - -#define duk_eval_lstring_noresult(ctx,buf,len) \ - ((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_peval_lstring(ctx,buf,len) \ - (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME)) - -#define duk_peval_lstring_noresult(ctx,buf,len) \ - (duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME)) - -#define duk_compile_lstring(ctx,flags,buf,len) \ - ((void) duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) - -#define duk_compile_lstring_filename(ctx,flags,buf,len) \ - ((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE)) - -#define duk_pcompile_lstring(ctx,flags,buf,len) \ - (duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME)) - -#define duk_pcompile_lstring_filename(ctx,flags,buf,len) \ - (duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE)) - -/* - * Bytecode load/dump - */ - -DUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx); - -/* - * Debugging - */ - -DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx); - -/* - * Debugger (debug protocol) - */ - -DUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx, - duk_debug_read_function read_cb, - duk_debug_write_function write_cb, - duk_debug_peek_function peek_cb, - duk_debug_read_flush_function read_flush_cb, - duk_debug_write_flush_function write_flush_cb, - duk_debug_request_function request_cb, - duk_debug_detached_function detached_cb, - void *udata); -DUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx); -DUK_EXTERNAL_DECL duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues); -DUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx); - -/* - * Time handling - */ - -DUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx); -DUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t timeval, duk_time_components *comp); -DUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp); - -/* - * Date provider related constants - * - * NOTE: These are "semi public" - you should only use these if you write - * your own platform specific Date provider, see doc/datetime.rst. - */ - -/* Millisecond count constants. */ -#define DUK_DATE_MSEC_SECOND 1000L -#define DUK_DATE_MSEC_MINUTE (60L * 1000L) -#define DUK_DATE_MSEC_HOUR (60L * 60L * 1000L) -#define DUK_DATE_MSEC_DAY (24L * 60L * 60L * 1000L) - -/* Ecmascript date range is 100 million days from Epoch: - * > 100e6 * 24 * 60 * 60 * 1000 // 100M days in millisecs - * 8640000000000000 - * (= 8.64e15) - */ -#define DUK_DATE_MSEC_100M_DAYS (8.64e15) -#define DUK_DATE_MSEC_100M_DAYS_LEEWAY (8.64e15 + 24 * 3600e3) - -/* Ecmascript year range: - * > new Date(100e6 * 24 * 3600e3).toISOString() - * '+275760-09-13T00:00:00.000Z' - * > new Date(-100e6 * 24 * 3600e3).toISOString() - * '-271821-04-20T00:00:00.000Z' - */ -#define DUK_DATE_MIN_ECMA_YEAR (-271821L) -#define DUK_DATE_MAX_ECMA_YEAR 275760L - -/* Part indices for internal breakdowns. Part order from DUK_DATE_IDX_YEAR - * to DUK_DATE_IDX_MILLISECOND matches argument ordering of Ecmascript API - * calls (like Date constructor call). Some functions in duk_bi_date.c - * depend on the specific ordering, so change with care. 16 bits are not - * enough for all parts (year, specifically). - * - * Must be in-sync with genbuiltins.py. - */ -#define DUK_DATE_IDX_YEAR 0 /* year */ -#define DUK_DATE_IDX_MONTH 1 /* month: 0 to 11 */ -#define DUK_DATE_IDX_DAY 2 /* day within month: 0 to 30 */ -#define DUK_DATE_IDX_HOUR 3 -#define DUK_DATE_IDX_MINUTE 4 -#define DUK_DATE_IDX_SECOND 5 -#define DUK_DATE_IDX_MILLISECOND 6 -#define DUK_DATE_IDX_WEEKDAY 7 /* weekday: 0 to 6, 0=sunday, 1=monday, etc */ -#define DUK_DATE_IDX_NUM_PARTS 8 - -/* Internal API call flags, used for various functions in duk_bi_date.c. - * Certain flags are used by only certain functions, but since the flags - * don't overlap, a single flags value can be passed around to multiple - * functions. - * - * The unused top bits of the flags field are also used to pass values - * to helpers (duk__get_part_helper() and duk__set_part_helper()). - * - * Must be in-sync with genbuiltins.py. - */ - -/* NOTE: when writing a Date provider you only need a few specific - * flags from here, the rest are internal. Avoid using anything you - * don't need. - */ - -#define DUK_DATE_FLAG_NAN_TO_ZERO (1 << 0) /* timeval breakdown: internal time value NaN -> zero */ -#define DUK_DATE_FLAG_NAN_TO_RANGE_ERROR (1 << 1) /* timeval breakdown: internal time value NaN -> RangeError (toISOString) */ -#define DUK_DATE_FLAG_ONEBASED (1 << 2) /* timeval breakdown: convert month and day-of-month parts to one-based (default is zero-based) */ -#define DUK_DATE_FLAG_EQUIVYEAR (1 << 3) /* timeval breakdown: replace year with equivalent year in the [1971,2037] range for DST calculations */ -#define DUK_DATE_FLAG_LOCALTIME (1 << 4) /* convert time value to local time */ -#define DUK_DATE_FLAG_SUB1900 (1 << 5) /* getter: subtract 1900 from year when getting year part */ -#define DUK_DATE_FLAG_TOSTRING_DATE (1 << 6) /* include date part in string conversion result */ -#define DUK_DATE_FLAG_TOSTRING_TIME (1 << 7) /* include time part in string conversion result */ -#define DUK_DATE_FLAG_TOSTRING_LOCALE (1 << 8) /* use locale specific formatting if available */ -#define DUK_DATE_FLAG_TIMESETTER (1 << 9) /* setter: call is a time setter (affects hour, min, sec, ms); otherwise date setter (affects year, month, day-in-month) */ -#define DUK_DATE_FLAG_YEAR_FIXUP (1 << 10) /* setter: perform 2-digit year fixup (00...99 -> 1900...1999) */ -#define DUK_DATE_FLAG_SEP_T (1 << 11) /* string conversion: use 'T' instead of ' ' as a separator */ -#define DUK_DATE_FLAG_VALUE_SHIFT 12 /* additional values begin at bit 12 */ - -/* - * ROM pointer compression - */ - -/* Support array for ROM pointer compression. Only declared when ROM - * pointer compression is active. - */ -#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16) -DUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[]; -#endif - -/* - * C++ name mangling - */ - -#if defined(__cplusplus) -/* end 'extern "C"' wrapper */ -} -#endif - -/* - * END PUBLIC API - */ - -#endif /* DUKTAPE_H_INCLUDED */ diff --git a/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.afdesign b/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.afdesign index caa97234bf03a0d298cb134edbf759c70ce43772..c1835901c584644e0699c19d5e95945d28f147d4 100644 GIT binary patch literal 56978 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

(Z91H_+U8RMZwAB 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 literal 42878 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 P3kB(D>Z7V|+CBLn`@92` diff --git a/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.svg b/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.svg index 43ca9106..6220bcf2 100644 --- a/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.svg +++ b/plugins/community/repos/LindenbergResearch/res/AlternateBigKnob.svg @@ -7,14 +7,11 @@ - - + + - - - - - + + diff --git a/plugins/community/repos/LindenbergResearch/res/AlternateMiddleKnob.afdesign b/plugins/community/repos/LindenbergResearch/res/AlternateMiddleKnob.afdesign index 26d1ebf5883308a5e9129fce9c4f5cf7ec6be8a9..bd34c5473c81d745eedce62c15637d9d03ddf8cf 100644 GIT binary patch literal 53685 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

    -0;q*RxN$VM->_HyoUtv;o9Fg*+mY2OHlzmN7>C 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 - + - - + + - - + + diff --git a/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.afdesign b/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.afdesign index 50ad5fad9adb61fde42c79b59370ec3aa50d92fa..84c5aa685c402c5ef0f3c56a17131669cdc979a4 100644 GIT binary patch literal 33861 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 WpQ>QhB!h3eK~JBkDSVeRdG|j!XgsO_ literal 35520 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 diff --git a/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.svg b/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.svg index cfbc2e28..3413815e 100644 --- a/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.svg +++ b/plugins/community/repos/LindenbergResearch/res/AlternateSmallKnob.svg @@ -2,14 +2,14 @@ - - + + - - + + - - + + diff --git a/plugins/community/repos/LindenbergResearch/res/IOPortC.afdesign b/plugins/community/repos/LindenbergResearch/res/IOPortC.afdesign index e870d1a058bcca14cee71445bff2a4bc78afe32e..9a247a4909c13c0133705823af9b7374e4d68661 100644 GIT binary patch literal 33560 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 LnhHg7=1>0*X)TNH literal 38746 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 AYybcN diff --git a/plugins/community/repos/LindenbergResearch/res/IOPortC.svg b/plugins/community/repos/LindenbergResearch/res/IOPortC.svg index 0393045b..1b50a505 100644 --- a/plugins/community/repos/LindenbergResearch/res/IOPortC.svg +++ b/plugins/community/repos/LindenbergResearch/res/IOPortC.svg @@ -3,16 +3,16 @@ - - + + - - + + - - + + - + diff --git a/plugins/community/repos/LindenbergResearch/res/MiddleIncremental.afdesign b/plugins/community/repos/LindenbergResearch/res/MiddleIncremental.afdesign index f6e815b7fce10c5c25d5e12cf09625260f132be2..b65d8414c6e89e19fc153d378dec2210a98717b1 100644 GIT binary patch literal 47149 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 W>nrs2V20ijqN1R2r%=v3`2PS7rtPc% literal 48147 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 y$ - + - - - - - + + + + + - - + + diff --git a/plugins/community/repos/LindenbergResearch/res/ScrewLight.afdesign b/plugins/community/repos/LindenbergResearch/res/ScrewLight.afdesign index 468dde85586b8f2da66c9169da914d4949378f67..492637c870cc5a3d2117ede64a43ac758efda74e 100644 GIT binary patch literal 26652 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 BESCTP literal 25818 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

    ZmQxV#H8*V86?f9>Zt7&H2_cbrF~wVF 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 - + - - - + + - + + + + - + diff --git a/plugins/community/repos/LindenbergResearch/res/Westcoast.afdesign b/plugins/community/repos/LindenbergResearch/res/Westcoast.afdesign index 91baf2536076d049798d76e27125a717b11a17bc..22d2ab231979ea79f0f5c522deaca826f7fc12b1 100644 GIT binary patch literal 458896 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

    #nD&N(3MbDR8f{nDWfeW&xpez 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⪤z84#CYdamL{v5L-L;a{KP+-mv~ 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

    (@kti%Xs@~ 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

    AzWx)E#y$l2+<_RyIfc3-!=bGr-|Wdu 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 MR^@f6v`Nta0DqKfwg3PC literal 457541 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

    uyqlFV`+}qHl3JvYudxVdeEzYs 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⁢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�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%0A7*FEKf>hjwl4RPX8Pl({^q z)UN)DI5NebpqrkNNu7^Yr{<`I{c$!9G~`5;@!*SfVf4+w>QpVcp{bhBwh;XJ-ieA( zR5-b^S=zIE!*uZ7{Ihjy;(9Ircpqe|mHm}m%$zUAT^xR^EP^EN@&Gcv;do+Yj3`u! zm4GCji>;_LM`pMYeP_X;B7r=^FU~Fc$a6Vk+Bf)NOX=k{=@>*@OSWlu_95(qxgUOZ@fZ}d$ zA$L8yNl#h(gRzKi9FbF zo^bqCFY);jiK%Oj3tvxz+l-c~W1-_pvTrhnNWBCY4)~0X+sk645^kzr#T7gv1I}`# z7;O+#GfeHDq!@>-qjw7>W@vP$S4oqMwphMoSM|6L=I!|i!<;KW_6cHs2wl(r#mP5o zXD2Tzp@@rADH|NA4H~7YT;H|%o#o`d$Hg!3;e{Hb)KCgpA>(3PWl+eW>26pStXssC48pe$UH+5L zP;`~n{n&UP1Ny)1i__<28`7ZE&8zUJ-NL4G_e8&b$u*mg_*Pk>f4^rY)8Q@tCmB9e zco&zgV^v94L>`B`g^7~%prk>QL9g1&xl>M-GkRAs;SyD_I!HGga)M3|iHnfrx3e{n*C{<$?Se3%Rw{hWLfMsJlW-eDW|^(WP1 zz2+Vhg@WZ}lYfA7FVn>EA-AeAQBT^LSZpIa!||dLS@>wzjQV&ssG!h6@#PP9Ln$r$P?#6b9Ux{ed&Rv9~h7$R%?)+X+JSIxZSYGxT>q_+CX6{;To42SnS@ZI=c0YpOApgoL0TR$N*c>7prOlWKIrKyT=sFAY~sOF;qiMm zuBeOx?66~f0HoWv@v%db&xfp)==KZFx`1r+ie_x@V^vV{9zJ}VCM$tumbCQEEs zI?Oed)iC$oEU*yLyA}0Gnh}xdQP#xapcVODSw?)V_&8jyNXYUdU-)D>@1A3>py6X< zlM_=|w{mpHCDG(c;dvLlqDTHjHbTc=Iewb)kp8la8{pp`m5Pn`b ze59^}qn;(IY=Gc{XaBA$#3(4#sLEPY_@A&;@tTOGR9G-K>#+$pU&m1xf27%B6i71% z5vd6$y1UMt|ubG)oHNc+xiXiYozZss;#1ySc@%E!@>?=Gs5-oLjFc{RH3G3;Vv zEm6HM=@J)jEWO*)t4cOb1a~Vx_}s9|)+Zz@-|N56r>)2o&NYQU!`RU@+}KYOLh|s# zPgxDW>IJD*W{kt{u{d?An7YG(Z15+b}=eM-sOCfW84(S_z;{{{rL3y?5T%xsgLIsM4OS_&e-G*-cdgxYc#Gdq9Yz99I%n zdXJ_QpHp<2c~lCBf1K%Q3(^e0N#S(^C*NX*lX*2Bx93?bP@A>ocz`S`dzRXu34ghh z2!sB{E%U*3M!ibf_j#&>lvZD1S*U2hGq@X|N%rIJr#4N8f06n*>ACyI*hBQBYyp2I zTd8{Eevz^L1VvfWYsCD_GjufTcpX8pg9Ul3uFE%v{~y>sMONJ_d~=N1%<=s!$?1eK zxtoX3FWzm*k%4%J&{ab6fJZB%dFCysBVz3?B$*zX@PTR+2Y&V|eG(nAQ~OdxC3Z70 zKx+9CDAf4(ks*g?`n(hS!L}9^VU2U7fL+|3yMbhB`i$0?WO~?f|4QAHHA^+L_R52j zP8Y>pql=)Acj-7(2UM_2Ui(a%NHBzu1XiV$rQ~8H;STD6s*38-7UkrRSfqbPtX+J? zI}cI5{_UJT+bH*&-e!1pD`6TxB;(XCDz(Oe`wSC}AQj|1^$+KF9wbwkQyhIA zMnux$&KAbHbOe0;O9^Tx2E5eNIV5+L>jDYw)V>(uP-8O|@=~8EwbmY|VaMRye|W1TgNLiW<^=ozN2dQ; zXtJBPc#Eanw^w!hOD)aHW5aK`8=6#(zG3_XQX!*6`j3`1TFGD!7Lv+hhoGX@g)OS) zPb9*QbBOF7yzm|y7Kcv-JPS3fEi&aczjT1dUT%! zzV)Z8013&D%DstSm(6L9crkUWSHm8*r{^{=y#p0D**lJl_@PE~4mbU&D9KQ68E%rr zVV`;8-0GLM*r;05Z#`Yn8;^wI87bj&d{aCF4W- zM4aeyR%5wXwx7uw4RKPtOrY|npld+a!!B%KTQj-IoD8FtQmleeWldz&no9y*F2ZZ8 z#K4V#EJbtnB-icq?QEEBr-mnHaFU+Z&Y4B!&^wR$!$SVWTR}S7$;K8M7a1|hG+Uoe zo*^?-aM48)C?U$cC`wQQTD0kRP8k{xq%e*9iLa@wnOC;MlUPBaaf{;v3q~r@7%Nn{ zG3u`DFpaOZ1&jnmcS>+9zCg1q=Y*iwFMo5Ch;t4bqGl4TQ9{$XwZq?utt; z4tvZir7hnOYKRn>KJc2|2+#P^`*;ucK&8Xg4;sJU&H0)HkfgjX{&p6B{D{_3UY_-yc$d)I*$J0iW5&CYbyfg!o8|$(-6)NL;Tu0r4~I&a60e>HmYBvf=*X0g=KaisX2@ z6(`YQH5gnQ9->V?O9ywm=4G%g0agL(#H-sD$rN-rX})1EnTL4*@O)t!l;JiyhlvKR z$ZDRj(Yil0H^Xt+=*iDsjJx^4ZLY_>)bwvLgt{?x-BsA#nu7_@DKEh0^dLTnyPfHH zPpM1jn&pR9vf2){JfN)PmI4>2`>Qa5jqE_6TB^P3OckFOwwYzT#bGS;51*}XAWc`E zT|H;{7-~C{0`B(LKhid9W7eA`jRmpCEkhE*8flLHIB%nuGiS8oRnjVE&IE%Z?;E=u z{jv2daHS&^!}P4V3Ll=ZR!^a_mm&D|oxPaga#C2$6@4YY83CL#P#(Zt_I$uWy;v|8 zKYdx62nfnf9j*pR?bSKz<#VXAtk?`t;8ZzTEm^(m!E#k`3(Z&Vlxw!1(fXJ(0FHtb zx#{bhPXi^-Jcm*@5tCwcS>fCl@G0_BPv1R-r_YHPhWC#To_ z{GVi^;R1O6>{8mNfx*_zjip&OR$~d)t!YWsSK6uF49}a&>|ubgQxPF7 zGOqHI7X6KUAd=E?alX-@gD&iSia57NL}$+NZq{H}@_~iWjyMF~;p;=TtK*khhuvfl zEsIBzRbVvnoTr=+Ejy5mtoU_Em%*&l0 zpGg<~^bt4F{%{T}rS+##boaHl0cEuTNzLsctn%iEAT za^^{bbmnMc(klA{DcRjvbLnl*n+YjiCd4IxDbvm%3b2e#!Zm{yB~l*v+$`-FvARO^ z`B8n|Ew)**lqC1;pp27k2}Uh3FcwE|4mkVhCB#o9mTVutgq12}<|(V>1K**@o5kX& zUkp@Rd&L7@W~My+W%yeD=WF7H=VjR;iJw=O1L`^2cxs86O*+(c39yRNubd$8Z=bNy zHbC;Oe^9}CKV&%mob5RxIxm^Scqy{H$JopJwn6`^bE+H(x+|BWl~wn?)CL0P4L2d} z)!93=fV?}3ky;`|=@J-t2RlOx1r>nA2H0Q)v?UVn0|z*wiJxkU2dEw^J^3ynL^gKzjGY$!!uA zjJ2VJVdeF~)0rG##@2Nv3<{^XQS`@HsY|lWj)%+xEO(28?n(=`RKa>fV*c{H_h`zK zKzpA&ud1>4je{QF%KijKlJ>VM2?Y%%}H+o~uok^YVRm?)Fupy#z#Cih0`1kyzIrK~H}Q%M5YG z5|f6)51xFOx~OMqwhe`bM(_ zL>*!cIJb-F9x=jbGCQyiANF5n%?wM0$maieBk-u7Fz#Olj{Z30;hfc{%sC4vWTKL- za$pe$PpP3uva|s>@4Agq3^47Hqewbk{!!Dg@3Cm2p5j9j0luEV&Du>~(Zk(xmcjI9 z9qF`+iJ-j81E@}Y#$Bbup6;1@PmDGcE{?bD5@jWO3G>o%^X)pCRVa<6cnKpKNMF*J zYCO(Puu?OI{i`QPwHr{y@1r|IDua8}=We`e3N@T~f zAfPdnH0;*DameGNhpPOE-Zyr0BiDlWF|46DplC1AxWMN9B$%-A9}u0#qA!Otc<*~S zF8-7Z3gVZ1K3&C5=7#cqa?9z#VH-!36P^y)+#Q2Zk9qgUeYfX7IAccx1mL%;-(-MX zh|8lYL>IkI&qh6ZZ*y;_Z@BC;>!JR8p%@ew5}V7i>XO{q8ZSA5?j3P)8bE{NxO%As z+ELLfh&t>j5Z3_T93gNP?ppv)w$hQ*p*IE19^6fprk)aCn zoMcaLhRAcFAVceX0)`10CqfQQzVe#Z2Z63nR9P6u+D#&rc$zf1RPw!4%$AI=wGFmU zpFzantrCetBbffHOC1WxIIZpLmC80=NJGt+$V0_WccsAhX}}G#W@)(eYE0G)jta%N zFQc1PRR)fq5#WqT7}?)3w^9F2u=$UJ z;y!hM)lXrTFWz?=pX|jc^2(L8DKI7R8#Ht0pT4#$%I_LYT&^jaR1>QmMfZqWL#Dng zgWnJ)8F{#OKJ`pp3g{IdivyJK{6@floT?ZjBcsZD3o&*lw;=bxSK_QtbA><~u_+Z+ zWl79V5Y#4g?#vKeaPdH4Y1ufzC z0_8TO5->En{oCTJKvPJ|^itZOHOm@-FwUc<2gk2l7t{4b=Bay$voWJ~3?DKY6Zu}O z%epFzlBsIW_$tRLD9@Knq5WBC;*wed1)j5lng^!bV)Gl7%Qi3LO=wFC zHmzN!b1p51SWLjllgu=0Ulb|Yd_pdp%WS#y7BEXVfbc0`+D9?43cz3m2FuoOxqB`X z+^k)E`mUGfa+-cJV{5Yw4bIvYnLLjl);EK)!NPsqQmDMfM|qle7~rxHTw(?}OFVTJJ{FC;bn#NN3iILQVRw6%vM zeLC?OP7mAk_Rerv+6}~3I&R8G?c3nM_s%4u^tZAnzqdXN9u2~Q=QmpoJUt==V8G{r ze2=wyI!zjp*JG<^2+*KMVCbl4|J$hS8#*8L>4(J?Mska!OECDJfDwUIb8>_X0aJIz z(+-Y}=0+&ueW>B{lQ}k^Aq4($PkDA(D! zpw_tTZ{)&0nH-J>dnE%>JumY-%c&zLR&NKV%jHQQbEXw_@L0cQZ8Fwy4Fl}*v$0(P zs)_@@bi{3XM$6x?1T5zB%&S?Dx(2s6Bu|PSLm9)2x$&iE$o>c;t(?3%)GfZ<2=1qhUYKWa&=0W`a^NGbi zD+&2r{0B8diYPbK(n8Yr;U6g;4)^%<$OZbE1%FfKM0m_kISWzZWDbGy!SHz>m?<_~ zRAJ9M$vCZ%{q0}0gk#EIPFGz0LzXhCBcnE4++CkDBaj$5v6yKOpAW@z{ahUWm+opk zQDrKM=l%Fi*iP@Y?-QAn;@%27i23$UrCQ!Ehh@&0TR=|3BN~!Xn_{oRTN&B8w|-Xo zSl1C3fIh{U(dY~fE*&zeKDz(HmjZd8v}EK%5{K_*RALW}j69(H5XHOY zaeM%+u8sev_kk*5n#qrTDcE$4C9A3YpDy8PygW@q5MmKIRRW7;@!_D1H)N#PUL`KM ze;s3{gC@{T&Rk$^g)s)XEQlxVd2a10P@|}T<2;ip0h#L`>ehV6MQCv~mG{1^MsBjh zD$f**9`sykQRyvR=IZtKXnMkha>cRDDVUnS z0!F2W>|UHoy?FtLJq@9XnRVKCmjUhX#cHeQp0uunU!(RDy>!YXvr;M5vD1h$+JyD2 zu*CRla(2#T2`aD-T7Nzhw^8Xgb0!(3g&M_}jeZRza~TyS1T*ZCb@6u5z?BJ>$^zwv z3HadNjOYz>lAm?JG1~xXvJOh-d^OCg>{Rki(<0qp-G#f2-UcIS1+4DuVJTud8Hjbj z4Oq)O?4&BYG=&D~9IMc_s;AN%pMwj%mRRyYScBc+I1Z}1W!b@#4qvqWF*#`30#azfPpDfPU@0l(M_Y->#hz zdoq>Nu>%2OEv(u zW;N>nDqO~*8m)p76jh67)+;2zOgs9#c`BT1IyquDFhf` z=mh=IWBj5#Gctl09xW&1zfv&wP8ANdN-)CV(3J2E{Uy*&TEy#+mn?qv@lGEdJQc$Y zsUv*N%j0^@`vLU!&5(Y4+smzS7^HX9WxIb*;&E)iJ)>1rtUhr95!MInp2lN-2QxIB z-8c|VwvU{h0Ni}fTwKP*p776?sJc_NM6bu|YORcrnZUnvP^nTMr&TBd7NGUM2sxiO z`p*iu5koi=#6g7)PZ_c<4M~kj~M1OxlL%vD^Qeo=bb{AL_~_w3KCCGy!Kw z&Xa7?JBBS2smLAuufeS0Z0{R-!l|FFWT7Nd&B-%7p`*y*#%S!HDv+Gzk$6sv^4DfT zCiQp}s7_sa;t*e;5DXXPLiAR|p>aCR^le>m<^_Q) znh}%kO7#>cXNSQ2;^erHcA+}sS4bh%YBxui<{RkRnF<-d#q)Q3oXd5rO%=Ld{>Nz$ zcL~jkQ?hL!(Sh^K5!Q`Ci(ZaI4mt*b;--=tncnLhO$JhjUQra(4eJk&LtWDc-*Ljd z&snab>inD)jq``F=%7S_d3TiQr~SsC5f*XLc5zcdMNC3nR-YcW)ayI+_n`s0okp$v zjP@)5-p%r23Etf9xhv*UjtHf2DzwI49J6c4)m2ZSZru&f9OK-oa@~3)<*}}J@oz$V zXNbTUUY_}mk~Q(Ar`Wkni0t4J=k-I2?g~0Wj2kVIWirK%qh$~TAa(H7JD+V0yNUxV zR1Et@$)CshV>;vFfVU#Xj%{ot4IFcR$0iZyz8jB#lU?5G(cxq#A2_y$}o{J1|4{9O4%CvN&QW1P_*5eLput2^XO$b1T4!*FC&*Ae_b$C&&-Z3L-8v*i{-y|HFHnXJ;}4g+^k`IbO8o>MG`oahBeHRj35-Na}nPmW`Cbp;wB~(`Ba-HV(lH@@P`(C&ym4~PlliXa zAZG!8vTBp<5?bwH07z;(;(4T!$F)i!?|VjyNpW~Aab!-v<1uUbSPGS(o4m;u2M|MD zL^mW0A5NI-)O0ZFHG)l`NFznmf4;db4snUC&FSiA*0^V>COCXo=ekscV6nfm`*xNn zj9k6~te&p7jL8uPUFzS?Mjj%e4!Va+=}Rmn^ia2@+U7=_Y_+rzK*j!x3Qgv_rD{{< z>_I9O7m5$^pIiKD>obG+psJM9a{^np;xrwdH93#N8N1xuOdAhg1cBghL71esraSe) zo(=7dZp{t(Wn>QQNY)4S}GeSWvDD@k0c}8~elnmOyJFEoP zUziTv=qZ;X7AN%{J4D3a)KM1ijQSoe+e6$4y&m7SH_T*|NIZ{~@ot+}3UPV~HZrVL z_ZJ!LtNr1@3a~08ADhFSoFLjr6KZ-rYpR|PNJ1xcPYgy0~AV&2R z@}hP_;d{TEc<<|f741w_8$oFnG$&;yIQ`;#;6ctzeHI1qKz1VDxgT?E_!Pf9Xqsu{ z22c)&jooSL#)hbs?x$C`xIPSIL(#A^bvwQMoPzpV1l{DQ&{b;gF15K%kBcoiQY@@_B^{k>ehmFTZFoN>&V2RvagU0Er$~a zy&kM7C4-Wk{dvNWOSR>TP94BU14(L&C8F1G1~`rZ zTfHvi-MDz9IJ>7L9*@LCA>Xr-yx{&ze0;hD+&nUoVvhdnO%ZXH^aWyvFi|PYD@{~D zl#$lzrLBG;ahAGystQH{Nynd7498rPfT`OHA$t+OZ-~2C$CSUFM=^G3g*&gDz6c7& zYDJ5`e{n#U4gA%#({jFPeKR$bLja1+^83bb`c;7lUA!2(3oj1e82Xu8;Tu#_z(;UN zXF-qKrC;L?gtjWUJ0pZf*3Qnxeu17!kPgr3!}dXcLw@3^M>k!AnP#k>X?3(rH=p@^ z@$n&=6d3Jk3Nl)%m;=H9@Tu&*Jc0N?pv{cV7Gd12aH+ksc2U^Gp^ zM!P~^i=gCLvg!OO4k~@w%kRa~;i&0#s}Nb1T@0oVs`0H8n~SOg+3~zd>#ui41ZO&i zP#@JEoY2+%bOR;x8W+AeOKXcd_3;{du83U0uWMKi(6rdDd;JjJLbf>US=(0g3DnMj z^@~uu(b{)cT!;EZ_xV&uK$DiLcHI!$ZqRs*)<0Ws5W%_}vl;<46sNU5kv|@pOfe-j zU#|}?qEadxBw18W4vgf3b%S+C!mDuz(U}>p|5yOwgL`pOTIM2OPyyh!ffJ7Qadn2- ziz3G>(Yi0Xt5|KX7v)n>LPo831rnD~m5u{>A|ThB>+b3Lg*+hbk^?Mjp2xSFtpFmaDq?V-T=Nn6Gd-?wT z>4WP@lR#}HFzJizKMfKI-k4_HbVf!o@15@9Hin=9x&Eu7zXxR3_t;DsNMY{HrBo|v zsi3?`Sg+?7Hu$n8PUOiMlfmwOd$lJL0QA8NhL7Ev=LCGTcMPyg>Pq!iqMu98Q`iE)Ou?`WZ${4aSIYqJ`#ww= z+Ftn&h(wXqNAC&;VK*VW8m3dcvJ6&-)V=_Ah}_CGy|J)uR;TB^3J#Fw{V+e3zklkQ zJJxSZX_oclM`Jo5K5I~ava??H9rDzr;Dpav8Q?DOENC7@HcSf7lsmaWJr@`2EEc_^ z-+LMiq!o|anfwQ=#wHrgv0OvY&X>P=ItCRDKrkPmGs_n*9EHva`KG8?`B|}y91wA! zo-Pa3>Edh(cngSr9Be~Qvx?{QWS5jqX@dqWV zSJ~*RK;^KQ_xP|i>;{RhFGpA%nGA`jgVnwlmnMhkrq01bxd5b=gooYj`}UnL-8dds z5*`=nM(=qNM*!u+3R(7P2EL`Zm&W~Ji$4zyl=;{b-E+q4gBruMYc5ii<~00|{X0`P z$2fu}f=;FTYkec3O8T)qt;HVU^}RE6Wmous6&0Q2lK|a2|9x}6bU&%NdA;jy*nxlB(@LFrzKn`Jpu#s)hS?z6@xydl=D zpjfs(CS}YKf%BtW0uUIAW!bqcxjs8zApIy~UWEtynT}YQ?o0FsBzJx+|K_hWeg|R^ z=qu(Msi9_HKoaZwr?)BY1CnAXttNviVR#gXu(G!MD&Ge^a67)|%%4O|sWto8)2^X_ zIjc!kK?0^zCwrU<;H_sk-}LYMoQ#Eu03bE^1($B3#K16h7OYE5j*Mv7-JBi^h#$^8 zl5Z4%SgDfVk9$Zw;J=0-YU{hf zljrbC*HH+7Td|o20MdRX-)srJ>hBph^pF-dP<~|8Wu$0NH${DwO`?G!iZ!-Xe@BD~ z6d!vUE2+5j68gu$`{|1B#zi_4uYf33Ea)KjfvQ;eK78jP!0Q%) z+`KAx*hQg~w;Fo4wef@QQXe%4nyrnWq^pFvep!e1uVhTo@r_~zN~~&5?6+x|?`yuj zctgjKWkdjS8uEQ(LDmN+Tr}~EYHz@~Ymy!AZ*7aF?ymgJ+w^!Lx&|(83uFsj?y5ed zrqkNAfwW-D8)C5BV#HMn86QY0AA;keQAW-c=^37)VRr3(MdB&CDX;O**NeEGriVdUl0C0a&v!0B32fU z`eTyCC6sgVjLMs_5V3l7r%R}8!oo1v=s^gc@Z7tBr-FLKco1FY(wAwMKh20P61 zC}f@cOC)STJL;c}mArk7d0w7GlW!U`Q)torQPsPSF* zi@r@*o0xw0#N_zRZlCptz!;Qf{5`Z>O0jHPT`tU-S_cO5Izx%ye3*fG@;KP2^@JT2u$Y|$J`r3xJfyBrNCarU3*wt`?x(I z^nmDqBkPI-rq3$=4Xw2Ic^@mkeC&)y7m*ap^8N}n5l_jVK@Cl$%5b^WTN6pht7GK{ zs8{v;#x0=5=D&ZQLt;OaF<1_gx@^AbyFfO}lf=NNiaF*{V8x86FV_umpngPwDspLj z@NvE_y?XmAVxH9DCQ>}z!h_e|22`wK;opkKy57@?8o3Mr zz)B_s2q{1mRglgxYOozDs9;~YzZD_AL557Bz@qnnkWuT;5nX1Qc(=kwY^7JR!``*~ z*z{r7@KlgQP~BWBt(lKSpimQ}GjsI~c5XreSWbpEuf>3Cyq-o+Ug)KyA)GW3ECdMB z|4ugIqq=WbN|!5z}AOeHPwJxB>PqEF$Vt+Z8NFjN9JC7q`k z>r>cA6%6eG>@I}_pB)fLd-_`RESuo39+g<}x7VplqZi1hSyw1UsD2nbt>nW(LmaRX z&>=`iFsBOKJP;)=XeFSuzTh?UApe44;Mk7PeQzAl%*8ho4Y?1>H;qRZ(?J5^-NTc2M2`<~^8L41bK zSCa%60eT4V!d}tJ#saDrI38@Y#ae5?O}uY&2A9OXL-=u3pLE2+6b}3S!-@&dC8SIp{c6g0g$WQDlvF47F=|R-ak_GrfyML zk8lv3w1aeFFEH6T6J{tuNCIdk!T*6S-?1FJ&_1vahNHG+UQP0#!CA3qfVO;7c{~;= z%sU1iB6s|w%sQdiP{nEydwo_+@*o$z4#@fIHmY6-Y9{JD7_HO<=>y7YD~e&Gq0Z)l zfSCbRkI)~cLSE5CAxj$^pi3y6W=BPPU*S7G!9sg{ifQUl;jr!hxP7}8Y)$iv&rr&< zA~>#U0o241FC?w2z~W9BTFuv6Aya9sW91ut-E88OvXpDuclVRYL!hS~GfrUV3L1@F zN4%<{@m7~^Zb3eaRq#&d-M|tv>;MeT=?}T#nD+sV|77m{n|R_MVbyldB!vTL*uSTI zSSs%$Aw{uZ`zDPvv`Z1A%8%AXj-vvTVIuQbQT)XP>Z`(9tY^qC{{sVMiTNygTkM); zWw1pNoCqGCabdQ@8;ElDc*8=o7(4Ni;i@tr_GvYqYlIZXycr&JVMtKk=5o8fDp}Oq=ySK zxVFympV5ZYP{BI7H43s#YETP$ciJR9Z0$dzS1D*3@jXA4Za^p9)_)&6(HvI5-vM)L znFBlmFu#c$)F4aRqoYIWHVyry-Sv1b*zW~sv3Q;k9rZEGx4pp3L7#P2#aa+_Um;Y8 zD8}WvyYXqe4+=&cbAP2_OL5s?%NRsFeDuv;yq`N|0-2Wbu_UGLdUFlY%|(Z!>zyaASkYyCj|4~zA3n4=ywE^^jt!8{S!1^`K0zCy@g)d?+wxA0xhz- zD|}5D>|ljdG&5>1oj}7nb^6_*G~mV?NzM)<16Wua=>;mEI;%GeTH%6?BR}^tXHC+9 z@(wiHbf&h=2uf%MhLiq}rYix5a(&;Yaw=OyWXZl%#u8=UvM+@SW9)mfL`KLusqADO zL`X=P!Pt#8`<^2EcI?@+@8-}iZ*`@Wy$D<@J^cQVJ0gZXEm zkN?J7lNsBZTjd@DK(f^I==7eNu${J&(d_A5i8QBZmtuyZoxamC&mpn=A2iTvcDkFd zLK0Y3!-=>Jh0anbFDjGTCnK$Gh)Rr`s}%=qt1G8-V=T ze!#Y4g4q!#4RV+vD$H>bZDP0c5c;C8chXO~&vN0}Z)?xN#&ftJYK9noWJqr-R0^4d z^^gJfkF&5dZV4B~97;J#PtoJpzoZ=uPG~(QUuFkxe z{n_-YfgV63AH6pHu6|g6a+V_Kh)yD;<6=+88_xQ02mETuFx9^_)Fy}?#Czi(?9!|* zF}BP;q3Ka2_U+CY5cCh-b%xABQBmx(WPHvOiKX zvnC+Lbk$vdKVLr1ok^piw3&4@p^CN$a9MBc~t@E2_;L1NA3j8Onf^j;+`!65=n{;@3oX2seiy7dXz!4RTcm9%2@zN zk5F|J6$K#xc*^xnp2FlB(2)qZ%&5%|yKWaqR^h~}t|;d}n>$M$G|<2+*Lxb<42Z|w zUsYD$AtdgDAb#fox~D!@2S}|Da?;y7!6I_ZX!y7}@wY&wc((^=gOPQF^5Z-|@D~C4I};?ZiRa*2gv=Thor8obSf92TKZ?aSNoDU6L=85>s=}lRTm44#fS$r7b%I`q?aXU=fpn= zbv5626}YhaffBYB+I#Zk?&Smn|5pj28}RXkbJTkRF^?==l@mW1(?3fBVh&Z!zwny7 zza(9V0fbqK4lbqMqZZd&e#9J0?ARv1Rq*AAoGCFT>Ot7;XaxEztAMw6GP_t$KV%O3=Ps9a2yA`P`C=@ zEC&wWhlH9J>JZV*&bZxo&D}rZSmL6WP97E>E{{RL32XCu7P&6c|GywZ=_Q3k=XGC= zAu2XS3%c12K2qXDpip@byk{q8x258;N7|+iIEw%3fq>QY)yGy4=k8?`w?rE!V`R_z z%5o#jYs|vD^$MZHwQPF-i&@HBhJsi$>^X`Az8m7N2bEo0trBwehEA%T#erew z_^KGK{i&t60_&{fhwsE$+;*KjeqMV)5Xi6D*SBR<1gN1Fa?nB5hW5m>o@ING^UF`B zo~1rM3xZI4aZaEM|;YGGmbe z^2U2-`J@~wkPl`Mn zHxj^v8v~NLNF8H)NPq zw!pawbv9!5oPRErEg0SE2(nMP0x`e-6h7qhMXYN8=?W-ACmxzufA5{wkYM`yi{NXz z^?h#Qu%S8A39bYH4I%n+t8?-fkw?!i9eN-R^!?uOmIFw!CDv52J{jbA<>0Sm0axX)Xy+%PbQ*z>~PGro=>bTeq2s&Uv-HFjxV)7?oE?-f- z^X+y>2v`Wv3xpEM3QWm}h?Rfu2Q^}t8YC|u>>%VthPA=3>4JrvhmHGqD$KVONga$6 zCFG%z{MOG}XVZ<2Hz{W|50|}ou6}#5C`7GmwkOQm@99tWB)u}%x?+Yb#OHw}lrDoY zzF-t?KE4Tz3?HIiH$tF+m#Lztq5<#^L13~Q9NwHt$(Di~*8a_Bc$5E7aZp;EQ+>>; zN@!PwD03VE0pM#%4M&Ee68B)n77n!L1DU!%N06O&{ZKFO#alf@mt)!EBcMWWM{t2j zBe^Lwaqh=#re+E3*FmUoN=VLx925j%bfI)rTj|ET?d_uc&Okt&IJxQ$sR6@~m3s&Y zzN)7kmO%JPt-(Wpg0Iz=5-z0_wGBBM{FOB{+0mkxtura;&J(m}Go}Ia9m}D_2Tyo77 z6#GFz0qNqLXc9$`0QRgH79i>wIXjZ;R*M5ZKC8iPJ#em!9%9Zkpd87Xzyu#dL3u;C znA1J1Q;69&C`KSsRlkP~0x}7dJHG1E>$oLbsf7m+Tj3teHc$`j_TVZejuv2>$RsLD zWdL6&(aw+>hirVU{-uHxg#tq~Mos`;ss#uZR7j6QEJm!q!-Kj#sOn@bglt?qhN#Il zRUTa{OqOn5J9XrS+D%M%TK8<7^)?$T&y&^es z$PsNF3YcXc!=u5v4P8eut3*_0o0w$|1`5E;%MHARJIt4NzmC+hWyyRQjXYked(iDK z7Y@uEiRCZw{x-2e?7rEnp=mEwSs*HrbX@YhqCJDelqtaV90Py&_=&Xvx$FFm2F~G- z^SNx8$GpQb!*qdjK-vDF_T&`yfYp}D4-o6V)EgUvH^Lllt9Rn<4qYzppgPj%)v7Ax zJsI7)kGoE;3)#j_gOOxRab`b*H;Gx=x#fh<#BKxEdp#T#m=;8{)J`eL-5|H5dB zJ}!Db(4{>sN^QE8y}c^`{kuaR(2%rh0ESpS8vYrjsPm;_VFuLU-9x-L4oGt9uB&M9 zeG6{&)#by_WoKPS8VOCHpfrTy8pL&uFJt$+r8#56tz@Rt4*joAG3smWGi${7KS5d9 zkcJ6Wb}K#fy%Br4gB^(Q+uDnpH9EmlP~rsZaC{GO@B$(|=P_nd#z+AIf`~ENRb+QA z^gq3~5|Nuop+Y9}iys;?7B`2Yv$nZyOoUcZQLoW0o@1bEmbX^ZsCF*ha^ou#L6f6f zQ%{S5K6E|OC*_a1D(8i4(M&K)=S0z?oz5zYHR>L(T(=g<-6cc8E2Cen`rzEnT;;bi zIWFx6PH(xVD^bY34iCt^`8*U74#jA$nNRHd*fTcJqfrhXH*fbURq zk*DF=5V4;^(&D+Kc8`V*|8-`5e-S-Kh#n2f+;Z-0xegWkGnPG#!5PX&my}ENABYAbgc9}*0 zc!G+OMuAZ?cD|Msq>WlKbNAjNFJ+u1yq)_l!%j~@8p^kk%-#!+g8$0g+}DgQ@~X_O z7TiN9+z~JOfuu6BvIwl|C50w86x?BQc9!XR?DV|oL%MzUnEYnGvpF=RhJwdcN0|td zlVDU#$`A`{%g$mjT^hT5X7Bps@&RW5`+1Y!>wB}H5U`ZeGUHm*gZx)niC9GB3OnMK zSLaQx7~va5@D{J}N&Ea}6igTqns5c~Uy&#Xih==O?iVn;v`n0}7#;4j6r6b3g(|#z(>Kg8lwaZP z8l}%IxqM}1VE+iO&hvRd>`tiLsJaV7wYX=q z)WE2*BCEQ4yb(dBp_`3U8BvWc6hK>H!g^FcxR_g2`!XctC1_0QP4Y&5F}-qDjMIonFP>Lf=M!RW%2Cn7LKM$$uKfXZ{#dKNS0!L59G_3M!jb}*3l~cC6)yJDyZ^Lo zzY#|_SO2xKx?33fX@A=2RZ)NIyXOTQNlrH|lpM2x7D}!mkQvE3D(C#t68DR>pQ>{U zw{di({l3zjM~kNdy&~@$EmtXe8e48+8!xiCSR{bbtvaX4Z1aS_U!H&|24L{qdC-a0 ze$DXBTEZ)6@FQqT-u}#Q>q|y$OC2+P`{J`6N83NFa@oWZLG?tn+ADA@4oK}#&qP-v zjvh3sq;zZ!>BMldh9}fe#9S;lQFz#E?irFzL%6}1P!wB~gUTH=__Eq$?)MB#Oluy) z^omS0{+BnMOl=Q(8|v>mT7e683I440hP4}LAF8ST<`W-eb}$uG^d+miAn0Gko`Z6mnS(y-L9xiUmu5iR#6T!|U6K zd(qy*jaqMMtlvKolTn&ro-c5+c8(uxtRivE8%=!NMav0IGU?z=Z28|H#f?{7RG^O* z#wG|xDOTQa0P|@;CoNu3d{3h21L`){yytU}3T05*b2}eu?@>zxYG%=D*Jk9P4nQYS z=}F!%-yUhmHK4{wOw$DL(>#5%D==I9QO};mr?6i^-!(5%C`EwYq_68kN#Zc4qN6(M zk8|DvJb2G1PwpLE^Si0z|3^0e&g7?9g9;`YxyecBRpnN5#fURW&|%R(opknOnD+Ci=}Z72p& z#(lMhaNA^^Xd6&BFn1|ypR`-;Nw3=drFpK~J6Q$FZ?fa_L7M~8zMF1D;nAP#WyimT zhOhrKT-!;4dl%J}qTAeQ&@lGsiNLX867z8Ki(eMwKoDCn7|7J~O=oh)+c9z~Y#eY% z)}WzLn$@6LaX3*4Og{0~FmwxGPXtY`wVg(8@4-1JaVMrQclW#0oPVpso}s`qm+&hi z;&8k5SE__cT=Awi88xHV0~==w!-QbRn@mjHoVNV=(VS~_ zd{Ap?TbK``bQ+JRkwooL+A8rFRI4YMpE4EY9F3vRJ$&u^mU{0f{O8E^KTq@5 zOG=63ap$c>nccbryQQ(m(Kd;cau*$DVcgOn2CA^TcV(08yaJ6#!G}}cEQfQ5lcU>x|BmTEKJp8acEPyamDbXl};ojqr2HuB#GPiZUW zE~%crY0;-kZ!GX^d=}KxzYKn91@W-@W&5z*5w6{TIY$w_G=HQh=vT?dJpca0H>Bz+ zr;bHH+x_m?986fG7fuA!DqVGaE;wwkd^9WqDa!Pb44`nLKzVU{O(Ia^5`N9X>-O#U ze=KvW;`oF&61Cq_0A#=V)auTo)j)M=xm%P?vrje&!#*=OSck(pAxJ_wL|MIB`5i4y z*!B%&Wp18}tmm#?)l;0NUX8vS8XX<-$T|f2t4rdB6>V6MGV~Yi)vH(S!9Sfi6-78j zlz%I&`=RQV(+rmnQunF{j|SJ%XWYF=*#;NPmd)IHRz3{-^i2E_k9%l{wVi6BOPFoQ ziHe2|G^Tecov+Q5$;+NIuoDsUf95^By{BMt*@5uqAdeQm5wFUwvFPcErc zx;f%)(g^Lw)IpF%A*14QV1LPOaOzdtXXiUvup&p+r|&Oejjj*qN?!Hk^n7jpJFg^} zmyW5Sw9uBZ>eyG`}p1ei`{ggW8Y58v>^c)ZQDGP}_U8I-jp9~il z*W0N#w5Uz&`}xTyNHw z%OyO?KCfW=9r;lt59#;x_LAGAIWmis?0Hve4EYTPX`1jJQ!}YkY+4p`O357aTXsgx zCduE6gwN^s)S4kpITAQZXyAy{T~#*PM;{mOI{L~c8F2Sf`bB7}?x~RxesxxSe)l^K z!JWFd4!`qdzar3atbjYRF#z?hUC9HLhdI6@xf~2Q_U1@wrAI*= zxY$Bp(nsQJ_X2FK&*yf}Po?&FQ#Lc7he@B%{Wh7Xz{nP!&ysQPI^5v-B;)?@$`;Nf zO{yiili4#yU3^z_6^ySS-!Shqt)(mlH%s zn?W(ofgQnoYTd%etCv7!>w{sqNkW&^MyE027(C0@VqacknSVbT^YxN2hk?GsyadNB znh%L`Q&^|TkSDHXZ&{fdSOurxf;}O8$v=BZ;FWVJnj?{X5f?niG% z+?p)@#+`($Jxt-T3=|=ESG~5NU;W&ui`*qIX#3yWJye-=>X#Qq{;U76b6R&A6CS5a zF!$H!Ngr!Z+#MUEGU#<&uk(EB7gFo7AIy6BSN>?8(i+>qFk$M8oUC*8PLRUMvUAPi zfSJ4a*zcTL=kK2sWS5=)xasyVd+)IQw!YuvJ@}_vuIN|S;trRYbgBPg+rX(ysv1SI zTrXkpxX)eh^`P&w!=_*9r(Jft{uakyjML1npW37Ao}RL>N&2r=>z$^x5aibe9TV$r z8pnHn5VbgzeTpMY3z=Sw*sr@}>ehped25wSu%iAHM5r6}qpBqg{6$qx5dJ&KWU5)K z-P2-TOBr5w2mh42bv%_qdud{w@ZW`&o}@dt$AcTR7YD?>y<6V)oogh#@^1Kj6vk+B zRLICyCGgX^FK2^lP@C;GiouJ(GIVk9N5z6!39j?Ph5cZ5@M?}l;ki?V3ry~R301#j zPoreN=y-jq{bk%>el+RY^SoT!>%ZDP)t&mzf_3rD`vsm-o+oepGes-ipPq!Mu2t@J zznaX89CK`t`YDZ&^55P5UHtOb%$}9TL1$g?{juWZwYhq6#*@pTqkl*T_Uoe(Nj`ZP zz-jmoZB9)@wJ(P$&&4uOTiZTQe31Vv;N51pD+6sbA;x8vPe93n@r}vTwWLIj`Y`Dv zbSI6;vvySR+nvQ>jOV)Xvd{1FS0`HjmzIS;p~khuCx&v?zNCroEE>wccofBa@yd%x zsl$ha;W|M>0XU9sQvn7BN@4AHA76bC*eWxQ&HpSj>*1#f_!iJ zUL~8^?gxTbzy`~y3t@`<;k5N{@-E{>bAr6kogVS36~gKHE&P`v%x@{bsOtl2dy$%r zxm)HVy6>tw?)oO{`8zM%8rHv;kxj~PuqPQ|VifdU%Y~X0HgsPQROPa=i4hBY1Bfn1t(eGd(??N}ekLc!dCc`yE?&#ck*#nh*yiopW-|cm0%nL3G#QY@0fs7@eAhgCC2$8z0&* znr9l6`|*Gl{0$%ae7nlE@HzGoE&MAf%&FVNd6nGNeBd3O!+DHYiVlI#oQ1g2Hniz& z`ozPbD~n%vC2(j8er4Whi!ZG1UZZB8a=@`O=J4+lt#+B{} zODNnU*#Z%lz_07^}7gYs5t%qcJ;N%Y%{Tz2`niGk+i` zp2+QUT48bsPY4s8Qtm1>YWpQ0hF*<#eR`@aXZcjcwZuJ6Diz-L{ZAZ(WXA?cJw z!q2YGsjTY!616n+uoeeV+}}IO)?-beg~IdPbm0>Esu zCLcO3qBH|ViIDHW%cD{D_w=~0`yFrwxFWIVF|gFXPlcSl5*f|jPmJqM+3Gpiq+9!*Bm$ky z4Th}1N8YH#`XXjLa~OuG=cU+NzkU#CMkeEKXj$0mUcBpL2^q3=_9>0(k8?IRsI7&0 zKP|0!&nM6Ad47~+fQ($TrB}1O$-01}WaL3tjEg2!Uw1jDfsrAjTPm}1@A8A*gIwMf z%bAQ2R|BDIo%V0QM&$D2ajFpGgI@Ec(}&G#rPt&uqzxoF4ik z!f>Nn|K_|KA*F&%2EipF%9W3+zc^VMY;D!W%=iujv2<#CH<(0CC}DaEY|IVEwRVWn#gT5m#wKjB&JWqhm;oU%`XK`BT6a|S8l88ENrzPM+3*khs zHSgfdme+9%0q@h9g9!Uw4ZsJ=W-hQF;B=ZyM%QkBNYkJ?*}L(efh;g9Jd8}#GBEkO zW{Ujxl|b9eup7sgbO2C}swMf&#UiFcqXKNI-BX%0iQm^j z`{5|8VxAK6%vr5D!-eR{7~+#{Ro)BVT4IbE(uSN);nVNP%(5nDlPAjjDhNwmLu>Ln zdaxMab6|PCA#{QxtUg~!^9tE!$As2)h0itnwRZbxW7RjqwdUN1sU0J|bE*Yf8LnSO zGM5(7#&-KB#RX zGhe+*{6bDT!OR_}oX?6XS&Ax2jz+2CyUZI`td9$?z{{Lu zt$Fk5I$8F`)V-%4fBT8gWA}RX{EaQtyXYIm)3f6ulHzAhrB#J!Rny%=CZe~awt^P0+n)|V&iOU zT>t6~x0J?sR-3#Z>i6g=ln*|^+yquWhp|Z!L}4J`{cd1si$PMFZasSzSdmXn+lpgj zYTWBh^jL@CXnt&GUCwvc^YwG@nGZBIEbx+v_j|bt8?r8yf2wQc+7fw(530RrEIB^L ze->mBrB!CO-CX8pCmK20zSI0WGTN&MRTv;_+el8c(CT2@Nj&3llA&y!VNE@SIt!L zGVH&tx7VapW3?q{1VY<$f=|vbQoWe1t`JJzacPZd#FHojpd{%|=O!9zaE|ExCpPkM zy$R-tUXX#qC33m2*zuV{W&@wR_?UIoV3N0HDdA#?01zhiEe$SRd{d7e(A)+GxN^>GlM2xZq`GK^1|fRE^; zZf_>*lk>br^bEMIqVz8*F0`1T#0vrX%s*tspG*F1CDB`MkgHnrYvxlgpZFCf9Ds1_ z8f7*LxMNTP9!W&U!P$d|pGfeVe#i)^q!8fZe5uN-nEO=uUUGR|>rQjwhF7W#SQew& z7M=ix>KP(DT=dimK(?Tt$fEhiRwb{MegFh;#|9C2F)}FjGr&w=VrIjHiK@~;AS{M> z%Bm8Dqf_HaSHRAZ$#(_?jTS#&IrD+o62maE@hQ(R=vF=xEm)}5HlqcmVynv#SBBjJ zm&0>h)6rh2@VJpfp_le_zwxbWc|C|p=d7}4T(}q|ZW%2Hz4)l1WTPUf6^-eQ70!2* z31fOgw$*<@Qk&JhZgZc`jCpXi3nTXMD#D(8cUZPm0rJ^k z?)&fS__1;Q|3P36!F<#jq zwg&%bY_soN?;L6K_`zeyAm>Ii;LB|&kGlS5;UAi~bd)C6C{YbD^?u*%e&v4V4ZE#G zTeF}~%;@KAiV;44iorJjzzpiO{PyFW_m1V3X70Jsn?`l#NE@~OCV_Y582162b8v~< zKnqY#Fs|1|CH1|XGSNX61(*t~he5CsVPBx*`ekc+r--hJF>;=cG^L|wiI%O^4`mxP@hos_&UZ+oOptTXe?_3RlLo(^7pAv9-;vV^mopqYf_Oz6 zAiajpb9Bw80I@LBK62j^LHMK4#0$0{`c|Hhq{YGpZWQcy6C&Su#TOKEwsZ_W+~T@4 zJ1Jlr$ei;a|7Cb|=BdoN)~~)jbzHp0hgS<@xsJcJ`_4Zs^E&R>O4Kar$ymxM{vGX{>jE6*wFr6M}}f)vm6G=rZ(ce_$M0M znAz;-q(wb_&obXMT`h3evNy!UHj|6+?)_Z}z$!QlPf*;On3 z!xgT@|Kx?ClmRl+Kb)a_Y6p03u$XA@9?`~}vB%N8Et`{~;8XfpH8QOFSp7m1P(VI#4IVJ)A*%K-#je@S z_SXZw$%#N`wW*J~-bvjBmb_S~gezJtAchBv1I(iVT@wys9BQAcA$o)clX069CuspX zDI$R!zBXJ3U!jE__Gg$+$N0tyW=QBfP%_SIMs+4niiz(&0)b1_*!hPY(^;~mpH9*n zk){t`yTe&Gm(m}6x94?irWFg}-E2osoDKdabik!2u5ZtXY^l;%$A%^tQw}UR)1z}F z1iAsjaJiXD8#CdHM3Chi-V4P%AO(AYhcKEcx1v9ACin|tu|iRw*Ioc+d-3#nla1er zq`>=s&?$8)MNaUNG=fyC;YmmrEM>bimOYW94gE5)IKBb;pcYNz78Bu%V7x&hSB{oE zT#vymuz2lGBsM*ot8FF^27VWEi7Ti!$iXBa3VegI^3NgzezSD z)~$VgJ-NM>;ymE(*FxR6Y|Mgybamgg`#RjDCWLsSVmB?NKq|^NNqZ!s;7T^&b@#yS zPbY7o}R zP%O{aIb#JtTc10`3{!#_g^`LDK3GeWyZG#y#_lurp{c+uTA6b%guf8nt@MpHM>59D zHoO^?`OR*B%`=I?q|A@=7`UeTOhiQ>DHH8hoEcm%FkK2wqqqHXjN_L<1g6&6yV zo<`lI_0vu#qNRN^t4I)CM;XG;ERBlV`uHZW*D?rbJ+rsMuB^y2pWW#8D%%V9L#_?A-ZS(-*T0qNg!@u1`ZPW0Dk-Ba=(|p+d5xMO{1me#$Yw?N=pW9grP5= zhY~GZVm_)%bX^kY0KM@B9)_cRR?UvG)T};gX>Xd7Ec6XzT207Lx#0@D`>R)AvDj7D zc74fa*WUS7tNcFHv_#Eu3<=#~PE7o}EeHOA&`c1wAkZ}4wcNMT#YO~%xLjSr`;~)0 zAY4L0jPJoIS!bRsk!uH_oo3N4aC27iYs9>ssZHRi_9rMw#)17iZ!pyVFZ2J?&zSI! zgBdDTJWv#S*6kCDPo7|dHl=|qv8_6xP6&dd4kv~Y9|ioPqDb3Ngg3J*FA6vHS2F6D zd11hqU2VUFPXIF4MQ0!ZG&TcM#e84Sa?V6f2zzM6C0gPyG!ls~aJnNQI#I(?04sgZ zO|yT)P`*3qOYyUEFvjUs0iyJ#;LMiIuFspAqM~i&dtd%063lJ~GsE5eapA!~;>eGf z^)NMNK$wrk-9EZr_)LUidAzHVo5h2wM1HRsWv;W_pHGBxMgkKGo!MvN-d}ap568#B zXSWIA{No>^(Fty_W5<0o)N!5=P_{j}_{L^OsX6z`jiw}iL!aH*tPU@&rQBGA0;(|k5Ej>F#p+Kg; z%x%0dETk?7!M{#aSgfcHf)*$uTfOh-^1W|jeMdA4ky_w+a7BIMB7@Vd#Qps^sIrDW zh;E&!z6U;Js+!5uF8|A91o)*bkR;nNxo%`^B~C;*+pp9Rr?MLD5O2VWZmLn{-Ny!k zRgKOLjrODHSsbDG%5GrG9JOUw^(w(C1R=%y$)>Lk$DCq*CQ9NzR!hw`3MCe6f+cd& zn+uJN=i{zrxc}K%+3LUUC#(D%VVOP@Is3vm+P9*PsTuaTXi=*~HPG$ULf_L|V^go1 z?CW^{hnbHdkp8l%lVj8MIjNI6-uiOh%_NxVrtzYs7E!YC*u9_cG)+(R5pJ^WH6pUL zw}~(U&}1)WnECEMjGb`4Uhqn@Nn*8Nogx?Sbmx!AWo>VoBKjqF}(s5t*o?D-TQ(jAc6q~ z)EF*Nz#0ea1fqmFb;=l({fo*&Q{a0;3jb*^*@i_v@8q;*jw4V;sRVs&beTvgcI-tc+a7gPw1J- z;6C_tw!?!WO7=HNLL_P1x8?pEI}1uffdSav+{aI{tm}5Ot3a zWk%^TnBXY>v4(4qEcRvJbQ0!5>$!TEQ|+cbkZs`p{#$JK~ZgWB$xa+Gi_XcjRU zwjPzxjuHY30{!Liyt{dut$NS~xUKH9F5mXA;OPTEH2}SPd=55NqzL{DFmKU7{N~i@ z>D?$Xz{0uL)(xvB4?u-M{|cfuM?!vOTVSBNtL}4sF3=#Oo?8UY7`2`}02vUH1nH)j z6PHZlMY7=0GQ2yn+Hgj|s=4y2XGXapVr!ZIN``+;pq0z`KrRNTj;=nxC~MuW(PN;D z7XRSBT}j&W8&w&k*bb7G*(0I0-Q2N$>BH-SOs(dEdQ;$W~q5M8E|S@3@5#I=)naK=cf?eIQH*v{V}s}bLRhP?y?@G zP6c8_lPugnx_$89tD2ACGx=34c$l44^Q&i=iPA^_TBj~_pyY2?^b4E2(0%Q%xsG+R zJHBS}8OjxTMKXVP?(##e1o3`MocXM;}k~pq%ROCsv5{rWJ(Zy~kcBl`PoyMk>=HHVk}@ zqq2c5UKDFW%-K;{QG^tB^sw6ad0i6#8GU`;7d--bFUieydzfaC+U?HczB*jAQNkK}7IpeesZ;l@GV!*>rmyzHQeEIon6HqDw6=^YN?K zd5V^tudfDpsM*#1#qr0tM0h!ZTgKNMnh60{XB(o|CMyoZYQj_yQ_8F-MgBEe%=Uq5 zZ7WXeNy~z)27UDF(X0bc$rrtf5gY2u>HOCO3`q}`YF!B+x`$!1SEDb&>Cf`qt85X@ z|J`MMbt3XE0nk^;O*tdS1q}#FG?49~sNo|kQvf-{K4>M0Uq89*7D>9W^eV6)xanUB z-ce>iyb`|nY%MqjmVzvp-IQlCrFr*TO7^?qJ<9Zr%ePGL1q#!ug`!vg;~$eEe4{d< z#kX(|e~@m<)lQ}8?A{r@wiU+BGHO}|u`vEm=mP&tM9?Qtb){dXZ5ya74Qx2?i%6e_ zX?8=$u3^chmCmqy@a)sNv|&n67dW}FP+hqb2ebwekXK4Nwpz*HfNJ{Cx?4%hYgZu& z6jBqG*{1muT4kF7NWpET%r|J3H)m>nh6n{dKmBR`f;^}=1iq_JiQrpzQI;e?fBO<} zJ~8dATTKjE9jcchBcw$6p@Tp zd4A=G44?4k3)LevvhWH!+7P!@o1Mc+j1Z6lO-B`aNjLU(AQtpfq;8tYl2LFVvOPY!V4zwr1Q$Eel^hC?=;&yIbe!l;I-zVI~x7Xxx&fg=;ul$vVqfFBk zYFt?ESXlHdn`Uau^$|v+E)i^dZl>_x=;hzxJoVZU=o$B4Pq^fEfH~TrD)4vSdmh>A zSKu@CynJ%6g>bO(-%t{v4|On8Z*V}!^Ovb`+sA+(3Y7cStuKl89l8$>V<%B3(xW~n zMT;ZP{9pyso@H^ALe)Y$C|5_+J&|U`dnDwA?8~*1u|j-72y)?b*{$ZYZO+833&@y@ z3H33RDiJ*xEZsHZBny|?r|J@cr~FOMz10AU zzG6#qT+RczqwQxxG%VIv)k%-r76PzGv_WE7F^0jV+5}(Jl2XSxF3a9Ws@(ki6bu@M zzT8)6l{fsxntr!R^?z06sgI9qjC{bU>rWZ#a82U_2B~SKm#O|Tll#k19T_?1M;8VW z+{_>5UeTiSdKu^PfF4efWZ&>Z{?NPSC2Syrmm{YWBm~p#C}HV%o_r;uyWZpwNWw@+ z5L4N?l#XOD*-A5_Gl35Uxb=*vV1TLy9FmzA7wpEtOW;e~K$S_#*!ywy=_%;`eb-Db zxei-15BllQnB=53Bz51NdvVChX9u0scX}rzdg;TJ8(wWs3y&A3Bnl2(&HCv`)uo(G zOMr(PsYMI>u_ij(B;y)1X!nVt- z|M3GHUtYnd(hUqTl)x*Jd^A1Wy3oX;hq)VrzO_CvM1qKOD4zIEmgq~A>A}0R2-o?= zr938})G7k=$Jg>-D=c=>*IeiR;=WiLdM8zY?&%4_&3~%C0xg)hRZ%yf}xN}TWH80G`s!+4Cr}em!Fx+JX&z2!|-=x)PRIX zS6+>fa{=9oTjkv3=h8n?Mp~+&`pdoHHYe(Z6rkEFVsw(qm2fudK7%mp-n1>@)o|ws>+wn4!(p2c6?KY;VLalPcYNiQf8+zRw$$PHCs` zEe9l*Rd43$&b13SlYwygaSPe}0g5^RR5QOFCI^>rW9N7GNo5x-FQk9p_=%;jtV(yu zEIPUP^4F0JS~t4uhERZ~gI}tPgu8-tv;ZybqvvHS<3MYMG70TL&RzN+{fW^O9fzEM z1ZjGg7&G%j#X1jqV%RjPW*8rP8CqUO4sR{sUQ^V&Yr5&U9;Q;wX`5bob~)Tdl3G{W zr`d5RjQ7?AHDawd&q>df&f;>8lhyg6VWkaF|J!N3ftIuGyvBg5JeFnm3QjG$;+Q(o zIW69L7vYIhr1_z3Pg%>xEzS5N^0BH&xsEu)PihK8 z%8qD)aHEhq#k0$xQV5s3Aoi1q-Xr=^H4wToChtE?xGw#Rmb=2>A6VV}C)&f*vqhr8 zCP5Y*jyhnShx`(T}# zyHK+5plgvqG97+Xw(C&aCckPl6eOJqJ4Iq-BHN`_b9Zls&oya^$vmRL-tv5*s)3mL zPwjruZGRi=gzx-KAm*jo_yArnTNWa0yaZG=P~!$KdaX9{Qn4HoTL6BucahZdsO0=# zBBKMI|6(DZD464zVKxNs+9-s+7O0uYU+{eqaxNJLJN{40%J#WfVNbxPEi@_ew<4(5 zD8{ePE=+L172tbx7CR@>IH4Y$Nu0W8j!;HKbo!rDyr}68mOQs z2-4j#ba#k=G$;dzgp@Q&iPZ1|>Fy3GfuWlrm2MQIOIk_upZeR?MDpcW`zYFT5`n`xQx zUaCrd1RlVnYtrAHX>Tauj7@JyQDaG*@38+k(qq6FN>EV<*2pD>!-|4^tvtGa-y8Jle|^;`(+jZC{6h#pBE{Q^ z^$fm4HTL@5h^Ab#!8ZHhxo;8SF^5xaL=%4(2O2hl6QnBEE(-WV=07~9-(Gm!X@=*4Pq`;|k^a_~}Jy)_y1kaFNPXpId?=7!YS4(m9onyL~3t;1hR$)d6X zATLL`{|4bdxGt*3ZN_;mQVqmr!9X#>~tS8JuwYzI#@7-?FNNA>1_h1jj5;s zmG;kYlfa&M1CH0i87F7aZ+fdaDCnRUW0MBy#7wq7i@zm&&31!wBW!k5!K%x+#M%(H2PpUWHCPk_6X!DQaq^kfBPppf#U8TeENB`wVUsb#Q^eDR z4N{HVMJ0EeXOukZf)_DEJ-g)!-iPrt69*-KtE#WYC5wzm49qHeC~`DTA~~afwoEd~ zlBiJKvA;JB#LcF8)4_2T#vtYs0F446CwjJ)`Pt{bBCWyF*Qb7Y*os+rT)b;jo zG*(<4rdX=@(M~y8VHUpmen@C?fUajM>_CBgCE&`{khG?wa3`KeZ#FmjmqiS@XElA* zVau&n`={zE&kaBg6^6(Fo{l6h!!|u{YHjwhPlF45xW``$O zcc-sDhSI(`=WaK(U5d3nBY?1DZvh>8jTsk-{iJIU?gEJJ%Wc@^mFS?cn{1I&C9OrQ z*K%|))@=qA(=SH&)CozVV{%MX0s2D&Nsq+0d0&v4VfN-fyyAMP$9DH8Mn_&s9{1aM zj10cdR-(~t8Ej_DM3hpYn<5O&Gvu^A@rdU|Hax{nySI(u_juiFY?48v$RW4Oj8N$d zh)JNKCzbuSBK;4IXng_J(^N*F==BKYoxSqD7QdfRuJ)$47+$kZwyu#V4i7FUDS<%8 z3N{DNX+ZNkWk}fDGP0q$YeAlw_5(Ky?bvx(NX+5J&xn1U@wtrQ_fjf4=RKiaa}O4} zsqPk8v@Y@+?NTgv?z9SafR`NL({5KYalIR8Nl-$8u;#=YgHtI@iu1c44p>@t%CJ?q zK6`DO_jkMJe1!NW*yIGc)|j9jC;APQ8%dGVxdoI?Kw+->!@-Dfh8aCylTd9u827Rk zO<6L8?{mJG9Nvj|ULH=XKy>vrV?W@gb*22ipUq#K71qxm?3ESXn8nP!#3O8Jy0z#< z4=-|>`PjL26|QGbd<(XDglIR#7YsDR{9=Pyw2WD4zAXSou*hSlL3nRKLbOO|#G~`5 zJ@{Gug7(ii#AWeCOEXrj*6`l|ZhUacTyKi|8i0f`iQzV>4-d8xiTk`-;pHl@W4&k$ z$70@;#M44F$D!9=*p$$JmA^0d7xXlOpoGGIsHl7IT{IAKmYs{3il;H15>p=yyUTP{ zjPM zo~5Wt_7nhJFreRvoc$9;B@Y8>cjlXAV2|j|5jQiU>z+a|-3Nj7%V-eS$Z`cEnp};5yayyd zo>Lj($$5(eAYO^vx!^Lc$Tc_i%QKJm4bLQd=$3Cda3ScQWc)M4VJ48?_7I1JD@ihy zJ0dmiW}*3?8wzLVvI4<0%o1vLGRhKv)j*qg5peq4jO+rrXo^Sn5TYPcWi30BR;>+! z!zyOKZQs{`$3 zlcdE~EXz{hiX02NUH^%H5(ty9Wpw09gV?gW-U0PAXs0gzNm3R1WuorEDV#}4{Nen) zX`gv`o6zK;ClF?pML(R0o!plM`Zb`7lDcR1k|P9YD$t%e6xl(YU7j%qT47OBXk_3& zp{*krEh-VN`w=TYorETZC3W17yqZH#V>0~xA0nS&lPak<3=jU8ZsLCGt>3#5Z5X%~ z(Bm^L>>%{Cbr0tUV-o7M1L}bORkOCkr~yf9)NLcb0~sZs`?K{%R^%9yt|!hPQKbza z9l&)DjsGGg+j)GC3lvFC{L%vzLWsgmmkt=D{i}wv>6z)M94IiMK)ftl;)5;8f?5=s zj5UTS0qaum0T*LcZQ>m;QSTUmFrB+35%3`2!{6&A7FieW6T`_%%TD_7?q(YhLoBM( zyOb)kFFBaU zNi1VGM*0zq5p5+7yvh-Dtgl+!)<1Wcj7g-0q9k3?;zjBkG^wCNz) zi3ItTCprvo#9^1hCKj4ZI(Ex~b!~%bXf;yiO1iPQrvwSq|GrgNU)ZZBz6Nz2WD+;O zTCG~`qd>+59UU#V^TMhr4j@ng5ePXD@0xZQjgCdA{+h2}eqvZ7EN5b?U%^nFZ~w&t z`$}G;o$&a1+IU~EL-PAxpfNf+7cK6b{a-dP*DgzE*S`K5YXV0zNU{qPZhghY_<8EG zOJ^Zuyj?u^;gOJFO@kBN2nNb(sQd9RWC|!xP}rH(UL9iKkg)5dHmi zFM}nw+B_1?169R)C5-)S$cFld7HN}@`YwvR(BD(!@mzItgYvpbSYpQn6Z@eA63GcC z4cFUK6+nb27V7sOJeMrL&of?1sN=7*x%>Ek9p+*7mNzADT|ioZnyML>*v01e&~M)4 zHf5|RCmdbt4->5qBFJ=5XeHScZ-eE*A6AGY$8^*`23LvF2OSJRs6Ms^$w63K zr-yj5H)R9eOY??L9?A?BE=^w#uvHpD%Gx1d;^8%QN7OuI$LDDc3KO8iD)O9ZsYokt z)dRB@6kRt(S2sw}7O}G7)%k_S_^SA8E$GIZo`V{W>nrX#-{IE2Zl}Svs>Ak0&Idtp z2(^>qVqPZ|&K6(uYeJ{f{qROShUD+bf7!#u{>n)@NcD(Oy6f*+88p;+FJVAu{p#w# z3|sX8-IA@K>ClR|2TfUGeW18WRsyla?H^g{dPNaN*EEGW0lvilyY2=5 zs+E@+&=Hl4Sd&y{RXR0S=o=U{G>hx*C8ul$u95A+iGje|yxj_~=8aGqFEm?55f3X} zLQ9`PHEK#J&)c(yFO2Fx5-2oCJ>_r|u-MVm)b)Du&2B5z$TILi5}!HejE?8cwnB5z z)|dqS?RpVeaFZ47$=iK-yIOCUr|_W>oW`(8qs zUQE#LEotCjUwPFTnz981m8X(zdP819T0+md+ml@0zg&$X&tL})HItdNjKDFg@YJ+R zO>jTES4gSe943VHF{r3#hDrOyJQ{JcOj_;*jogg2HJaI%3yaL3fi*&?bm@u`Hsc<> z2RurocwHJ zO_xOfD%>W*yz8|0JILnm>)g=i=l3Eyg6XZfrHYJG<^4n8%l9!rN7m(rBMqZd=9u4n z_Rxn%PYMr%BWpa{k*TE0o4-_|Vb+eKJ*!e>Ue)#4q0;WK> zgEG6KIZU{eeIcKq$m(o7QcQPw7z4$sl*}{U`Vq7~p-3@?<3QqbdyAm?R%5dH3GtVY z8{@T(y@2nVf>FIK=#yl$p2Lkb!tAq%AKo}4DSx5zhGAcX_pIBj!fQ0$Ms=?nS?8sI ze_orlj2Ss($~y~J3t3sMGA+rKBq|g+E+#jh6;4V3%KWy2D#~q^zAtDkI@@$c8OuY< z?{gHAg*g)KVGUYiMqjY*Du;Wda1Z>6H92KH4NV|KZiHN9GdiOD2nN*W3Gp#~-E$l@L{g7r|qpXY|^TYJI|BB%>4Y z=!?nWzlN#H^xXm+`z6Nt9v1m%XOFA2y^ZgScI~E2uyo&>BLj4bc>j4NxBrd)96D7d zssNU4a85sgLe1Vyux#x)#V4qNRV()ej>%J^;QtlyC)xpvBc7H!R1QWFr-gd?q&|xw zr8EA-fFuRc=Yzx=5n{G}$r!YJ&6xJk1%1bPaFysOtQ>nmO8|6@mQHflc@h8%gUu%H zVyCFGHI*;!@n1&(XXWSpOR-A&VP-@^<$1W;xfWxy>@8UIUW1Z-D)^5Z?3bl$j&O|O z&O9#KuIwHJRV0|5&wsikn4&*V@NnrV4YNeBk@xG5uO(&;TrSKQjLzmgC*0nr>V5jU zA*${~GA6qTend=XTAr0~u@zb{_1BxFjt{Taw$pWr(=wUwaQ=MTqb$@)$+fg%nhJDodRxBlsn@QM9Y1 zoQA3yd!}2BK=sw^wL0T+^&BKo;GSU^`^VXJ-<%b=S2L>>jo%`~bd$Rqos^}jC%ugP zKyhE(WUdLQ%l%6FG?S7ll9qdEr3iYUQ3SML>yBB2Hh3lxu;2pCyvNRjzV83)(Jgl* zAS(l8-XuXJ%!K^`o1H))%Vy2eiBA8!2D%N{7j`OI#P*I2`pBpxHJ)si8O@Cvl?X={ zUTlJx3V9+eSHxJIvM-Lp?ZqG|O;K6PzxUhL*9ycp4D$5j3oX6&P+9}BK=&kZ>{9e_ zf_ML-nC_ynol!|abm3CO_3?E3u3`vO=Sd-$X6%5fR+CqfyUUFt##gU4NDuqFr;Uy> ziAvA4oan+KJ?)M4aXY8xZ-ponY}oW3(eQcRN{u5e{dBd4-5qV+{Z}Hdy54n-pn5!h zU@SaXWTgB{g5TSHv}Nkf{m9_AUmdOXW8U}0%ZiIaL#1|!Fx+L<4Qb_W_|H&ic1HK9 zp*~s}=N{bCnfS`#U}u6Ul0lx{T@(6;b-E9?Y7$rXfyIg7&b16{ax3$r%zKWhbAAV7 zEn7~*KHDb7Ii2qqw@-(-%8o_TV_##SOAn72&T@9aQm6>+ux?#^hfsD9XVj7f-UqI6 zv4XPQENE0q%KM*C$=qj7p$Es|hYfCuwajhKRDG1!#b5Vt4?R||TDFXYb|Lr^otP1E zz};V+xX)_0G3L+7hE?R$=M(*Pk7|PMm5X+&_Q(nKt1cIUS|7=8i7IXM31q?n%O*1I z$dZqB^g8?1Oq8rxuzvFx@*pjTWfS@(u*YmQ6G;qv1N)%${jMIyN6~thwH+2snw-Gf z1p(9qj6SmNHWni&8!p+C-Sg`du;Sph>$Tl5y$t3&k*u^19C`m>z+?FZl zw?{5P(1YnTc>$WqWzqJ%cm4Lu2|KZRJ#uedyg^DG93j~caqmFtr}l1nwl!!P{oW9! zfvvTJ-s2j-ym5T{QBEr379jWcJYObSPZ?j6BDr0ZZw4ML2JAwp6S%P~s|37+0hOa0 zLS@=t{_eTpFkwX=+XTCo*}C4C*!pB$UL$Qz2WLmH8cTmX2A-Qv1CVoAdr||Z7ZB)& zY<~AzV9-r2BXc*UpcJ7&S?N<6iJM>2#=jnF;<4U!0bdFz=L)w?!yw=p0cI7B9+4S) zHmKDIGMk`RECI)98oI)W-%@!s-G-L6j#*t~gDPtbxN=4-Xa2k@6h{NkW#q#c{`tMN zYp}Y$+oNX^@xM2dPtrfuaYK~@ScC7!&L&T4=EH!mMQ@3T>+R7I*ji!Kdr6_@LbJ%j z&~JH*W<8T8RXfB!6sz!&wZtf-h+BCy`=BpO=zmtp(&i9Uyf_gk+JMF{-{EP|_7%`p zL-LB^{n?_w8*&a>kl)kPpzW1W2BR@bCK%!o%+|SdLkt1=3)z`8+qaM%t{spPiCBlp zpG$ki6kTJmD!V^47Bmn?lVs&%GF~}V#1&B_Mj@IvzU=W;)1uIU0Q!ss|*R^^#L;qWP^vZ3W{dyD+ zCs1w4_a;(i5W;>y&>`;d&yZfol5own+v?C*d~&@Sn3I6vWo*}l2eh!jmuL|y*te_l zmurFl!z;)p2dO{^hpYjyY4NTq5nZlOkMw?}{8{zb!nY7(2lE$ri@=NAx(1c@mp^%>&Wu?r9l)yjJ=)9_Ofvk#W*U<97 zmU4}ueRd&2SBxl(Tj=x-Y<=+lMQw%&PQvV0d)3qkYXcxrK5G0l8Im0aDU@|N|7AM= z6^w?B1MFBOGTcjeMUS3VTE!twmqb6%w8`+CzVOka2gEi5DK67ze)jZtkhVc*v_Rh? zEo3bV;~D$j2;w~UCm!dIe3l1G`Q38G-Iq1 z_g=SS7_$T48sBz@-Zjw-E2-aFcCN?+Us0Tp{cQZT=@n}@qA4JdAV`#pt$C7F{y7M- z#>t^p766KZ5TcuxB3$Yb3M~Mz9Pr)R93mRE(dh?v*kxOH{j%^drznhK*Im%R>?!_j zr{9WNb$>jg!QKJ5pwcwF(9%s|Lf6E@C z%ZUL^#JN<_6jw80-Q#&8m?drLqu0#@#o<*I9csNI{XmoGxg5vb{;Lk`TQ>W>UDv&a zuL`}Bg<{Gqpgtyn!T`#wPUMC`6=v>W5Q~a38vle|763EuZhu_$xoeegU4}SWt#+vJ zg>|`ArD!V*OD^BM;aJik8KZV0nU*KB1xA{`~cg=)!s> zxyus?u$U9IZ6${SLF{)faW7sE3%|UA!XfUT zai!=>z`L{dYxlyZyH2n90S0;b_XBH{*H(w&bO(lJk4*H00J07bo%;3vZKV>dC*1&u zL}2{s)wPWS&L6a^2=P@^^o#)Zln z@aFeM&_Pi^$-qzYPz3#F4cyX${TZju5cR+clEH1)-1X$`klF7TT5$Y9STml=X{OGu zGt&cTp((Tk#0p@@(xbEs4axCfuNh4T-!1)+1NUOzVN~GAql!w zRll+tns>0*a@};d&YIzs{HTH!Ftxg-WyguT$pY>L{FLpj?>5!cL2DRSS7te_Id?u` zI}QrKgN16HgD!uq3Dz_SR3P#xmt8{ETAOklB3ytOwVb_*unX+`0cq?N-TU0X=hXte zI^Z|*xn5E4ylAqmy}qr^tn=1=A3V@%v!|Qb?!S{g&>mZ0&+b%{M_`^W5;Z(p8Ag559r!s^qs_CMaW z#so%$M4OHI73{Hr#}50igg=FuKl_utOZOWbnf}$z2*AxCfE}JII54QJ%)EWyc>j5A z``P*B=>wq3imRsRbS2OxM>h`lqc_VxUc^C3Wzf1%@6P#Fz_k+fYcFT_q0 zuNIwCuLdlxXK-BK!CuWya2yczf}&xP{%A5-Ed;ud@@0aW6O(AzWKN(?@K>ab35Ux8 zdR+uokFnc=1j^oigCe@JG^(%NA(^@zcQyIzzKqLy2;@nuIM*$yH&Fstu7DqH^R(^? zpJO;!v?qk9eUxlR@*ZGAH%UWdY%l6SdI$9S@U8=nSN8-2LqUKp3QL90QS4MgCjn&t ze@jfp%>98V3+PYt8MQZaq4_9O`u3dGN&xW;nmtg#9bi_v^*EjBlPFj6_vjd(t%80K_qWmlI?u8xCI;A66iPz!sgxwQqXm7R4)hGndv>MGv;t#kg6dil-`6yj3SIg0$n#OYo0f#^duOknm6p3-w-$sc>t1T4 zi3GbV)_yZa-QF?oFR6>8v(KJqPZPvI0p0E#m1BqfEonc2y9DVCF_S6%Pk^Ei6kCPE ziepBbuIO1~g7WL&R_sKpMv*oRA+yZs_U1rrFMG%(D)HJ4C@v^!dt&tA*GaII;;LAhRQ)h$wi zT{QqR*&W9hN7;OgW~edZt+WoY8z zEW}i4;VM^TI%3=@c8~=+X(51|0!vF;RWQz)7P16Xbt(!fLa^$+!C7|a z65wILh*e4MvlF8-gh5^jV1^lr8a#8+-#vxquf?`o;=b;gIvSp?RUgqkEP}Q_`-+mFX#qnXldWk z(i(#ebJeql=5~&B&$bRcu1-Ga>*+U_92m45N}Q#xr8@5HD{1&OxeC7)vGDhog3q1` zBfpf6=m<-*S>s2Yh?7Rdo*!8p@9Lf^znJtC5WJVdtzgGa>cf|8PB`-RkDKrbc#Z9i ztiD1Z$1bHc{iVz>mF#SCk*Cr5$kejsRH+qnO?A{GlV@g_n*Qq5o718E@OM@Ir4N4k zB2%T{HTL)3NqmoBa+CSYgMl zDkMXnw9aUJh}oUz0#P~yHndja^%>>Sy|`~JY-sm*TNL13W%9I)|Ivh++0Y`>mq#l? zHi^gEQq|$JUEyJY0*?vOYGXprQJtjC5vKp>bhTAKTZMUQ*$4!Ili|T&y~wYpn)``u zb{hjXzeweo;tU1Vcaq#`#%IQwRYCa^AACqk&J)q6Zu)yBTOGx&ggzyy(Zu5iogyxA z=#TRG>Zct7$PN7yu`O@^yfW&XI^fVirE;~UQfr}{csJcX)?NRe?!K9w)5ZVZ^auO8 zT42VP{__lQSWigQ$$M||a=1H?UTv}5TWri#!Y;RH59h9G1pB$!}%{fN+vRMxw z9EtVfM*?)C12s@LwR;%ir~V@*u#H?$r7T12wge;lu{8auwd!f!XSJZeHrt_mi1WjH>NXFj&sKs4Cu27U4A{D653OGbVoQ@=d5tk!cpmw8w2YW$OG$>Tc73ue1k)`a zF?`hWqUiZ&Ru_rqLuEn8&ehUS-_`hDyy$xIf|{!R1!%8@Y6o}Jw|>lJA8f7F#m!3I ze>-{FiOV?Oc_tt`?vkr+`J7gwV&I+W&bO-Pn0cnr$FJfT&}u`u=f{Tu>PYub^sL+<>HH zrsL9bhIK3DACY@6wjbIW;rP{cNpOViJv}eD6WvH8+3|IvKG8oxXY{0u{5sa0edOerti*5J8x3i4RBo&XE3nZ<_!NC0T?=7Loy> zeus3lq{PGS$;*1jnQ=cXl2N0SZ=uvDRunC?+w#9>xS&B|4c}`RMnnuglp*e$c$R~h z`8fNt4;Mc~;ISom{O9(tfef+IMwUtm(szfKl%JeC=_Q#r~ck*cNp3TH$|`DQSz}r=1@p8 z!-StrO@wt8GPJQWX|DK^r0w48GQv zd|xSajWS>@08guK#zK>`j^R5-n#@3z4(+{VMCUj1jM zo%NAZLOn7sU1s#s3lDDZEXQS=Tq$BI@FQy8^YL?gomx4~MRTW7Yk~4zrUr!~2Uc;S zE(7NBILJ^ag`0)`G0MGer$ceT4bM-FW=huvtkd&E}0;l8E|n?Stpq zoo*I&>2i)flr^jS_uKWkwSYo~l9cT8dEKwf1blY^7b1gi`@iBc#y>GLJ#RZ|j5g2u zVHnScEv+mgbaOdi&d&I6DBnM(X=-(F6$tBW(vv$H(Dlfz5PlhzYu>zx4#dgsEY@mZ z+^pEP;wGQ{+`90HEGrH))hTx8uw@L7!TMF=L_M15awjF<$_8<_ZJThAFb>bqPv4f? z7EhRhb1S>|$b<6yNlbijFZ)Msamgy>E*R66KZ$hRAQq!kJ$!WQf@iRen+i9eW0sSF zL|AFq!uBIp55rCjUvPGlbnBT)w8sxPX3dpsw$@RW)gSgOE1T6|ec9G%DzK^j=jE52 z^sc7J{Kn|lc|ojEa)E= zzGPu(Qjn9AT}U)L_^%ki$nf|waC+Q$kqpQQ(>u6X14$7ajrTVSLf@g zT14Z2$o8P&6(ha!3GY&lf)Y@#{%B133!I1ENL{6rjdRa$j?Y#qh-6kuzH8VCX1C7w zl|KAnyI^>X{qG~&GsMyOa(+=dx%@C8>7#(=daU-@5~lDmG1u4CwR5xd))R@@i2Z^Uq-(c}=7Tw}VFA zV!Mbi2jfOxdI+WqXpGJ%EfU%h!5gx9$jjDCe;C_8V4|L1idg@TfM=^JM??JS3nvkl zM}6PuM>pns7v5mT>|9}pHB5UkuqNRDG{@BJn3ey``scKoF#|techjpQW;L0KzHP7F zsMBprFgY{QYSz9$$rdTxLIih=IG%J@)C8OM8yq~W&ThI~E+yF<`%Y!5!>`jI`UGpt zV7l%6(nvV*$e}Rck)^wQOkE0s=Fw~&FW%zXV%g|U1a(LJZIB%z<@Wnorm!y!HAsBq zNLr;Q+lO@Fn$8n8geuCAI)@5!swzzc=(~$q%HEwlRiAo+I0?_Dm4KL2}WS{P=;w839iGBf6Bk%fZd8uyngbBPlFIe^bi5vc#s=O<{+4?@MPSOC zVQy~ph}L%CCua^}ZT4bm+GWq|P!xbF8QjSF81a9+OFzO;aroeXqe6CgD+#rl(3@Lu z{`zmbQyx#zC>pFR&H&_8g4Tb~f}mxcF0sgiW&*BK5LupeER7aFXUUM1wmwHWBF}kp z31*n>5plMBi&JdFuYNLx^9KsH*ft;7i%;M2gbC+$T%G7;6rqmmf!)d-1(}N{^67DW zeDQ|6p$75_PPpxRZ98TXfP-RX>i$0UEEdxtd<1}GMQ2Niq9?4=Vc+xr%`{eD^6C-4 zn`dEw?KZV=G6ZDY{`y72tl^Q8wa@wt>DgrR=jANDyH6#5JP%STk9`u*LRbD%?W31E zX>Pd`uF`&{%9hWnGW2PCFQ^a@sRe@=@B*YgT`L>B6BP}#4>xA$~IM-h1{qIl8HT9%WeQv{1mol_Yd&?tO; z)cb_rx5wpI{Hro=88BhT$vfB^E$}t$`2~MFrg+g?YSvzojc33RMdnQa8&8Ijt!k=? zvw<-Mxy&i0G;3N7z-!*vfp6fC`15|%b33%W1+xqw^Oc{Ei?UkM!RBVY`o}mE#|Cb$ z-?s)Nbv#`3%SR%p=)f%bx#AM>B_jt742L;4>g^+x^wI11!wh%1S&Ci~cpTjDOanRZ zhzj<&Nn%s;T5$5$%!Z8z)QI0h^bZ+2qBAy9wNpkSFj5kePO+$Z@#6q4Ecz=UAl}A^ zbVB|8`)S!Ms=$PSY#ATEaS#5+*qW^X#))!nv&SeNzPTAdQH&Km4%=8P(U10^oo?Ip zTaG)9u^-DcJ*ec+yFnKQjbw7A8V{jOmSRhhBDfU_QN|2D9-m)GTGA+%>u4KPG;e5i zbj>`M37QsDjxMFtZTn;~Pxf+;#2e}6Te{|l^DIQsa40*&A}1$2x7`+7?cR6hgC+9| z_XZv6P==H5cempV!+xmo4YSf~F`qQb^fN7gElB5#3W z;D+rvAt^le9e!LNmNK>x+sSfd%I65lR?)-1w_9~U3bD5!GkN$^9sx3q-oe8uHWbY= zeiT*jRAHr{g8yi-M}d%yN3zxy08_=U`aJAd;c@uw6#|d>MQlG?eLItd3QlURy28Fx zs!+pkZ6DV#SV2jPuq$|u&R5Po<|$nGxPbLTfeKRu-ztu#?v zC0WHlj`?4PR&UFo3yj3fKN6m!FLB{WvYV&V%2f72EL^oI5ak z%jF^d|E`Q>R_BxyeJ$$z@(+!1M(T|)H+cl4{#0)*eARx=mVlqUj8RT1KjA8=#LEZa zPabPVHw#R{iGSl^%_9aK_wK#7z$9m7srS?wWbp^ZB(2r#)t%V>fG76M5EalFt+HVi zXJ>k^Ri~4Y*7IQl;`StNzTUmdpFc`muj46J=MxfA2WlA!C^TRXEns7x%l&&4Pr?d7O;}{iF<4o2@72empsp=!X|#$C^)60u#0)y8eBpjKm0QI2y7U6ZbFak2Z21YO2jDkbxRD z4mZP?rC_Y_xp6^;)!~Ebj#~@6P=sJmf(E7Peh}DjC*8Zo&uihG<0URIhRSgv*`<4$ z18l_IR;(ESI^^+1Ce@ZNvn)h7l>`U_6s4JVimADPpM>lMFe=mP?!At#aTO96`Vu;y z4(Tw-1%h17I%#aNMh5tu;)CIGl$&O~%G1u@8kU%vUxvEBRBD$w+lL#)_6elR zg}9xN%D)(Tcp+gUE*M;#5s=|#m*aTz{MmTN*icOfyc=<+;}_zEL-h`&fE9}4(SU*G z$@54fM}Z+xYUW9bSVMo;=)Uzv7xPqGgh||e40JX|DPx` zktQrpVJ!{}Xmn=?k$1;J3Pae>ljmFp@K27P1h~VTcJD&jRINO=4mMW^a&6pC%=JtoVRJO%eC@IU#Y%Pyp4|s-wOzRFd>F{i_5#g= z6t?S1&`-2ZonZQ@1T$D(0N4tN++lSYfx;AAW3J!Bj)DphU}8cf?HQDLB$P?*zvXWk z`2z^c{!#QoEbAJ7*`bToGM`Ylem6Z7v@G3M{7t=x7xCnX>lU zy?ELbcQ9D(wfz;jBk*3~?wHHL9pl?YO40=PyGok=?AAI)S@w@DDFwQ-otNJY==c$& zhcl8v5au0Y<-_+hFj;CvTlH=xl#mq5V})iA&xqR9JeO2Wys6_?WytdR)||*H_4QAp zU+{lic}2CVxWORX;%&gm;+A{QhwmKQfNWeTn9SvY;uk7ntOAn)m8KkeNlOKV^5N*{ zJq4xURXt7?MS3lRij0#C@{o_x;f=|jo#Plwqrd+NL>dn>r)52zsmzwm6&T$RI^mvd zSBpbX6alzXI3w(B>#ZVT@b5Mq#kVI)@{uRc;!X>$ioWYmQ|K8u2yd?meVEz4V(mFw zzh~7NRE!gN)}*MY8WFmLqa2xl=K>dc>1bS-@ySg#)>!sdT!w38`5XM0qc$(;Ti~W+ zA#TaUO=x!CV?DqxeE);F!&v`|DGHCHzUk%gbM4kjM#a5i#6CA6;-fD4zoFpgk#Z(K zY?D-!vxPUc@WA3!1Q6=H#6^Ma;3d_w(|byuxRw$J(yO9z|}L$|Yde8YGI9#`8DcTbWTwsc9GVv+&s zb+0YSs9H5I45V5g?3Bvm)b5N|KvfBHNB;Sqmzlqe^DSbKJnoX*xBqQL{sis~B^jRV zHoM<~$3g}t(Zf1?zK&a4@l`^R$7b{Q@9=~Pe*J==%NG-2AvUOC_L; z=>I^-!g*Ygs_RvR(JoZlkwjJnB=OF$&Z)((t9h1Ez#}z zEWgwh>~)3={fXgGh=y1jTIoGd!551Ty-h~}TNP9oRj*3+VW0WV+tSDYFRcl_#^&V% zbpkU_#$HT#=iT4`E!o$@nQG9G&VMnlo}PVGn7bU{X=Ij!wiQ8?Isj=_%5MJ79X}u` z1#;$+Pt>0~tXs`|txyO*C*ZA}?9f_~DL}6Rz@>75f!s&O`E^QPGR9&oQ%7>JuY0 za_g11g_`98{Gp7~L4SEVii49;w z2*oE3EYa7s+(6T!>meSL$^n=aq9;;nkOYTKT+ndceLI|{JI;Yh+;T|B?@epebc}j) zcrx3#d|SF`uYGiDAw0suzw#t-2Win&p8!RGSW*M*m|@jHNh81g5HEwN_X-Duo%xi#oCv#_drZ z>Oi;xg!#UtE-;a@MClmW<+wjX{4ULV0v-;kQ`Duc8tGv&yi_$wW~1k1fjPC6cZDHP zvTx3JQsS=AIZubo>cdee(E&;sX|~#5?q$1OS^&)eg9qyoCVY13gu=52J-~y8FZeYB zh9MpZ>H@*Eb|=>8r*P@)Z=ncU##V{E^>{FNf6^kNn;R zJ&o)B_YPfP7MRC&BF!}?56Rs+i$aiNyhPp~kAq6^6+j+E7nnr3Y?EVgLv8Vh%ZfEt zPgjQ|F}_LsTI=vfg~E*%M@&00+Q-R-cB`)#@nUD{4dOc zQZhN;xrHwSQs`j7lZ9@A>mp;F_ihIOZ_c-=j>Zk%8D+;FucWo5_xCGvlyi8>4H}-> znh{}5P0#clg-L(j<6UOA`~Nh@udP_LyyiWA2M^AoMIRV9x8eJcCzjp+_dU7#b==Kf zPMl=V)mT|&^L1^0SDHWTrM|ba+p^B7ZS>YSm3l@~C;6p)je9_n9+VUb!2rD*C8&23 zb!5r5yX1bU{lChW@oggVzYL35OprcZu%38{)o@4-^^6G^W4q_K+me%gcp{I3BXOJT z=vdS&!hV)$7Kd|s+vm|Oc!ltXSMG57_gn3b$Af|G!@m&+*0OP!y!~A;zllqNlN;VN zj1OHd$dd%DZlgP`+?+2eFL&w zyCV_3mOpX7lrLc0YW+#5lz}lR(*YoTbz4)fjawFUDnP%&g*_*g}Qp+eZ> zJ1z(g82dj34=M0t*eq-Is2Ya`r=OGn4I&ib!~ zW*LAc4~@gm50>83R_KNDkaw>ZDbs&6hf`n5{mu+dqZZy`l9S#FSi$|nx^DhE(;QPt z0MN2w?yk9Ecx31nV)03uecOD*aS8gcrWTIj3}imhoLEnoPT%glQ)OxOI<}Mlr!$B} zu4U5vkj%vo(fu^3Ojdlw8{=5#zra3#YXT`) z_=T~4ZdV1G1GRVJ<-vAezs7k%-ThRd72v7rf_Fq!YhHQ%y6>73P&8rWNLVs7ZGb!0 z|GUh&M>sm|+ucWff4pdfCtqIeZU3Y1;pZfTFJV#Cc$G;@=sk0_MF?K|*# z6j3^Q0nQexFnYgH6zCFUcLmv^(;|7th2`wA-F0V`mC!M7QWwgXWhG%V2jk8sOvNy! zA{di8{H(sbME@!h>kazDk>~{zFG4sk^jUvd+y3J|=kqksH%K&6CEjFnS#(~y$}e|- z_@rJCT~3ij;4)jWcVaKXN;f_OLLO=ZhJ{m1v^f%mpdo-FWlDV)U%Z6Coy^{eXPP!E z_6vy9ShVl}bbp^y+Ar{OOabN>G$|gX|9UKVLAx!d`eqRn*v)H?^Jk>Q?+~N=NABBE z*rRvRTtmj-5yMQFB1!CHy)IrIPBzK&QzccB>t(AWTHGUJmC z#93?B5U8t`_E++f8NF>ZuuK|<4=BlYtJO_jP5(FCUhsUX5LeelBh`af86ypj!kKMw zfa&J0I8aoh{aC|XfKWOK$agz60pp4^Cd+QHhcmfI#v{uT;Z_v$J zAMDo`Z#Ci|GDRkzC$6(+tb}ag-Ne6@A$Oz@O+A+<@8~4Sz0I0COF8 zjNA;)3xCdqN{y2DAUS|%8Civ9EyQT<#?zi zth5^&YoHU$j81ra-VYn7;a_q3xSai>M=shNCXW)W945$7g^bG08c})_;SY)g2H=v^ zNq5az=HcE{rLGfvt?=Yj}$rk*ipvR z&z~NWqlRQwI4(-^TmQUYbS(w()$lVo5&XD}ZyqyQZCO@M=XkcXfMSp?+UVgN7f8H; z{@zUR9KVK40OaJqn5dH&tJ$vbvHa~!Xin-O^WnpLb-W?ihk5~zq6U@)`78Db>M$m) zisj4fXDb3Fw5WHXVAd)2+25OIWtFkX1{7&U5Ij*1rI}D2#5zDC018OC+_-@ZUEk%4 ztQ*V8r}Y$@Swm>amto1?71Di)dpO`?O}7@}CiB z(}IBNLaRBrWd@QESy6ZeFmku`iahRhu8hFqkAo>m9<=(?rm?TbFOmh;s`deinM@t_ z-VTYSXgB+wv|Zd&IvPhX)?#EolKh!}nFh{9n!qQ?Qie79F`_yCUeF05yrMFpn1Z^l zR)-RDDSZe^8(PJ)` zQ!w)UA5m8U71j3jpNS|XC`bzu5`xl*l!SE70Fn~YAdQ5efONwE3Noa?kb{KulXU0? zk&sU58uB}Lc>ndS_1=2&#F2aNxo7YFtK+&Sw_oD9Bp*3a#r#1!DB_WY4N!rBneCaa z36;+hz2z10zK1b)6y@KJv!P>=aB+L^am@ ze1uPnqAYJf=P>Z|eM0fsJs^?^s;rg!!%D>rZYcgi43pOOz(LiU*nR5)Ig z9v}|4HAtUxu^UL*oG!gVD()GZN}@cqcT4ck7pJVH8j_-cuIi;dU;2~p z4>V=6xmAw_cxAGiMTK6#LTHj$QPvY)%Q*v=)#0W~zlimiRs$I<-#C*`O>O3gKVX;Y zy$e(lbg}L-^+(1LpiELFi#K}{DJ2q|K3?vL7>fYYiv^5-;r`cZy~i4@iXj`5!r@lo zx9MiL9faH@SSmzHidks=c0;qAAZ{?XHtevNPZ8-P7IXNHe#5_(|xRR{n)J_Sly%0p=xDHd?`PM;4n7o2F zl5)FLt^AEF+y`WJ@e)-(xubol+bsdIYmWg%8em;Ph#NUM(hsT5Dg#VX$w$lX)i z`Jf!0Ei3{qA>^@Ey}hNH@2;X#wzkXb4?c4gWjkXD%E*}Rd?_O?z;)bv&20at){Q+n z$?D5JTcymeZ`HF29)Ko8(U7}g6Cd;V%b9)63z)*m`dw74ruYpWB>{_uF~hs~rg=97 zSeizkBob%uK1Qk|428!}xt|(7KdB0P9p5qg`en1d%iH>JrzBebklT%3sZMp5sLfck zDFDJ&Hz|kS^=vwLm)@!&e#NUi3VfQCSV;)F?B)>wyJ(g>X_(lPfV zTu8EG2b3gM!A+8X@W2&=QDqlyQDDyT*1)h?lyS9cXe6en)Psg#heDD34>nubQgBj$o{4ykyyIV2a z^Xx^I@bUa_=BCoWHDy(H4WOH7=AmtpGz&iUFVa0=>bc)k&%9boTDe7?{^?1Cd2vH8 z%NJVRk<%)cB=v}oz9@W{Od>Bdc*Y;zQ4A3&F)(2k_iEsf`eY*Gr^7}++DxF?y$Nv* z1t<5}zn-M#6?vu#!DgPi#qynCrux1KY<^IrUoUY#$&6-! zne%K5G{+{ozoEEw70pLK_R3!FE)iHhS`6sz*yMbbZC#U}lvOC$%(@8kh%J2fpu|zn zw>YTjaBAqPRoTLM1z1CR0;2U3l?uyLS1$`b#-l`jl#eS&T-25s# zz`bm>MVcdjbq7hxA853{Zu_-qKNSar1asn^fdWm9L)VDvv{aJ30XyQ8P-k>e=!QNw zg_nC};Tn|uG3@Vslw840f!oa^f0DRo$Zi>={u*csy+?w z&!E7E6U+i`75#o;K?!WC8KqccP7C z4Ny{IggnS!-RO7F?hc4BN>?QzfPx;_^#>|6ae}0e-ug<0b}IyA9!Dci+6^?@bj?m9 z=Pc2=)&wbraW@(lwI}t+n%Q%<`cVG#_kP(2$nN1Q)OM;xc-*EB)=y%O+93SUWb#{l zL_n^IB;Ga{PFQV7hsTbC0Q3<)&MsSa&;hNg)xAd9E-ztt;;BA0*mHHM zxjrfjUH2#KeY*~y?>Uu**^l4dbv|tS4E6R->*Mo9V}<|q_6N~A1N*q%)3{(K@$q6N zu~h+%BehmqYhov|r2sGjLIjI`bFjMrYJSx>JkxAJ3#u?fH8PrUdv85uoe=^L{;kPF zn;(`im087i^=C51Dmo)Cs)9oFvKrED=E3d^m@;~IesH#KJWeIdyC#Vcrba+Y$j0f z6r{%M95)u<2Zo|t-Nce0A7yV2mSLbk0Gb|b-1wCoElNi8cRV7%hki+XLYue23D0~z z-WG(Ff~!OudxRrV2RZK6f=&=5->!{6_*x6!tFG_f<|CE8Lr>wamaeN6ptUf;RLT>b zsj1j0oV0JwQsu^f$DfKJ%Q)KF>oH>@zX4bEjtjbC+nf8M@-g|zE46?@w63*3kav=Z z?V?a;!i^V+*)iO_Vn;FJE5OH6@o$UoLsaB{%$s=MfMT2+uE0Dxh%xowX1_!Gd<1Bf7hCF{$9H4fy=utwItbeZBM z1rPW019x6z4R`;?rSbEUpa&wD?fIuCxhy!cBIjU8;2!sdHddghi4D_>!wcNZTY)Y? zYt6-|%;QMCC^{J#D@)0U3F~UjWQz!wqXLqQC-R15%HWM;g&T9z5u9?)tz`mMR z)cG8yvdPHx5>Gz(`zYtEgvH@rk-mI?xuwk{vBY?Q!vrft~tj;^IQzO_>zAui;wbZjDyXRT*KLaHoO~OiEQXfe{k<3)*|utk z!95RW_x>gZxQ&!k)8_5pyK+`Eo;R8&cD;Z)6_6A1cdhdHaI!qd#NEwbZ<|}dfgIrF z|Ah`_mvYF;^76EgD~N8pF25c4Z#sQz`N-++P5CB(v;fU3u<2!8NTu7?V|z+spht&t z6<@!ikwV0Tl3oLZzLg=qA;)=P1J62d&_*H}mXP%?`Yq={HQ##YVZB<$ zIVwFDRF^V$X+p70yB7IpU9T`Puj%z0hm%t}cm$qDPNRWW15kNYiBxWo`7HVYH(J7K zFA}}pYt#!=#u3WWEyLGgK5Y}wB@-AIDECKTkmNv^V>&Ml^U$76D_ix}SsX}31`?pWlBUut5|huLKo90=x3e8$3IOZ*VPTtHzCi-?&r z0|&DM3Wk>tF%ytP#>YOv`0(oqeY>OHBwLV&@E%NgG#BA}f7#_5OEJ?VvTbV`apLM( z67ngJUi>KtF4qCd3Jat;uQ3_CB~6@%{6soaTBATZS{0T@5Bnf#rLFDruh!z6Mak9% z%l>0lx%w*I^%U>Ds_n#hTqnq0mFUzao~7Oeff~6~?ptl?XPmk z3=SD_`e}?3STV|keqIyi*t3Gi&AHxtWlHa@BTqQpgWWO>7Ms$tJeKk&l{kHxKJzLB z8&US;1oxdYJI$w2C`NQaJ3)!6Ind`S*Z3k2f9uL0C;L`v1(_LRb>Czj$oKXuOu^m2=@i9`9X zl+C3yCrz_B+mos9l&vYm)N9&;=X+m^aXB!HLF-y_aHCkLemOAGb>}WD zhszZJF<0s#o`{=PgFW;IB<8t(N_|K_XMvUk;L9d+NIDFP(Vu~e77~b2h~NCf(x7oc zOkxcz?%AmO;>aQmZ2?~gShe@rsAh7F!ai{nD@Es|HLbh$0vlWF!=l?xT+f(3N-=kT zj7pcvZg&4dW}Cr|mDeT$fQi~i?hz#pzemMf87SL0(N>7g$uni!`pJrlMY>Qa1D#xb z79UIPJxR3weQ-q6Jn~%0G2G=#7zER>s{QmO9=lqX`e$2RpI_DP8WxFr#f6uWCZ;+v^&5wW zmmdAlyxvI|!Q4apeD#EFviz&E?VIXz0&#R*NS2O55;1J1t&LrYlf;{fvxd7Gv8p=G zNtH<>CjXKw;n`b};>>lid=ZtkLn6!qS?LwkPoSsTaqnmOduSoo$+zZ*_$>`9jL9+Y zIn%-2!tiX>8qYOSgxKG0Fh-(79{ySr9XGriqF%)@Yv^|yYp}ih$c^ByU8;a60Wa!? zn~*$0ao*{mv}67VlDt%4WVR=`6IZ3AqQO?oANjLoU-bx(SkQ(d*)aR3Li7c|o`~=yhn`axsBrO_uU?+VVq!+{VhE> z{=nDQfNWjd`5^>~hU7kF6|r(TPW`XLEX0y>0Ad7%e#sL6>|HNQN7|w{Yzl(rI^GeV zOY{&W#vKk#Pl{BhPc83=mUA(4)n939(yu>QB>K2$2`G5ZU)XDTLE9~&4FcmbF9MGq ziIcQaG5JP(#iIn;DFB}i>$p9rRpoHS@!;7Trx7AR^qt1jj9Ndm__PBcQpi>|4~`5y zx1_)+weM^7?Fp_;zdjo51a|=p!Lcv0YYHwD-C!A2yxRX<-eUM~e4B5F)Z6vh((WL< zC4Nv3S>p~AiQ3x}el8n@D9FDxRvnSrnq5EolFLVa1DtEZRu-}cGgT>3hep1`I~=zG zU-ywq8GSRscD21{p@r;RIQs^p`<}CXv~cm%-2lMiKJ;DPaB)|Okl^?~nmrWviGo^!na{34T;O{8?cz*XiFH2{ffr(q#b(l*Cmapj>4?G|U16(b^1{Yd)CWyXG5<|*y z{62C{(^rCZo3n+FE{Ve$FF<$8_q+GoF%9N9j*zr%<>(xO9Q+>I2|?i;nxhg0J8`3LVcjQFzR#)3u3Sx zbo1P|>&TwV_*OvuPV5mnK43_41y~t{GXQ`?SwAO=ddlwGVOt~fTSQTAge}7<%9lg0 zeCFPgp2J={`B_?rtx10&nrVGKnK{APgqP#3tO0yh5~UTev?M!pV8hg85vG8@(s)&E zCdgL{$QE{ID++GI(K;C~8m+#uJ_tsfvA_I^8lKm%VgeGn+)%a|)(9M3g!p2*mi{RS zyFKqtZ%hU>Q*yfX<1AH23LV;`^8VmBvbzQz^C8y=t(Fw@xQ(DYpEa*|I@poeib~|} z$}z0h=(fTtFg-F_j&yMzT4Iw);@``bV_eqA;y>>y!EnhOMWOIzs~q2&DXW3AZhYUH zB{C|kDBfmX){s60zb4JEztiWvq8JnJTzyAA0Nwa7M_WsGM=W^jrud2S$f&b5xB#pa z6YV6!NL?Y?S@Hz41r$WgJ!g;YhR4&iJA{ASv0DgmHsuoy5+s)f?<}6J3Ir?|zcs?C z@Po}BmKz;L#T(0}S$843#*U)^3V=1Be`Ns9FMu=to@Ac@<+|4*WpD87I_OM3^#S-H zMYCUX**bFklA)LZmzRsGdBdB}OjAj6)CZegy4yD4v!>H@MMi}(s zK;RgiuXD>z8OSqkr++;e>@{lf{3;B4Zv}>B?-XJwC8>rqYloIAAn9(xjSuwkoXt5p z81wO4(ufoNr9Lq&CeD{T9|#qOQ>O8le^+lerGM8wBdIy#pD8J4cpz7gRx5szh&K>@IsuJnD|C^^d9E6zU^ZAPO%iC* zlEc{vM|1t%)ytm|T3P8>K8VAyQ)HH)Vhn*F`BB@y@O(FM8YTWqM#oO7-42>l{XTm!)>K-SmOyUtE zpLAp_QZH?3+Q+N!gXT*F>w?)(piqSRu=JI~jb&`EVG;uOaoE(hPsVKyT|Gdm2GwZc znR}*%L!cdp6U0)FO*Aq;G*uRF*IDM__tuK=39J+O!qKwu)uHMZyn6ZFLqk*xUBy0c zbXZ!DC~Ww8u7Bs`H(>p80&63;h`r>vZF3=gOpW5Li9fyXT| z?;iA_DGiztgW;ks^XFT(9U%%-5a^&wUP6{ZIZLsIe2krq+bFMxOty!+X z{d?`ZDl%2JoTT}~1vJ{d(|@St&ABPtn6o{Xp0bF)QorvwhiWb7|DmQ;S)a`!m$@QB zm6cQmgFhetF+{3pClTJ>GuE$i&5r;M+`#SGBM-FroxVYS`qt||BQjAvvg#kZ!fc+$ zrIgfpw2e-tq}45(>#7%JHdS@B-A&nfezMgQmyBX5gm@KG7kPiJs*9rWjnb)WhyL4 z`s=hD?X(n;il1zKK62&9!(vZg<;R9y-@aM<&E@CJt<&J8KKZm(5ZZC}AMud|afZIIXUehaZWM8ruhff<8MgOj;vb`L`0{Y}RJhgk4@ zJ00R(aD*53rdr|YN<5=wXkOSG_B4U3nd3>jdtesUlntDuL3Fx1TjDsY zrMQi=IJ4uO)1gc{ZsHzBc=<^s?9o}kMP)!OER*xfn=;%5{KC)dCDOo--QTh#zbl#oX3v6tyFpcjn>)^-fI`1j4k@jQzk`3mxt75BhrPfG1@T$f zTfy_1frU6>hEg_K9aP7jh>Tm}6HDtilqD7shXw~7XnmD9RSA{foDnGd`BZi>(%h4F za3P-PwL{g`@)TCY!~!+I+xG?RARS_^I2crb_pK7KIcj9PcQu z$Lg#E6^5Y{OdzX3T)8$X4X`HFoezsWFeUW5xW0A`Y|$BLp--p2GJT@y&W6IHeO#&MXTZ_ zm-#Cwxtu&m8#AV-^hr27IC9|W)aQe<&k}I1FK{xxb^~U!bA^{^z18J5J41GKDA)KM z!SG0+zcm)Cw@WYDQJlQeV=sB=6+{_17g*Wd630U2+7OMmJNFw5XlCxO=+4YtwCm;z zT}E|W^pu5UEG86qw#F*kMe!Jhu&Xjdu;d8Si&zIQAbkKx&Ya%qLKClD28zZ>#1zvA1m+vSW+W&wH)@s6J zFnSL4$5-K9dM$Ir)|i$#?)QgeADWe#B7adr`ei49X*M`$w~+OIK7msY(I@gpj@m0} zhtoz`$kR+9dn&M@<9JkEud!l1e*xOQz4UAZH&o}IbQOw4so-@c`uk?*H zJAS(i`tvG(j%C(vdX>JE`%(=y{I(|rLaV(Igf{Y8t)D2#tbhHYX4$`Wxn;tC^WPh- z>%S^H#;Et%3h`+Tw~3=?97;YkSrdf(zIOv~RqV_%Iq1Kz`?edd;q$77z!}3HCEl@= zT%?S$xOe)aGE0ZjnDaDnEaWz@E8#?Dmlmf#^_haL5hRRpx*MmM>5QMco8J=&v@csV zwtVCHbI3EWEs~x`LiQI)R^Mk|?prh`fqaIP#+l)SYC*@JS_Ar?0 zf&Xc(J|8RRqE-!oY5@W%7S`SXQ_LiJSGvE7o}LRqD5MX1&!uk-%GX1@G28;(HwE-BIr$|4KLFyy zb}Ab$rXWLx36e&VhF}2=x$gt>m=S(<(~UE3m5|w|b4$l@a!uV{TN3WG`LA zb2`nP>zBx;{mOj&a16p|6&Jh0QtR5JfH`S5Q<-2Zb|as`hK$y{nbd$mqz1f1V! z;yTDAki;mU)L+cYJ-NCEZg~Eb-k&Pmgb`kTq>HjA%)i>2|A`FhSY;Ba)7UHCX+u2? zh!|S9fg+y*^8@rW+&8ImQPc^zK@7k|E9|+AstIL9kjfA^uHFLLwE>{p;5)&-aGLjd z>-EJ00l-_U$I0hhqtk3G9slk>hka|K-5T!SD6|qro zUd7 zo`Jl37NuDUI|04`EyW=n`&S<7KgAQS&prC~C(sL+)IIazkeOxa?ppJOJj zw3J8GzabOz&OE;I(@T1N86)`fEn$o}T~ys85+?4A8&x9q-_yT8JXF}Y@gdFZREppG zwFIuORsX0uU8afiBK04{Kvfr^Aye2tHlaMgoItuPD<+6y^^LmiVsu)PuaI zwi)w!sOwD0*ue{O9ea|XE<+$zip zEU*XilV%+@=*~mFJEz$nr%IfG@1?{~S^13@+r*y7(o_TtVmR`svwgg+;~|55#y9UV z5q^-cQeco7KM35AgAeyK1rW| z4LTUwfRoqs&l}0{3C9Z1ES>EpX4ffLsz%AG6Ov4$ zo!jvFt8rW>jGW&>ehx+w5TbpZv?{w_nONE18L6!VQ#cK_!qrW z)i-u7#)4ds_3&mf&Gwg*r&W{}6&zF*739+r6*MH#^&hazN5-FwHUPPAW9-QGJ9YPW zC6dJXP!N>_+}4XY&i9Y<1%Kp(msOV-3B7q>w{gCzw^&4r!*T*#3%$gt#k5s-;VL>H zXN-qdN|4}3xB}4HNZNUa3Ld>Y#jdC^*dXiGRqE#(dcRH?UHKu&hZYH@Ke7NSxHC$o zHP{38$}JNVmoPJGQ}g^Y0Hq|i&&(3X0)wP*Vp_H>4t^=AaHt{=^U{mYa>qi+8GZyn zw%xf|ttNsK)ar~lxOLJVCg%c4jdi36a-#V$IZr$f`QjND%54^b6l(vmZFx3Hy|dK8tSD03{`b`g`Ps*olpfh8^Sx4`dyRBr>^-uA4KHHf%m>U4 zAyr|gDR1kjVvHDoPqxW)o%r9*x@u@&Z0$q$mZz1;F6Q>3ao)rUC}Y4{ z=}66-O#O)^QSj83TL|Lkp!?F>kcic1Y@^Z$BY6b%riwbhSJL0Z|mw8SK8$D`0yx zn{tl;=Z6oCG78Ky!l6(QyZ+Uyl?TzHe(m<8e568yBmbO)EOvB156QA~BNfJuY!2ik z$!^C9$SR`yTP+Jud6a;2SimQm>>nSs^w>KcY~U^i>#N|7() zhbEUN*wHs;p)5R`2S89`0r=@7N9vwX1=A0&N)P9q)S9mEE!loRddpVbQM8Dc5_|aa zq4cugq zx^C48vK|Fz<3cx*y)HcUh$yGgA0ehskBQ_BL%h~zKevuHpm*2^E4RFXU=*7JrXa4G zjxerG|5z~5a{MAl$pOCcF*d#y1(CE0KA;0Vu<3YUhJ;gTy~l(qg=dTfE+zNM z26?i!9h~L47>0<@R6Mc3c%EA<(#eZqDGfu|f$JQ#_e{@Yv{|QxG*$E2f1FPz9wiD{ z=4cP{_MT%z{kfHFjYOOKK0Py1p$T-Tjl?`E=4*egVxk0+g?z5RF|4{|eD*yFwCP}H zo9*pM>JgeC9>x)8-(`8m`Q&jVB~0FH;`JL1NL~^Gr}gmy<|)~EcNIbb35q!lrlHqI z;m7|hD`mCS)a)QUsfLml^RIVUl{qGkTTX~-sARUp@}}g+ypqMvgMu{B`x_-fsR6~)l@-l?k$0co;lbr7z!T{$Fl6gmI2jBq0&kvc>CVK?07-(a?fas+ z37Gp|UxojCRb6$eC3UR!7acp|FL9*8sjI{IwZX~h!R*p|C%#S=^77vc>DE6q->aU} zQaxiMQ4$fp_WqwTv*oYKu;pzPD9MEuUf64Nr-eh0?oR4kh>098kAs^5qUkbL zSwBr@UAh1)@*h%m(0U>+UY9WzLHN3NHtq|Z5f-;5VxPicutn(uPg!Cq*VO5MDT&*N zTv-BK!D_6I^wIYeQUaMs;2&PwIQwwwbez_uIrpUWpz@*@+UEFVT!^DvmwBJPfY~S7 z6Ucit5})7UsGITkB#b6A8(rJ6>Ta5#Paq(aEND$&-rd=41Jo;g>NOLwx5nz2=@@=sS?hogmvcQS19l&hk!0AF#q>rqXu(q!9k1mo$l*zy-Q z`;eD3e`#$^%rQOtsTm6BiaH69Ll-;Z8`y{EN(Sd(@hqv6&5%u zi$)ia_-TR#*1k&R#c8o7su!k?)pCF{OC)K|K zQ*|Ufut<#t=dbg{f4|g&0Di6h$I`8e-3zSTa=MhJi>)cN_4Pu?nQbe4j$ z0w6;vQ&xokwCT~(V9G3xe98e4mMf=8D#o02VLHWq) zJ9Pw%yi#D<2kW-qRVLgKJ&|Z3hz+?fwHH2?S2}S+yJMMnXa&>rO?``jjRvp)#P5g% zhCIIPfcbG~v@|?VCFB|-_6s;cSxUqb^Bkp^`XHx5L$0qXGq-W?x~V9sJZIH+kq1fL z5s|UPwk8D&FJotNTdnQ>Udr`vm7Fkg6mwluMz=xi@>%AosuEEJ7+~ zC|LjsRXVHmaBl8+>q5LyKvwf$>ONs|nH-hR^{M-=+WJ{mwtuLz?#pF5<_ezl0yXA* zM^wv@G0UrXvR|ZHrXWvO9Zo>d*O$9_h53+;-2E#F=)gXcVa0jO)-ukZ4D2Dbw{ z?ksqG{2TMIE`rn;TrL`7`5suUl<*2s8x#++D zPd?h(_=RSG)raX;0mHrGmAs9C1JnCRS7XZFm zt39GTef>z7RV{m|B;;XC60r%$kQpOe8*6MRQ@&JvDac3IXxTA&c1b!*_58G~ZbnW1 z$(}LWFOtle+Z0}aCW5k^y5Gf<@z8bv6|3I*-+x&$X6!*~-98znH)0XtfPNb_$@BNY z0kfO0>WcNm{R5i7cZzWLcG2ihMv2w>KwCUpk~>xpu!(4}0?LbK>+y!h>Hp{KJ7cCh z{QVsHBpzx^P4|v(!iM4yI0ORV7>L}W-;5Aa0XFo|J%Eov!Lu$wcE_#P8d*tqZfl071Yc!q3BE(7)I8Psu9%;9)ymiR83hH>W@7cV`Tp9w z{f_W(G^HYwlwiE3gPU}3BrNVM4Vfp>9&>`x#K&D+lJ>LI_F#B^3} zm}bg@D_lbfC$^7YPy!LC#Ly(S^I?L6KExp{9qNu@qmX(_?_L@(34ip}Xp%3Z(cbuEZBAEL-k>H_Y&6P2=?atJ?CZNU*ZL+Sp&Zj zm?ExH3Yd->O`D@|TvWyMllsWtySGyNwu_iL)eLD0y;{8A2X3=77Zfw2x=HHi^o#Xb zDXE?h-KJBv&q!_1m;WV6S;wlMi!gz~xCg0Ij0?XmP*_iA%m|6o^M8 zen#8A2<%9iw=Y5%u{1FhRLja<&Dswl!2tD+M@LSBImVZ)!7HChw@J)bgnoM@q zFS5v6xuEJ-E)5t!uOW5w82UOTIVx5SPTFj}mx-DrcaEGe#nsRvylND#g2u1wZVX)* zS525p?Lmjs3<%Dcdcw#l%L2v3r}(Luc~KBtTGjh*x}Qi3E|F@}w`Qp9-7 z$_;x*SM-f0o|Ot@g~qn1f+GYmHk>4>B#B}VbCNB|;71YP`~ly}1ThV&F!)T6@C%41 zX(ZlE#2e#25k4&)dUF!9n+P-#&Kqn39phx5z2(7t08r4WJtlY}5*MK7r(-O0Key4w z=wen@m>M$ly|5O;e44&>ZvL6Y{l+NOkiZNp@<5TOsV|#Trs`d(5q55qpvUgX6_j#xkjK;T#>26$;4LUk{`8Jt{|IU=e zb>p2C8`Ba=s_ptGz}mZ8`Z6>-D|PEpM0PQ{#Vh>b%PEO&cUpd=_lUalS17lMhk0Z1 zS;CZs%^vo$E@wkef_c{O-S^5&D$<-U&1ZWhK!w5xw*DsNn7VgxORR13hv@XEnpI!` za!D7TMYLJrDkRV|?tb`d7@n}USZwj(ofJyxjAuiPKgQuzG2_-U)(OOLt>c4q4~pjx z9BhN>-PhuG6Cnt$_FRcur-$SF= z!si1;FMuw}ghva#&dlgU#-r+*XU}iuxq+a|lPn?8EV-!G`0u;l*<*Gsl}_hgm{M_w zQz;f7Exs_VmXP-0`^wbPZy|y0OFF_twek(0Z&?-$Ev}A78t*fB6pgH5by+N%x|?d` zhG`QPJr!1BqLxiH(T;7AKL;fCW~+UTkk=JBN$8~G_8s)_Mw_{87rgy}-6bZLMp541 zyLW3QCj_3BSTlHcA;N`fZ)7uWe>0|r)7RpLLXj6yW0T|Pzv&D#8Q{{)c$E?_^FnWy zdT718;2|*S?_<}!bsAtA|p(YJX2VUd?hZTe}8===E)O;%n&#WQd++zJ~THACy+*Yn-nOV%+=uo!8Y9RtJXxZOs~W3+{Jc= zhC~pY9~R`#CrF>TlSnEql%g6_8+#Pu?-ckq7ny!6jR3)IaOd^A;n$LrylsZ~arVtQ zpxRc2F@sYGItAFsSJ@SbZoPjXZMa|ctAo~c$GUZI-$I8+OD59lAts-aHCBsPOWcFs zGy+~={!Gt}td+6n9(5^qiE2LO>f{gMgjf@V`Bqa(pIQZ%=60vZdV$pKsyQv>Z(d_= zk)k#o&Oe+?In(i3u|ulrrOoZkBO>369@v>+szXh=gk#Dcm&fXt9m1HKr`BPYg=n9Jmeae<+b-Y_jv4tm6ARWWw{MQ<2OYyw=> z9X&pCOBl{%Bzm@^6z#p*DHEGByWt1Y20z_RsQjo9B2E&inG3|qb3UQKX-$93>lsK` z?J%mzw0ULZxl_UBY%Q=2Q0IN(9 zZL)PI?32fyf85LF-c9gIV*Vy$?Y|ivUbgZ$-+lArtMDnW2mCil?#kUO#(IL@54A}5?r#5>P7@H8VlKEG$zmYMNpBN`QnU#O^mJXiP9r^?{gTD4O@h|e z`MZ0n_~ZLOryaH$`lpZ1o=W#PZ9MbcltHoM!~W((s<|GHINb&ju+)t@6ZKc%?^bGa z_2t2~k1A;<$sf(4NC6E`u=-HjIS`f+LIGeIp7WI?`IM)G;B|*jgbDaGRr-VI(Y0)A zyW07?#NqoxGdbtPuS+PO!{4A9!+NRmac$gF|MM6-q1lWJwbExaGTqvS`|mthjiABU zGvySY&W2X1?N8U`+*RXLwczG-(iQgz&vaJ zvYl4(c*iA0ziO9&;d)qOIWl~j6~DQ? zqVyTH5NfwC-Rh;`RW%mDxqu6@E6Jq-WQR^+eM*d_zh`w_yz?Evk;#Y72Rx>C$v!mh zRtIzSnl@?mH)Gz_{39v2oBCB_Oleq#-Vr}7Q0GO9X7n4}Nq#3b+RW!dA>(UY4EY66 zeFk@|{9|2vqz^yDMAIm`2bn>{Ns=?n3dBb%A(lxw3Yt7DXq6rxF#3_YPrR0|H|#!r z@BMjqoaGntA!)8|jSrp=n8_`#*IveH{6M*@J7onzwLgZJ0&`p2-HCCe-G!r>DS_=} z1)kk-ts!28EyK-5Llx?%vnnE62A}h;rzIc1ug*NVHz23yyHE81RVHf5WczU9`5giE z?BC)2#NlSn{WOYppFcf8=JprLeS$*X5ZXlc{cTV9tAY$UHA5L3MypOWQ+hSHsr{4) zKPa5?S-A8#LLCCid_RaJfBE=|Fb%YcWNuS8j{Bk0Av+&+TB%zuAH7wCldaGJnPH28 zyOss8?U?)VtyrC3o8cB`!*Doi`f#G89o8eQTn2mIvC4qWyAh4vk#F@=hLvxKE5{aH zf^ReL=vkt3_5_K@D)zKdl3?Bi0!E24U23R?uV`-jfL17Z=jN$Nv6fPMJs*tSMJq@PB6fR;7 zj3-;H;&2B+qJj!jivkm(z{d$g#gSNmodZNd-kh`s=AD$(=K7E8*nfT9bxLlTHYZ+{ zDobtcAsffQOKrnI%WVQDqhCXX;^qulcltvx|39JZzrOTP9D`q+2wH`!EP(*N8*d(a z;z@|6sDvN%n8Z5fHIT}iHW|gXIV?LYc^iwu?&06du zFG&2@H+x?6n7%5f89B4%#%?*C_`Mevf1vq&R-&dDFTqsMiI}*aU9EB4m zqn<;rq<+EWD|)6M{tPCVzu!0Tp6Hm^3g#r8C!gw>QjRH^n?N$YJdzRC(0%@y@cbdj z>(UxpMb_l%GYPT7uU&>8bNOV*ktzy6&ECp*#fJt_Q!&meCbg=r?ITK5a4x@paZ|cm zZgrWgumB1~ETD)oOs=cNn!h)n=rNA#A^P&0%dFAR=O_;pI_LeI-IQ*kkU2^TyMBT{ zEvjO>d|IiO_>d;odsB7@(&l`7{wd@=iSB*mrO_(OD=XF-9`J}8Nmwm-DyL^C=X@qU zP-=S8oA%N}3ATcl-;goSuVqMF@v^Ol!OEX2UKP89SC|Ky@u*|a3;|1}v5CAvdZIY# zn#1$8XPopM;`J{AbAgOkuKL^UOvTk&zqhwiCv8Smb{uqUS^Bk;m{|r7GEYgqsnvybz4wE<=%?y} zvtBlVJg)vwr9o9F_;QCFo3-bqGkj!MIM6?M;!j>{5@H%EVbRSyQOy3XwU;pa+C7?@STP32-90eMu= z3wbKeg^pEb(z-^?@@Qwe_WSX@Q1@%;^71+(A5Lwtw~zzX3YXz;t@TF#d32^7tJlb7 z4sK&BJH83ODRxWln_^|-6Wl6%_K@2^HMHhNOEt75qf$kG5G<|)a(;mz2!Nhh8y%`moHLZRP>70 z5PFHb0y=l#;1daqZGH;)cBQ;^Bt7P+E29VM{dF!6mKM9*(q9TeFCe|?1(XKJG+Fftq7Us{;G{X^aa)A(N3@KGK9nfwL-_s4D{~kwGxhBK-}J zC$jxQYeG}NzQ(C|QctV&b<9cp{zyvOX_IGSec1xV2_M<6w%57lr?kYq55XWO1S3V3 zXp*Na`qv(4aJGBgBH$;siQeEBK(TMa$xNEh`Eshmbpjb5i{P{A7rZfh_R;-%KlyZ5 z_35Xy&%>YISop=BW?zA%Jm=i!KKCt;Wk~{$LgcopMM$)#qLny!Pv_&)sAuz@=TYzFWYf6pyVyGFCqJLg zrQ@6U7OH!KcfSv^>%0OJTs@0o+ABlRutf}YVVDof+B)mOiDWSH*@26B+jDn&DG8%yOXjd#ow{9uJK3yeMMlhe#B{GyZm~G_FS+n!BNY&n(>KN%4qv{ zn32Alg~ma3rem~Esp6C2wN37k2BFc`XBLW2;0mc_g;a3A-<=HW(Z9xzZrl;t!`uE8 z!SE(GbLBwX!=gp?Y5~QOUfB| zzUsSJ-+wW8X40=1ZByKwd*01)6n}!UWP5RjsA0P=5N2~jfSY%3aLtf`HDp-yZPm#c zk55PMp?Qm??0FXOT$1WQHjEvzP+7qObx*X^hZXh44C9F5x6K}AQpQz!vIeU6Uvu1> z>?Aq}?gvN*nkj&M z2M3gV1!K+coPx8ECv}2OP+0^tq|y}~dYT{HYP+7{q*F52#SB-SuDx5a8Nxr_7kj0n z3R@Rm<*`91AUYKV05v4C9xZdP;W$U6-n42 z|Kh1v9PE()F*^u@K`2ISmsRgaWL~MFH&LOAOj0dA_eggBt5pQ;okQg8w``C4AzF4tf zAKS1NWYqw;v`jxrC?^u@-A`jLfUyywPLn>da#`IBAYlO40rS^C-puaAhc)VICP910 zIIH{SVmGes4oc=)5|i%FOwgzBDSWGC_94?!5u{bJ3zfl9JnOXI-yszeDQPJ zSl8FVyTWQiJT5bzazD;xd*wubs0dk3qLkk36V!-&v8t#$ZYN}Nf-dpX( zE_R*G@KKqR<3u1r6SAa~wlRNS9k!iK@`*Kq474ujRC~KI(dqWhFzj?iy5*j!-^Pz? z>eaJialO)p|H4mw!rdxY)n5SZ(Ow=QhM1*$pJNA`J|dfne-Y$g3oHIr2TPNN9W);A zi7LS0AYlPlN*einzUsnoz#B0Od$U-+lk*?^#ILI6h%5(974VfSTy=)eyS7i;UBdJe zd~IE)6Xkb^vG9W#fiL!7?ww*gsUW8TeI+!;M|8es!yD3v7jQYOJvW_uER#=-{5cYL zFfRG$((B@LO1An9zrS^&uY2odc>WBhTNYwra6G?Htb07|vR^A*-fsC?C1L|f2AvIS z+Bl&S;grDoJ|G zhXZk`$M2w_x?fWkPkTZBc(GcQTyM2UgsW1e@70sje7f zB^=lyn|>l8c*+ALa~jSI>CY-D8hlMMrvD0{J~p1lPytyDcP{K(IW{&#Lw)$-WJCNSHoiU3Z z6PB(RQ(bIX%wHi*$Ko8^cBI!@`jrvv`1{iZJcRDhGZ-K_@&$`Pvv4r1%;WvJDo}iN zs0~l#LR;RTc(;eoB~Psd0$e4lPKLGl&-9gj^(o=*RIBD@LqJZ6OmPhraOinW1@i(p z7hLR>)bC@YbZFF;3?5PsK;fX7IC`s1_yF)EaSA+^b9yuXUBYfe1G}c`Fpl5zDo&tO z2V3yPk3n0i!u+dqA#bwNyp%O=q5*(T^qKAI?H8Gn~4Br7ZOv8 zp93tpO#xZQCyB?~>1jg#Om?^K?OY592N~`2#NUOKJ8GZSmDxAj4!-!pWPQZn`_g)- zwoQpjMPbYjd@hxAbBQxY+~&#U={MQd=ON;dIC2@-F6LQK zU-*>E0;D7>gFl8yKwV@_60c}_-4djaR2RmhfTNN_*Xnu1?vRKS}=Oa_)jEg>X|s(p7>eL`JE@XpesLN zSi1X&ng3E4f<6*yJ_ae6aS#f!Tdg)*|_1E=WuB%)zr`h-3ptHbOWIq)GfyHqNWeOt{(*ZKiS+ zUVd;o?gzRk?Om@2J(!Z+wG5~_ zoz7M%u*154De&Mu{5!||Nm1hZ{>Kf{Xk;c)6Q!j1^K2EOVmkUklD0JW%FmFe+{Y0_ zt7;?2bNEhm z*TD~*o*KA3kJ}e=nvg611>9TH`R~G(t>?g>rW;dwy_WxK@2!d+(J+&<=eou)oMs2Vw`6Ap_I>Rot!as$T&RlocdnEQfAsuVDj>>Udg9JNc3BFfd<)E5oNqnm zMsWvb6Qb8(aV#J|#;9^73Mw}h8F`@tQ-3xGtEa$zU+g`GJf$B|Mj%N>;oTOIF3_#9 z>P<`&nBv+-rEXD>y*Z-*?i*Zp^a%ixNQDGi(0;AU+-W$6iffMd#C-*PDv%QRs5aa~BldNIMbjP2EK%k|J@u3WD@GpFO7*{Ea3+0xZhEl_6)As$gxO$jv zvUR$bc=KWUfO8t;OEjT)%ExQBKD5nHEuTt?H8?&tXF6mB_#ZVI;# z`i$;Bo^CBqxQ+AgNZhwl2e=mnt#RB0V>pTU032v0@#i=G3yg{I5AR5cdF14xSxy$7 z+Z_lCBzxRC&Tnr-qfrrW4r|lVa-H%4KH4%>_64qE^dnN^e6TV#Xr0GEjo<&xI$O|c?JNT&&>*PU8GUiI@xI=uJg9FZ* z=uz`0lH`-KgV(s6$P3-@*X-3;K|BbacddS}zMNYE*oaP!0%k>_;^dB&t2DjZFgWTQ zHm{6r1>f=i3Kpudrpo!dqJJeI5dPJ}gWZJkSsH(<%6Ir&U{^^M$e5kEXao8-yf{D* z$%xMW`BFdVOc|czJE`7Px>oGMY!h<@fI*xJ^6uhc-_pQc_e-M6b@SAV5RNL#qE60mx0GZf#o`v5^r<6 zC%RDx*Um;C)3%|L)uBxjs6L#79Da&Z>p+p~mnn|gbwCWMuqB6j*M+Vuej=~AUB0b% zU|!9#aFMsAq^>Y`a?8^^>)4Q`9_X7DQK#IkVJQYb3&$9mKELOh>~>+SQ#mVO7AI#1 z!CDbSVWqMD`YAl@1iUokM&cAE;y<>UB2lv>*M37bpZC8IaD%>D<)9_rYvIZ?hhKc zoI`Vk&)C8jm6=NUcOA2VgWjEJiV4ZPN*%;S`K*ADgoNCVoC7KM*NXmQ6NMlXD0`64 zLKSgUQFh~(S)o(cez4Yz^kdHwOR=7Y#z&|}%^Na&G_AwZ>E154AhZRB z8@8k?PrBtYIWG#b_0MF7!iqHY&?|X&Z?n}e4@CKtZls5Z>?eh*%AC=Unh`o3e_4=2 z9X8K|AE$Ryx!f?F;{+8Tow?^;-x)gl`Y$T+SF-G2jn8>XMyFI<@E~e@U-NG5;KrRU z!+BR{;%0w%;;3EsOP$Xwv6~8|*P9S>3hv{CSspifwQP;8;k%M z{TY)#g%}KALH8M<{~$SW$mgSxBG2^;EED}~a}8>UB57?VOE&%7@1vbgcr{%Hb1{GK z#s3}}I`o!=+mNF`yFy_{e1ESpSI+J|!TJvi^ij=P;KL`HDVB4=Zx$}AEmZ|1J#hUO{E(k0vpKHf znCLqB;@>}ywpK`+P(s%qZmuP@P}9CQod!-90FLx3q6O;Zq5lEq$eDxw#o{_|swwD*XJQki6CUp_F?l3gJ8P0$L zSJ49Xzk6g7Bm$C&OXbAOE7!g|_EyuYoO7(KwtANo5ub=HKfv%@ZD4u>cHN481P(ke zupD5@WBbo_Cc&O7Kdx{SN&O_cG!1QJMdKFKmhhZZo%{-A<>-z0^a}$AozpSH?hjSa zMzX}7bL>!3#l8;6726OGceOkmxYMr9>(`<^OYGS*_5?!<^Xf{5V5)8Hn z4*GBr^0E`c{m()RYg`&|Cm9H4Cwx1BGc*hrHdi9sm)y+ffC!Thdicv*vbhtQh@x4o zuz_lA1?OUw@kbHOfK6*iuYI!@glf;m_JG~!PR?-Gfn1XVDOtUoc!iJ?>dlXN1?=ZNPRMZ_)5L(2 z%b`cE?Ko@0b*V3e)E^;A7xy;#bIXw34h5#qB*%Y|Lb~i|Vd(}y0=Fq?t8tEc)kW%kk~mF#u5CU$N?C921a=!@bX~+~aIJpVEHwAoMIK$*&uc~)3XY;?6u5cZ zT3R5!!w(iu=|Hk)6A?2ruG-$#rt;H8IgTuK8{~sx8l$|)IVKscyy65V(Ji_5ei(e{ zUkmuYka;>d;DJdS==IkX;b_~y4e_V!&_-w-Zle;IBu#v~qbn#0Y5@qtH&8bUZk4WL z0nreGhRttv^^QKq4a{^(d_y>rB$eXAD4I51_(&I5YBeFqH^caI+&*>2f}e01E~c-E zXMjuWeM$uiLNfs3@k{4u3Xf@p9msU3wBc!Ocz1CLK~ zoy$2-hcQae?K~H|MLnwnSB0AJ0jTs%T@d9uQ4AO{FRW?b@yJ0L1wDGG%kPmiAR6*J z63b~mhfZ|skh7Fb%Y>eE&4pZY)1J{AZSYtwT`Zr7;{yjebB(2HJL8}LqVh>yLQ?%O;=0kl<4 z5u-iP_M;asDJ z0T9eOJGBV1l68+_U@f(Fxue9p25yYn|C|LC-|AI!pEsl#=jm42Sy z0YWS3SO)8pGm)nYcgUfY6g>+6c&+C@kq|eDowo<>^0@QZL`8@N?yiYju@HUHXQ%?F zgb30KO|!Ady$gM=pCxM=$}HKc>*kwS1F3QWrndP76+BX*cXDxcBH0&a!oTd_aOem$ zovU^{pnG7r_;LOiv+S7o^~T3qBqYYCYw{1p{x1HR)^R=);3;UT{5DS9+x3N@G8pKI z=ht2^(&u3{y6A4JfR1nhNz?V$4>d%nFuvnz-8Gv#i3$E2@rb#TVOl3XGNu`-J+W}J zO%GHZ%GH&T6;?EXdPz1Yk2I#Bhn(+QER!C$Axfk=Vv&--sN%h2Sw5tRX=Q#@2J`q2&}kmyazyH`q7s$qJFI_(k8oa0g@^Y<%Bt2}uS z`#ntH4I&!2F+3SYC9C;vb_2W)oW#TPOB#-Y_i#4|tmjPKi#Y_i>H1m}YAmm;B1kD{ z^e^kxdOg*dP$a(5b{Tzj;ulGjotZ<&yVwT^{kF+_#F5OJg>XF#jX7K9Z0IRt&UZfe z`=V3(2WrD?NAb+3Ek5W~)4x0S?@&mXijYAIrgGYnr5@VqR{?KFEMid2B|b zq7RAb`sU?Sd_(BcbNbD!gU||IscGYQ3Qari>b@mkewE2nDJmo{MbA4Z=Jy(^NB6K4 z#t-ru<*a?>CF9d{ZuDYG(eRlEUEH95_=eu06NX(!R%x=$8_x{xU1BtADyMr_HALQk zx@6H-XNY<3EzlyQIS`DDh2}&2lyuT9&6JL1ylaH3%9HL{r!%hKfP7{$8=q(|Mn73{ z1d}v0HOgaZvB@Ue^1(M1I{%S;UL2r3#2vDj&8A7*w|X@4&~^WK@M)_g%2iHODuev9 zOqdC|NrU*2)nNx1E(uPSO2x3Bkeg%ytW;Ra*U+vL=VTy?@SN_FkntxTOq)yTeXby7E5K7m`KiQ0WcDJ~)pd!qW^RTnG^}~5 zZI_F$!w)~28$~Wn?+-8Wc%kD@XW~odTbC4mAhM)5Z+9n!?U2sSYCAzc&QiEPBHJG=Xl2USy=l(aB36_m07DvyPWNyB@z>TWeH9X2+>r2((qrTs zUq4QoGb2*0l-2c)($C>r>dBym-TI<;1WtR?!thxYykV60N{6auLr-!l<0>9#Bi9g5a7u+K&$eW_QSvWYE&}X-nGfK_) zm5`Bu220pJX1IgJsIxHDWy8>~cn<}$8ZG~795{PHgxQ+<7j9RQEyz~$VoooF(ZEK7 zkwO-`JaxMwB*i0~xjxO1;^Y5H>FBF0Xh`n@f6A|a}{sF8&% z7d@A;OoiTe#qoR1Algmgj;423-z=C=IsSq%QoURwSHOMN(ocbod5R~7x9r(TC_-2h+j|<#C zg9vap9^iM1e)V513+j?X@nJGMMfY@J7)c_-_FlD zeUZ>G9Sz*>)e={vaeKea+13`Rriq~h zyEm8W96#9cj2CyxaiiUz>>A@dU*t2Ez?+2_8idAXy&RXe3@2aspZoC3&+`lev9_Ns zT-KNcY;!y0*a|weFVv272k)(*)c6;ZzC7M#=1Ipa*fCeH!+CC=dI?4lRm%dUoKg(6 zTyvZL!To#nuxi$Smx0$wp}t9)Wg7%yAR?dzat>!ip&XuR*5@nYvz zXtVQ&-w4|zon+8QHavVNFHRFR-z=rzBGjkqBJ@a0{HJb4Y`=r()-9!C-W{VN5I|5Q z4tpBPiaI5#PHtGl+m06`<&wM|wC=voAw% zJwZ*!Rl2*Y%bORo#+}u@ydw+RI5?veUA?*dA5GX0Si3E*mA#t70<8N1Fgo(fepty&&wL;^AuxS)}`tKKLx#t znrt}I^;LP7d7zshMq=e>uiDmo>V2k0KCl}U+pRu4-g>OQN6_6j6zWGsv-T!lha)~n zYmeeg-|kH`P@eU!HHx$|zIz`Q3z`vD=Vj3Sp3JmZ8(eKHB6fVuDnF%R7gSMv76ei% zhnZwTo&wc|LO?i7aEz1;=LIuie&a53m2cID0eA|HGz&)b+nvO``^2ERmldL0Am}Y@ z=zK%7L6{yb!$}iWr2J~@mId)>h@)?-0bfj|EYs@{%fK&ptx3;*h{PF@z#TculTQ6i z2DnYb(DgGEZu?uH;5lGjl+Z%nFEC@J~wgbtM;U{Yw@iL^(Bzt?Wz>e|6B%#mp!WNd{Ko8v$N05Tz=n5xWW36m3W$Hs>?(Sv5RjFi=9)m z8j9ft^skgg@f~=U{|8%iF0~aqc0Ym$u9~Ln%ZeJcVlolS27W#>Fm#I-I)DKFA&Yp_U%WM? zBp#JHM*B;<^)YWp+?X)yNl*@#t(f0bc*Dj8K1OCf&2M5w>a-R;V5o>$C=Ne+4l?)ZmTmlnx6LXHbi4L*@nMFKB!TQjX3VZQzv@)^Ub$kQW9C>CL;k94^thyaL31z@j#g5fzukZ%oXeogYKiD16t zCETQBi8c3-sm{+HfwON*LWf+w>g~6(=40OAk>1p;rTw6ilu#8v)#HQTKTOSQv^^!E z1c}zNLNbJAHZ=LA$(7g+;w*?!8AW29u9%++%~P{u=-><1a}+1xc@O-PtW;k$p^nd( zJ33b1SrfbsYFektPMgQhLKDE{A#I)ID&Hc!YjFrl(6%k1A=jMaCsl ztmbE~qh#8R-Ub8J0a$kegnMM9tH>m%0x?WD4E`!w3sW@u@!_pXFn^$9F8-}So+Cvb zv#@{U`;?^Z%+j_-ge*A3bwLcIz9TbAy?L<{pw5O>#}2D*n1;aWX{a@zl=mv|)HQyh z_-Z!>cC3USj^Jfh4wg4im=a08k=~3JnK|y{l>{trH805p0Xh)w-&qh}WGYPT{+vMT zD)}XUjHnIQ|3dv;rN9;*nCjtv62J05W)72z>t4WVNe8T|ce4u+iLDx=0VTO`T&dS$ zKnZ+PaXT~iBvXN_RnbASlUdaj<-omSK@PshE9pkZg_`m(x?IgVL`%C&0aDg>)h(U$ zUZwe5XbBWp4z(0rm`GaemK;U{E*ZKVwipTM6G!NUn8VkM`(CJ;SaAWB`T4k)WcT2I za;gnCd#%`^siiM=@gC;)WPmRkcHT|0DIxn$pSFYicDq{GbKirCM*@?7oG1jeuZFGX z&%nWOQIhYrD5nQXBc(1y{bB7y{6JD zo8Mk*>U}m)yt7@d4m)zmLY-J^p3d{}#bn;PPGqP{f5)cJaJ%pYQXrv$U8z{|Axm<| zrxfrSlMXi0wE2G+XeCHIUFUa&PjYCv6&~C-ydCvu%FlLr^NFv&(0>ddkJ0?RgcDn!zL85bd+DwRqvqL` z;U_d81p_LMb^afDmWk>vuA9}<4{zRw9nlLj7C*?I@BoDQI`>aZvIHp`+exozUvu-; za~sgexSEL4$vpY=QT}AUKfm--Kid&_)}}ampK?2|i^eqwIb`bX_+TVdA)7%SS<~8bCm79#q?cWC9UG<$O)H($ZlLbPpoer{s#m~$L*m?VviD^N)yhVd& zOndef3mzpb*_{?UJW?Iq9~ygPu1&bDP$Jc~2cJCWa$~@4v;`gG1%nZHdoHV<>e%Rc zgJ-dbB;8`=V(G@=oS06K`JwFE_Um}Zzb>8WEQO$c9|HOSuuNkTWojjYFk5;p{sqtM zQK_lPOgj%K*2ylAOmme2yTRPo8fF3GDt-f03$uOI`@Zr-u?V1%ux45vrho8)%_6gQ zBmz?U&!YZ;^HCy3dG25R$vh>wfy1XumC4zw3ob_*P*Kme_KTPp9_sF87tL&mq7?1E z2nYstU#>r%sy-N1UJFMK0Tb2NGkZ$oEye1fHM3>!B?E&eHzRr@Ona z^)`WCwC2EP4|$qOyCZh%6TH8lxP=RHJUGEPF@=7{h ztPhC@FG^EK6~IB}3CTFUuwRerJK|6 zq}Kwi%%l>nxUHFo1dmeiIGWFU?$D!=g%X8l+sVEQe0K0dzpPv4_%g-(m5BLj`WzAA zgPZ&It5M-un`F_bY|qJMhRQmuMH}b8(SQ-|S)t|7p*AiPZHq4rqGI6xL^R`gU0v2l zoPp@e6RsS}R7bxXn}>v5ufm9=5%wuJ!ke$*)xuGCc?&x9#_5mnBux7lH)ByA3aR!% zy*t}(Lo^n-m}?s&^K{NR0z=6TyS!`q19iiiDA!|l^HbmL%VtG|Lg6YjW(; z2<;alfDV=2DV8Rn_eId$vxToR_?Ew4-z8E+fH9#j{N0kzR3IE*{LeG zJFk?UT(N-ssn(BwZ3px~Q&8mxtNI{Ip`@ZtHJW+ZQ$Ec>S%XrmFcTDWA~C0Ixt_y; zV%e$S{B<8Nb7+%n08mw1mQ=dPK7ar`!kz`2FYzA5E%rf;M1Qy@InZc)1&0SMPpGjj zx)u)I9_iQFO8a{C>4pGnVRC)}mBvQMvqp1vAD%x7iZ4h>2wkJp1ID~3N+fJBw^E{r zM5N`LTxD+O(=s3z3nGE?p5LB4XSJc~sT|l?rBGcrM{5yMGDQu<9l=E~uE5$qdlS_7 z9}UfnIJVsO`2|zbv1ma(9-24-Gu1IuKJvVo(2ztjC|trwama z1+L8oxF+Z}0d1UjHxF)T1Ja|TCa+mmuylpRH6Lz2gzf#)udomxo=yAoou}2^-eAY> zM(&j4zpsti<1-#~{|o2+kU9OA!qpwH2^zf|G|LwuRYJgT)Lf~H#C6l*AvY-=-&Oz5 zzAeeuwKaDK5c`Jfs|PY_&Cy?Er*_(3(>W#e>?FxmqccT>UjRWaqA6~JcSkPYuTfG# zI!X&m9Sf6wZvjseBJXS3<#ejh0+J{qwlwfZSIm`eeOCcNpVD9znRO|NrNhUmOE{*C zV+GgAWwe=f-IdnISxmuu-%Klam`=(2s*fLsyN(*eLyqAO?$*N(*y8E6_P&Nw8X;xb zr_9ok#>qe-$J*srPsIyr*{|wexK>;F(hHehR={PQLr_3+IVXG$$yk9xC4wSe_1N)4 zX*(hTb$C^as_^rZ!P{cDfwIp?G+gJY7U*eCG8S(PP=WNj!1SHq2??xugfcI`mq6W- z_JmH8%Ak0FF$*-p#kow7b9A6M18h9B*(J~G-+8fJ7t|Aq1?_LXGtgKdXjbL!JY4dr z8SSblx*+z{>`r z7s(a{{->E}>|lk#h@32NU~TZ&(GYELt=E*(ROs6tx%PSx7CJn8Dzl(?IkKmMM{eps z_xrVug9V!5f>Ras3ZFw?uD+eJ@t;S;>W+Rt+`k?irK3~&QqF-t1Vg|A$@W3n>a;Yj zN2XcnVZ1|SEEn}m#CGr$Rd-wBj5ncf&1sIpU2C9E-(Iq>E2*n-KEPY$m)h<}gBY`p z(l09*gW22vcI2mQ8wcu#bHy}$(p|IFQ)`7JI$IDx>)J&rN2hbO)a<35g$wBFRqV}B z8Yk|@GQ4(?&b{5cr#VHcA@)%XghD_jVUzV-p?n+w!GHo$xe2xJcF{Olg!|q26(*J3 zS4`$AU;0ZIS73U7}M-KN|D;pIDSM&KdM3d9Oja-F#X`U!@!7<%cu>$TL|PL|Y;ao~?GIbSo%q-tyhd{6 z%AO0F)&gStkCO5CH+Uy2r2yrpw1AjLZ~q$l{qoWYj+bg&VJ1&vJCKEk^C?<>c>E3(nR4=m59%5!v4^nc!)_0{}5%G-UN;?uHzWPlFb4X#7w&rsVwh z-+n2GA{%)YE^woXhX;(iLJct)7bWvnGr)>qW$4~`O%{ zz#7j%0=_EG;VJ*-s9kpy&Dn=2z2fkX%ab#&sd9uC{E}|TEcpH1x*|o@jd7p_(!QT9OIcJ5Y<@9RVZ@e;=B?Y^6Aqu|B)4Aima!B1AbgCttSE;)>?G zO-UW9k(t(Fc$mvnjBMJ-N27rMEj;X;27us^c1hJgmZ9lRJ{GO}5D2b1_Wdi^eRao4 zBVx;w$M$tx>U1Re3`S#jy-}+xjW-g_LO3xOECgC7Jb1>rIuJJnOU1IMfr`~B1=(;x zUFDb^{eHG3i#yOI7efE8{x)+wd=#Uhh$Adk$Tp%Jr%s;Y_z2b^H%?PKHB4)vF=e>e zc2%D6*#{7Wzz;1G`@wDJT1~UFzE_sJy(PH3oOCGqUW!TCAof=Bwyc6Q1@V6D3==EN zc5pr2{!ja+XAl~Ap10LC9=f-rs}#r?c4g8r6&KrPBRa0(3@U#-Mng4`-kvktgE7%^ z7|N`2KULv#%;3*#3QZR?tMx?zNf)!h5a;cmG4ct&qUPgOPQk-uAzo#tgEw(eS)%k6 z$h?1Q6-VKVk<`m!l@zAtrUnd=-;q&kv?(m7!_``}t1{ka_U(tH{sON7pT(up8`SV3 z@-@I?NbC>iJ?cNq!2QC$BSDq(F)*d%j=3EO-!F5(?Kx*_j5_>{mj#g{2W? z6JPWOmM7VI74J*oW2I;2ysjnY4luJrj_}aZ67*0r&Z9Hr2gx$<t90ZE{6bo%;mM##Q%vw(z z4M@^$1GVm3G!f(UbQF<-E$Ft>iuau_tAmiHp?sPM&SZU3LaNTLn8BL@{puCL2P9%A z^ja?fV0LnOT6K%8DU0gf^^V5O$;ChdoiL)N(Ti3j3%$f3R-43r4Z z=LR04hr&|w4`_5CAP>l>$V6*NL8*BQkN?Mp+A^%uynvbT`!+3CD|NFEuH!GOL-Kep z5e)P(#tLwUyn6@swjwB+|8VI6%?{OayO*($COGdU8)J3=lmKZmztT?B>h#2zNd6PG z2cCbG;$OZLT>XkyMt5*sfic2Yx+1Nm&1OLRZ5=kgh=k{Pfjnux*lT=~?++f#yf}n| zR*I~m`=@Av?LhQAvzFJ}IOEcyvR59TMi0+XB2|8=uV8!Vb5egl;PoufRGgIt03X-+ zk*)?Vus4AOXgCQ8*NSPu6_bX{m3!dyO*wWl43QlQ*BB z$FoHjz|t#8Cf8Iv9Hg}fNU2-SZ|h{!tH9O=C6`{;(mb-fBj4~e72Mb+$OLY_HWZA8 zvy%AlBHAsu*a&s`ats#d(k2bDU$0+*t(rU-rzaL`Y$ox`6)#dO-9;4XS^;coztcat zt<&GYRnNDXw`~BJX0|>5b2nd<#=Uh^9kW2PY#P>Z-)(sZ<#$tF;yg(Iny#2fKJ86c z(_!qV+!JR5I)U;AR`kA*_?s)UV{yBT`#jctT{}!Eg%dJxN6*^=duSEFVy5vggIm=z z(gwfLM=g(4gG9~Jzmt^arr;HZMPg6&4XakzG4PlavQA15nYn9sDLq!{GTiaAfMYKS zn6X4tpIvI?TeWZsLOZZ+`Yni%uOC-08aV76%MAZqtS@$*Hw@}@oa=NpqI?Np5;JEk zf4~AQ_68Ve^oF!VcOGiT{q=7LvzE9~SIoilGw){?=I#G#9c|!P*4{+a=Wd$BH!3m~ zh|?^uZ<>!}EM9@QgvH+IX>vQi-}2Q~k4|ZlU^Zi%gz&QApw%Kl<#&<)g6y;<*Ln0| z+jG#g>U4_H@nAFi$}{cO9so_{KDe*HPCADVtSliAFCG1%(O%pP^n>1`VTerG0GtiViNiTrlHC|TBCinhC| zYDSG=heO!Pa{A@R0?W=&EYEZ+cm&{tdJoPNpp{i()9q~cK)zX}=0*#L7$=PFuXI!7 zyWFUui9L?Xdyy2khM|*vYUw*KfV>Kkn~Yu;C&k5j^&3D8s4a92$ zy-#7Kw+8++`=!R?BcTdod!t_H2=hi{>ybt5|DW`;nScH9(s8JW{r607iFx!A17CZ0Z|r_c_P zU4pbrQ8|ix8ax3A;_J3M75>ci}+12W3Q8}!8gDf02z zyuVOBX?CybdS~J-C)?U@CXd(u!K5Hr$zt61bHJGV;A_BP3M@E`LtZXGZlAe=<;G{% zi7!wZ%fIxZ@Vb^zPg0$f%b zt%5XQL4I0_zRf04JmkK;(;4O9YLLeyQLKEBfu3u0Ft;u>n^|3G0ZsK64`|Y@u6Z9; zS9Pvrk8eLG9pw;x)yVpzxsR1V^X!jOZp}KNfkSy9IW;Lu!Mx^qD-W#2zn1PPA=Qt>Twh4H>yYJ`Wy#g*(C!LzZ&#*8Ee>u z*>ygR#&$>;@o5=^G>Ug{bnRH4B*|6%&7nMLK}AFIjU+t(N*p1h+OQHEa>HFSAy$p< zbdn0lpj3wgc7yEfgAC!1GtoeUd2aKk4{WvV&&uh;DKUn2MW*_D>VYXI)Q|=ga2)h( zw(L1t50E*0FY~LbhROh2y1xmhM=G@EWWmh)?p z@yhdIPMDoBQOB~@-A_~nk^?h0v2kfCSlEfHi*!N`j^m; zd3BDJC_YdLD$=~a=6M5O-oerR>6KH*a1q82C9$zT8i-1yb~*(rXpw4VK!~m?wJ`QH z?*SJQv+jsXTY!vB+ra;`KZJvKR=oo=N3TvSxn%bg-@uU2x#&OgA?U)NrTPH8>7Vr- z@ym-U)-lwqvKx&V1tTNA-^eLPp&w54-d3z-v$+JK=~MJ2T;&(0eyFn1yQwu zMZW1awJRL=?*t)X#{}?Xv-47!e)fZy8YqD-Po82yTjludFVk4eL*V9W9H=t=K;d+r z?l%?N`K8hSm@W9F*7~L$-H2Z^MoP{H^yp@`mUB9jO}z7+7n|pX^YWj(7{rH0LKaRGb} ztO~32s4jPL%vUkp#p63$ilerDEA5~lcJy&I0Z!0#U8TFUE1N>7-oq|+Ok~;3_H7Vj zOl*Twte{vM&n|~UQJuPmf@4ND3L~pxlQSM-S!5|VF4QZC)vE0uXKLsl4H@-NM1E*l zntKOe`FfJd!g$R`@7}1m9=fF+v_NI*qEI9P-+}qgU%?_it8HN>sD6waRKW|CD$RV=u5sMpY6CoX!Oq58JB-cu)+5SQTZukT*Y z7dYZ;C*{6%6zX~T?b|FrILe+V`fzae5iJn&?pKV>QAp%$yHsOIhg8}-JNl`}kS zCZ#m6C1F#lLeiHIachlW=@x_&+dkY4;=Z*&!DXDfZR;6JX-dE@9k*(IkJ!i#(>$9&8R$Euq6BvlvxEHf6#BS&C4?a_>lMfmNtLU=ppRKV&uz`26JHNqPsMdMf9W#y2+e9@Mml9{*S1yj%&L8 z-v8Qylpx(D!l)r3ARwYr3J3zDJETLp1nCCpR1rZ&_oyii13{FohZso1$dSK$}X5 z9VwL(*o$!$1b-@mZ7$ZVkG2#M9-$@rT(s4i>n8Vi7j6@&-#pdX7}{+i>XYOgt-q=} zN4M6fdk0IPqd&(!`PY{mLlqSF&EgXmyI96UwUMpXrHfskt~`z{@+az*XZ*?XMh5>r zivEjkXZnUi~mA>5ql zvf!r9T#QOVmt1{L+JdTHbulBJmDP1ac+TmqV^)oNqItaiKRh%!Wd+MqN`j&N>+XT=C{ZFx zzy|5wfAy!SDN_9@gwZPYg;Kd%FMIRxN_VttZ#kFPFJVi3c-eu;a@1ZDaUlQd<3kRt%Jt0y3AD zrv}tVLc;%z6kD#0)_(Ri3wd@a4t^>-6Q{>lO=!7gKh#9bK6&Z3XbkqVF{PB~5KkNf zkqJMDlTMCIfru+mDl@jBbuZHCANZYY?M=t^r0TbVM_xy0S*7Ii!M~n`DqEh`z=?(i z>=S~YKMAzLGU9y~1uQswYqF)BEuPV4K*(YHZ`a0zOijUYT_YdLvuVD5?adFq!>?;0 zSwSsIeL~qVCE9L+O5wW@)rdZC=p&XJMElNawVPktANs;d<0WT|ATYJR!?bl8aO}&n>%haos z5wxxSmKu;&G-uq?Hy&00K9CM)KU6Aed{>?Q)w74QBTQeH)J#xqC~A?PaZ;cP+mM<0 z?R3+Lmg3Jh1%k-BKcr@9D!MSy`)qzI@XT#a1C2$Ia+bbi@+EIA!{Z4R$HW1A($Jjj zr7ZDI2x2WK3bgQ{JF&Q}6$ZK5(V)-Z8{}&C@@R-QN|k^<>Cn`oYcKE1@t`m+iM_^N zpKZY8eZkaf`oc-H@}j1G_#(15zwT)*%3ZKDie{gV*QR(!C3GegC_At^#w4Qm=%s#pHk(w$W4k#eeM#iTC}(twx^7aDfM-G&zupJ zJd9m^Z@27FL1%mT$wJ$|ZhATH;pl%|ZWGa1sDit2mWL~mMiAlI>U4MyDbrmPh`Vy5 zFqo?J{eydO2PI=f(vPB=B{_8I*Pnuze=@9l zD@yvuO?+)2tQTHlEt-6%ZX%K@)4$`25jhn@LosPKy6v!cn=WX6O{{ls@{0^VP0&0j zhjAT_q8S+*=;M)Ow;O3(`Ijj^IAzk!_OzSr4E7*2xk3~N=dx`OW40Cbr4%L=w*2zjoiLPCG#|(ho>jM zq%uZ*zSfQa{!+j9_~z0!)>9{a7_ILW1ou zO=RzS#TG1r=x3?Dll7fOQIGU3>wS1D|Njx=R;ysZ?9Q9xK2KKCODf0V0rnrtEG6}(2m=B~FmQjAYuH_s7#kSB;ygvHG${X;a1e37AKc^f7 zJ~qESncXqGg67)aOho0|h9-R_GSk~GB1_wx* zej;TYNa3nZB~a6oxbjtE{ky%N$8$B8qjlNmcE~}M2?5%eJq1(wl>OGHnQIxjic;#}|8K|-FAwjNG{Yf)=sj~uS0-4CFe}(7 zUm8POo)H>s-g|Jc6eH!5rpt6d69g^hLx0zCQ!}}p0={gkBcXm!oLv%lkQ=XDeN*S| zz0Q4XB#fUEEQ6aTb?S+)6wC#O#b8S=R90ITZJhO;PA&bNuLk{TgY;wgD`nwbnW=2O zqr2XoBB7R98y(dXqB$Dc9<3*|kE4n=gGX&|wCpwusVPmd=O&r~%T~DOg(|Pyz4crE743!?9+FZy^=Q@Vwhaja*&T00 zJ)NAKbGQkOew|Y7zZg=xi$YC)xj!L>W zS6xMVroF==n0d`rjtC@wbLi1+jf89Y-H4zs&|YrMlp2iHJGwLdyWqN3#dj{V z+V`smSlY=Jdk@{hH2aC=j4iH}J$dPVL9n7N9of8%{@lXs zO>A~E1WSY>J6Nmb2t89GaJ9F3IkS%sN$S{jf{a z-u0$>4;r%^!KNp??dn;drd9|7}I-rkd!_tmQTov>!5kjcJ2^ z3tmrY8Dkjj!eI$A*z*RzP>b85OT$}Bm|E!UJB4r7*xCw(LF0v~T7-1fujgr94jXvfHEphe-*V$JY1D7+IBd58bYj27YcV^|Cm1>P_`iuOXO48< z2Dxix%`HZ`YoXJEJMx)SyUQf>Cqv_HOR;g1 z<4k6=(jLA?b=ZQ@;M--#-BT+Rb#>DIqhWOPv&V=WftUUZj)n}00Y&|KFZfndrxOEO z4r`+H(8#0I1$t>G>uEjG3+L`VuF2`t{ic&|h`P+q^VExfUVp|ed_x$7Hgluv)2P(xoj~z96t{mjYBTNO(#DR!Y`XO6ukBPa zLAROeIX>@K*`mI%D92wXWBNaiWLm`S4;U>-OV1aZR9o1GW?YxI1+)hk1p;UTmib^e zwFer{rfFJpJf_=`&*m=nRFOI!Eoa}Tq}nbVoPCaLk%+2Ix{>+bqg**h#2KU5K*L(> zA^dpAEjuh)M)*JbUj`=?<%7CYj|0ZWs5Uc5`%ZrJ^Gzuqghj+NX|1yFq;aQ(hZ?h` znD2U+XPSoBkWsvLpBH~T5K8*dOiBzFuxQEN1vG{G+5v>K+zxPurl>y3Wl0y@j+rbQ z;yIyItWp;Arr^5JR?waKMJSIc1Q1Y-=(-Nhk`Q-8s5B%d7Hd$#4sVEZyZFKIg zV3ZXS1KGa2467=?6jI|@d7=pZAdoGsw0!xs+DM4bBxIV*JL(U;Ouf_{2)%GH`^66k z?VrZ1Fz$#v@|mWOozMQ#%v^`)OZ@RlBL_M1i?6xl5|0=Ot_&M6P19*TYD?08t^}e7 z{yW+4Fnbt~*Nn9ANNU4=!ma=f*Zg3FdMh+*JU#FABsXBafL9Fby4_VC6_B%bGmoBS zOeIlcPPB7DG~HD0OE0H=rm&!|UHjOj5!TUGW`#_#M$*~ZvWzG7+vEqIt?u3IB=S}O zxliknoawO$M=Et<9PCe@i(X4%Sn?3bZ5Im^EG~0Tyn;xUU(OhPV$?>MT1JI~p+Abm znj=SQ%c5{p9X97udgJ^>e{y~>Kq@J&S-aR7i$wg(cs9@Fwd&{ZfYWtQWJ@+!)$*xl zj9#haOG*(ny$J#(3eo5=UV{B+Nv}4-_5HW6ejg+?>Bn}&t*EOIl%NF)YHUJbI!f^< zGTli@;X3uJ@Y-P1-#m198t~<2go&VDb%!Bo;itw3GK6CT&^@D=lM$ae9)IQ0!oI3sfC!Iz z9tcNWN7$S#3NZuZlj~=SRN<$FAM9o7?6wBHhHw_DnPJY>GIdz`IH}Cy;mQFA)zx$W zqouK@`jB0-Ez#ekJq};AdFOX$Vu!J|$NC=WZe_8|#TnU$P=-`(x2d&(L8VxqI836g z+mzm8-c*N1>2GH?Zc<&#u(8}PbGl0L5L=W#0@M8yw-0(7dq%!h0~C6qQTI=8sH~V@ z3$>*bVt7#CRh+J+6c4s>>Q(qhuuo~9+FlnRX~3kF;1EEdCU1Prmya}E!hEi=loJS z;ouIGJZIGvZxVQJ{B_x#&>t?Tj!UaLIX7rp`7_hP?G9i~tPjp91LvncOIy1nUnLeD zX(Hv=IF2hVW4rmEy}c2#cjIJc zpWh^XhH8RKsvKW35!P*>N%*C5vHlw(01#k*9`Q2IbUn_l$(yp?8Ixm(fVtt#A*YQOz^?eRH;p@qCSK&K-T2wL;r7RVmAd2%^V$z(-YKRsa@@LxmKhm$B z7w_Xw*dr{CbT~G9pBRgb_}<}Lcu9dc9h859nKL4XbbB;qu#9ANZrRbHtPC*^vqW_!Rg)<1U#Ik@_~4Ir`J-+D=)gi2?;*i%ek;bk za3773GvH}r`1Q!xf?GBuhF@O-8zQd$8Gi*uj6UIc(6zJ6OeBH4qE%}UmqO2NQkwK* zh-*q8BDDap3u~Wt#=Otk90m;^v!I~d&UN}y>x(r3=2U;M zziX59ChT+_O9b)7Z~TWNi}uW!W(I^4$QO%6TZ=>-}E00(!Y%(a8epRar6v&GAYbxh`dS6=;iE!O%8Tr({;($gyRW?lran21#OY&0r23c$iYK7oX@UHFcoBc5E3C`QiA|dmqT^hl zN|AI`l=MH|2g0r~kssGVHWaFTbk6F627+qx*FMd}J6rMk^Lk))|+G1_LDw97fEkZ|xLv<1jv*k;7?ckoKdWCeygO zC(_^~JS8QONAwxDk+A}4XF;1t9D#75tUF8DU(fiKmvC9j7t7ve-x+-?zI@3seRN;= zBMjMbB&BeWQ6f}-PS4@8EcT{2uLNuF1CJd@j3S}gi!>v>a49^m;bC6l&{wa7Rk}H=>r{VSeTGsNZBdfayHrM*w_Dv!)%by6+5XD=IwRDgnjU< z=;s9*0Z&ZkoP#Q8U$o?q-`mo@;A-4mhjdn=@H<*``(6n)8>h-vtQ_{uT-31MwEj(- zSX)L7uU)iz{-_Bupm|;EtaFzI8}iGPd&lzGY7AJbgy=|`mbdagqK}5H7cjei8@lAsQ2Ht9(nZ#q2M=& z)u&VF*hJ+?=jMy=I{ajdL*6tLt}7^saTOwUHpCEZzR~ku73%s6_WjFct$7WkB*3b3 z1B%iuZo5ihS2%7ew9ui$nskrz+3%atgw{1JS2}N&4eok1TYMst-I*JI({8-tL=W;x zHT3Rq%3$y4LA(%t=OzpANVzss&FXE2MqW>ekuB8m;e13DyXYYLbk-X7j7tXLe*TRjH z=Ok506n~?AE|z0?`J(FQW!4NBTgGB=1Qs_3rpK>nz~P@=kDK?)8sgg`KXu3zBbBqdpMe#FPC$ z@|ikd*R;dDisiLjYpR?c8=kruh&8yB#@ugkih>|xQ^%a-&7Bh!; zq|UJYRxX`SRv$Xos8~23!Zoa|?BM+Org4@eZ!(smSOYE=)rXnu{8;wNdd4#VcDk+AdC|x^n0H5X)!LE+#Y#L);I(cwC zSbfPo#e=>7!u|qunDnFf5Sl9EQ-EW^!DkaY(4~eWlMT?Qu>c@ymK$L?bsz8`qQGI8 zWL)0P-$$2<Six|7ZpOo~Y5_&hi1$0VX^B%)`msNkL^p>5@ zjS;PVNwmYpwL$~z%3*>Dl9hL5QmWq14}FdNfq6KieU}OeCrPX!<;#n<>wVM7aN3gP zOmh{|q(=euKh^>uI+Zw3Q?hrxW!D{i-Q=wRQoRkHSw;A^w0V?utxdZh-qt0D3oMdD$dn>kl|- zj92cF+N6W2!11{q5w#K@PJ9!=?pKq{vLI|g=W~g5Z3QaT{(lH$vrKH7qb{e`!s+w) z^)YRWN^a*kyL*ty9i>{=?Md*&80{eQYe;r>$J>x8Z%H$EU+rRDrLnRk0FGKhv@!?Y zhTv0vC92uN)wHg8eo?#>;vdjH|cfcLwCm5T1{CVrnpV5GpxFVrsf`oGl7MBMFG(LEc~TH$G9rQbkhtAjRBex1C?jsU8v1 z$+)N`&oLwa7DwBi%s#r!C7`gwNqZ3VPDgQMAS9mxHRxW+&1d2DmLDM30pGiP4{xH@ zHjy7cG4cwq&e1m~!qtMjkp)QG%ldpku$oZY{2F zoeDbe$y*l>Oiz1Vb?4Ht9M0{6bT~~nGi-ni+7Y~L-uRirc31mtd968-*`}lbvFNYq ztBJ(NdA#>PW6{v(mT9XV3ItRKK>fn^A=LS-xYne_0WJ|8e5tH1z=k4Mo{axiST-@+ zAaeJ@URbAU1o1b{WYGhR{)tG=y2e*bk3Y%-udwdRE|_3%?Rh8RgDb7ABb)D!tr2eD zr_7!i^7j(kFBZnp_x%(E#*EXuxk03K0mKWYbZDP z$$xQ(k>A{lHb{ubg!bCEs%U>C6+{^Tqda}7s<&ZJi6WUVNDo^o4vZAq|D zE`iN9Q`DALB|{0wvk>%2n8oYTAwmP3!0%c^7p7l&__iPPyg=VnvZ%r+bWF<5(~yz7 ze7KeWld}VFPlu;Iwd*}8@x0Sb&voh#l?&BRjE7TZdQD`Bc-A_I6=Fg0wO^6UL>J{I z5_g|AC!*|Gcd-6FnoWXkPs$e^gXT%$sypHY~IJ+lfQAKgH}(`XX(!07rakW zHjP4fm^w05&y@3QmNhuutu%LQCTK=5`AGg?(vxR0=+ySR>?N1D^u4Ae_~J=2sN_)IX!fODAb-gWgN4 zM_!k=v3R|G^sSpNJ3gNSg6yA-O~j{tL|^5PFE0s}PL&LjI;KfoV*A$wTxZDKy>{t- zVfD(AY0>Jf{6K_m*@9H-9$YFkHd#g}Z}+CxxEO2IUrR%!YUPl_YVy`^n6Uv7-!f#t zAm3I=zSP;l#fUa$+fA(VS&)9m$I2U?3o(GI=!XtU)JLAt3F+fiiW9f@dK@0JG!>X6 zTm#COrFM^4|5tUCi0N=wN)d-4WK3i<~BImN!_Dr>#|c$Nm6%f4H@z4(9N zQz)698uv}ngIlmq;*+-4!fKjq{yL4XoTy?%&MZ?e0d@zl3rYW9`t}a^HYtm?^r51z z>NE#_DU*qPBc%);DqPBE`fC@>>B$8^NxKU7bP*^CY{vJQOiH6Je)`*Q72`zs{Oc)e zZTh81hdexNnc&drjXOvHYzb7ovkK-aqv=v`(lfX>JPjA&BYmZSli->Xy}4(s@_GC8 z?}XJsm+6PZkA0L(DTreLI^O&na4~Rit_Efc+N%)T6Tbu7=O5o#;|ahEg;I!jB%Ta} z2#7;7p$rGyzV z>&6z=rcD}ZZ}vwi>y4{$07QTebNFtm|F{sxYdbOQsC?cHoYCfONOHc2HlVuuKkCN+ zXg2Vl;5vQA=(RBqBs?#=3B3R3nsfTTVe~$@KZsv;=6w@PLYRGn%CL?7`!(jdYaVMm zp_?JH@o;CAVl8Ka&IB=_n|&U(xK`!yN9r{@XL0$$C~ei6#CJixme{YZ9MDv8x@v8n z)mOPs$}^js-cgyg<-4%@ZGF5M_3HHQxP6m6-8(<>s}Q3L=h_cxuykg&>l^K#5|a=~ zM|XkQs#YW09F!#hs*67ImZWdAvv3ZTInDo(Qp-A8yyf51c9fl)NWm=kNQ_^w^Hmz( ztqm_FK@9McWgq=^o^_6dg*tfwDKGLB@;~mE@D=Z%cygG|8F%N)bXuUGF*le9{PKST zVc<4DKGmy#;L6EG6|O1MLF2JjFswU}a+W^u&-&|i#NLOsO)Tb}qI54w5TQL0Pu7mG z?fE2659N%y(Onq!#ti8SQv{bhz}e?qCvNi)-8p}M`0&1;8gM4bn;q)tvX9u}khN+= z%{;f@NRrUE$K0aVQ?mJ-D`|uF;Z2fKvs?l-k1#ws4{Gcke`eq0Cl~&=I85Q+PXCpN zbFR}2JXF?QEJCx^6+~gLeuD9mU_Z#qjsX&+j^^o+BgRz&E95XQ^=+58Qqd84 zpF||9DLyE*`sdS+6>p#rQ_Q~k#pN9zUvb1Wzw8`D-D#Z43t;ASUDzCjTK>zGx1hnY zasG1=&F3;pVZ;aEAl+chNU3q(+o0n_5I(T~gx-5i=DzwB&QE3W5UWPeD$%Rav8+#Q5k1!m3nRtQy$v0lc=nSVU zd6AkL|5yzaS(jn$YRl3SH!8Duj0G3^k-a21W%4MEBz@mClaUXR7M48gSX!#*Whmg#d15=O-G@LgI8Zh;Txb3#@aKh*6;Z1{*vach?VuA@H8*|sOzIA+ zL+`KFFCe0wG<(0H%f0)D=F1KSnDdH`BezWhWb<6ae=q}jdCs_VlCQWI~b4eyrn%h4wpK0 zc!%(_p?W%%lwMbfQu3`Mo#F8bb6+4^P#wM&L2NnMrNt4nEgAu(l%?(Xr>8iGzwPSt z%uUKJZzVS!nQc?&^I$XU45FpPL#5=#R`))(HXqeF$N@=9YGSfUtwbkB34v;fK1qRO8o;ZNyiauZSnWk#)3axxcQC zt%$*lb8>3(bM{mz52@_0CoUygrM6C`QSkieoZ3IW*03PS#L$Kw9`ngC9}jfWpbD)K z1AhGAsc)J_J3b^&IUYy{9K3m6pR~ro1QOS2Yk&v}kloI0u&BHOa%!=x)eWb?<6KQ% z#hVa{tMGb0`Ij@z9^ny%o`G>=%haXh5d9#t1C78>Ml}UGs zs6e$_Op0OqAmOmCkDg7{n#cL8{jU(CZykJQ8aD;(ZtFuv? z((f3j;=Dr@O{sd0y~WDPj*26Hy4;me+#m zh7L{y@JB>Eu=UCL8n)Csu`T}3_skEk);(91PTernXQ!kCxB|Fqo3_z>6J+E=6I z;^vhPq7#&CEiL4G!s+(yDQGP?9SRU@l4R)A5jjv=i-Fi`BM%No3P{|*)wjT5&n2%| zlc^6l?;~I!r|p(+@g1rRK19P=BmV7zM>3FAtq4hcI!V)aSP&adOp$%b4~!1E@$Uu# zUh!drIc}FE38wm6Rx%LVbBzmR(g-JQHbOD|2TM!fZ2IXe1?3j*)NB;#wXN~{sX_a$ ztu2#>drm6S;zX^CUwmiMpcO=C?<(Xa$9`}5H0hKISsuOU$hkhJ2ces=GguDcz2iZYp4yqzOtWlak8LS6Sx-dJ$0-Yjw&Hq0G#8TqX>( zsOp+0{#ju?nc5wwlNa?kWwKgUfcNWl;!qzN*ePG;B6%Rri%T`Ts?3l=KNro} zGG9`fh=-m7|A`d&ZdDI!C?ciG2>pE8wC{{EFnI$8nizATQi=U_Z;`qJS9YdnGz|&Q zh0T~4`4Ce_Aso33+*)QE&6Gd01ejV1*op;>p18aznfR@m_|mIjkw+BTS>_#fU`sW* z^JkVHQ7M|Z=GbN~OazP_ie3uk4eztaqeEjN9_Sqm6n25AV34CQE7sJ08$w4B0ea5~ zxjpjt&U&SBJ7?cSU~1mhTzK`B5Z!=2M9VKfdhY04C{!o2aXjkQ)t}bE%&iJ3r1#*^ zU$oZkl^9SU5^r$2a?GOG0P{ca#! zH^O$+n`sAdVA7^ITh8_*wZ@41bIqw)wD`F_ZA@`?F}Lzzq^1!fTx7sgX*7vCxcVdn zcAWAQ$(Hyiw1cx0G3R3dqE$Ae!#*o)E|9uLz4iAP*Y0+=VvputQ`~;mNgmAM&ZyGt zrU0lWi!So!2P8hSB_K1zTxsClbvkse0bW_oZcXG4MX}SkBVNI&Hn+!Q=imv8Y00-- z;X1YoDpNL_tYw!&#shpz#=~j&TwBftfL;l5Q6-w;-h!7NJUR3$tnr)&_b;-gU%DP?d0N~NFA@eOeF;4 zYK0%#S{G#mURXQ`x&WQ)+|@?-O>u2)QDLblR~^U3f(WawI4)Z^d4dPa7}J`T_?*KL zlo2(XGIveciuh=M5{@S6y+2TQohq$t1#Zh+rVc{AWWDuEv+@VN#*{;akV`F02=dPH z4L}kSbp9}4Q7@bB^LHaUECnzP`>NP$mu)4LwQpF!>?Lvl=c@*HA7s8HM9Lbp7Jq$7 z#KuzReJ^?}fCcs1TKi-gyb^a;iq#Ym9lz8~OI)H1Bs+g^$6Yi6PqXnjXc5z{jOtJS z!ja`S|Cni76Oia?{xZB=eEg|y$Yxk~6pfSLinqOE=d!fJDVhHJ9{whcY>}`oO>h+2 z?C}e1xj~oFa<8+5s=7!Hc(k^^H?bI3TVBnI?1$aDutzPKHYCPGwk@N4x2N&q}2689C#BXfi> zGTL~$)O+*5bQZM$tQX+>H)X#cVUU`^(UWqzDxV?m7je&V#K*OVI@|Z{idfE*G|;|D zic1`?6nAJ_c!PUkcXC-{3MI)|6@Ys64Yd)+{}d{c>gDqGyR^oi2C-<<{;_!qqy?O4KsoJbj>IV9 z%gkbtD*bKL^r8QypvuTxw~wos;A?c;Pp5C(N6^c`K1W=Uz<6ubW3MHm@~^XovS_!Q z6Ia&`;Gt=^byGr0rbg_Gr^dqtob53G@n#?{=*CqrT@=r>!;K!eW>QCJCPJjyCk;90 zY)M$}i@rg=t~@+0f;q6(5jf0Q0-QF*hS-oCwwVn(TivaPVf|ST&lHMHg%58ytdn*W z)g(5z#cmZ1$D|mwC@z`g03(OO!87R1$rx{?M|9j3BQ1>mCHO_D6csBs`gnj>BjO>M ztx^d_HL5^d#>kl?AMO;e-bC!RZEOU5OCdXK*Jx-GUg|4r=h;kgpYeQC?7~b!Yur^}#gNxMAHPB?CpTC&&k`4YIzD&@fFD6R zK$7FSZc6jv0`{|rVyqA9cOjnl@1vc|;KjHddonB++qNb18Bp&Na992B$1NMISzTt9 zsn2s+Vfi?644bnSzgYEq4bng{#&VQe00-%p7o*M4v%?Lqx}&LF1`>0ekNyaxo`hqt zLUf1kl1>2T535*G@cde*d>osW29Nh{&E_%1PP?S+>1XOa1O%L?k2$HTR+WStzd?%_ z=~3dj0+-~z_ZXFalyP#I)FO#ps@|>bUv2?6@el6!Yl=oot|#f!fer$|1!A6Ij#u$K zeyogovG1^aiLfmBKlNCAf((q_;bQs&3IHyJxg(2{^~CVC+N89BA$>qE9|$1;!kj_H z7pxBpFC}&C^pKS5r7nOz@#I}isZC+tx)dZ5XR?~vXNzR8K&b!-tX}V+HP<&CFBauN zU&Zz@W0P@tVpyZ~H_fkyuSS>N<9-xT2akZvvF?oP7&?oM1D7?DaTc|t#nI`K8UVPk zP1eWe;eohtv^Igx5&iVU*Xt=V5G(sAen78q;bC#DL-#lfe{G1!#!NkY;&abJp~`#= z@!HB&!UcSc8kiT0tLD63~|Ov{7j?s=g0TO_ztupZLd0k(fcI&i6qjvKjGa{8IK>@mpOt^ULq25hNG>HMRj9CDnK ztkOOAa}C!h;<6XJJwc_5a+|aTUZAw_%0LYLUOMAtkNpiyj|Zu4P@#P(K0`B+HQ4D{ zyk<5i(FJ{1BAs`6D_Y`^)Ad)Xz}*LxME;Q}$`b51OajIS-QZLpmZB}U6t^ZOS1St4 zP`Tu`qr%|yGJc9{@6sOjGBUHLC=)!zVU(VgVy~Hv%T3e5KB|Ot2lHivtLKKbk59e< z)a`laLAdR>9^{?N<5~yHA*AR}?m)JB(P+@@&P&D0jf1BLgo-M>eVG))mW`|DCh z=YpIEHVOwNef>qOrgtcTTBr*lm*F$Kh~RpQPF_SSyB)0VFDrmqK>ZN+(_g9pVc;rc zCeP@$yvhg|{{rF~h7n!pl4WRx8+GVLd+ZkFF$=4@(BfPC-Q(UCxZHdICuV-OuhC_L zRKJRs*Z)*%9Yk$?{7IRXG?+N6dKLl4)i({7`~Jr@rXs&wrS?xGR=_|07|NK=JC;mf z{bmG;wi#5b-IwQi0r;JeG-lC z>~M}PbT-^%t9L0}B#gTv=;IrAtMrYqrRskfLq5T<&A~>RD*4n(a1laol?5UW1M2D8#1d|5( z^EAg4cg%^Ra<=j`OOmT*fC44WStzLIFHiXaA1yQ}sY44|;u!pl5#g5P^U`+EN1mS} z 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

    nOk9=9Ht`@(lj8zlD!{Zwa{sa90<3O~)-U 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

    y&9_&!a(uy2{) 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 FQLxZ^7 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 )f}T#h;SFXenJV2xjC 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�^1SXb9VhfKm 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

    DeBlcme9JOyaN@2x=fnMK5;- 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 tr@gKGJM25=e$`=YUXHs;C~ - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.afdesign deleted file mode 100644 index 28deae760fd7f79d8a59422f507944c302591d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39379 zcmb@sWmFu&);5YmaQEN@cXxMpcXxLP?(V@|Gq}422ol^~f(`Bt-{idK{q?Q8?vHzW zbx&3AsjA++>v{IBsxGikIT3g;I50;yS7mY;M@tq)u>Tx6|4nxp{^$OGf9JWXb^qlt zK^Fw*Qg(H6CjzD9k~a3<;O7Bf{M8rlKYLJ^ak

    DyB1Eir(Bqc; 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˫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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.afdesign deleted file mode 100644 index 19cfdb95d662f3b7f3b9e5ee010b7223a431b5c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52614 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

    WzthmuE{rgZ+E^);z)?YD+(~*{MmnZ`Q(4 zTO6GZr)f>xW7S*#_jk^ceUCkoWMP<=TFw*Js3z63ds03Q@T+tG9U6S<(PF6__w<;9 dzlPU3zYF&_@1r>R}^`+sLg@pb?J diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.svg deleted file mode 100644 index a2a6907c..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/MiddleKnob.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/ReShaper.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/ReShaper.afdesign deleted file mode 100644 index d94ed5397b29d4377fa0a5be4588823aac2b9fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34971 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/ScrewDark.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/ScrewDark.afdesign deleted file mode 100644 index 3d1c0d7c556812131808e042c8ac06b20249611d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28160 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 Nc)I$ztaD0e0stf-ZRr32 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/VCF.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/VCF.svg deleted file mode 100644 index e8c1b323..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/VCF.svg +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/VCO.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/VCO.afdesign deleted file mode 100644 index 0c887bd86261d646fe0b9ac3bcbf41e19ae315df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34658 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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/VCO.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/VCO.svg deleted file mode 100644 index dddf021c..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/VCO.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/digital-7.ttf b/plugins/community/repos/LindenbergResearch__ORIG/res/digital-7.ttf deleted file mode 100644 index a481b97b4f84fd4199360c511517a5cf22d2a664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34404 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 zqo5cvktyeG1h8H1KvTng)setIndicatorActive(inputs[CUTOFF_CV_INPUT].active); - peakKnob->setIndicatorActive(inputs[RESONANCE_CV_INPUT].active); - driveKnob->setIndicatorActive(inputs[DRIVE_CV_INPUT].active); - - frqKnob->setIndicatorValue(params[CUTOFF_PARAM].value + frqcv); - peakKnob->setIndicatorValue(params[RESONANCE_PARAM].value + rescv); - driveKnob->setIndicatorValue(params[DRIVE_PARAM].value + drvcv); - } - - - float y = inputs[FILTER_INPUT].value; - - filter.setIn(y); - filter.process(); - - outputs[LP_OUTPUT].value = filter.getLpOut(); - - - lights[OVERLOAD_LIGHT].value = filter.getLightValue(); -} - - -/** - * @brief ALMA filter - */ -struct AlmaFilterWidget : LRModuleWidget { - AlmaFilterWidget(AlmaFilter *module); -}; - - -AlmaFilterWidget::AlmaFilterWidget(AlmaFilter *module) : LRModuleWidget(module) { - //setPanel(SVG::load(assetPlugin(plugin, "res/VCF.svg"))); - - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCF.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - // ***** MAIN KNOBS ****** - module->frqKnob = LRKnob::create(Vec(62, 150), module, AlmaFilter::CUTOFF_PARAM, 0.f, 1.f, 0.8f); - module->peakKnob = LRKnob::create(Vec(24, 229), module, AlmaFilter::RESONANCE_PARAM, -0.f, 1.5, 0.0f); - module->driveKnob = LRKnob::create(Vec(116, 228), module, AlmaFilter::DRIVE_PARAM, 0.0f, 1.f, 0.0f); - - addParam(module->frqKnob); - addParam(module->peakKnob); - addParam(module->driveKnob); - - addParam(ParamWidget::create(Vec(70, 288), module, AlmaFilter::SLOPE_PARAM, 0.0f, 4.f, 2.0f)); - // ***** MAIN KNOBS ****** - - // ***** CV INPUTS ******* - addParam(ParamWidget::create(Vec(27.5, 106), module, AlmaFilter::RESONANCE_CV_PARAM, -1.f, 1.0f, 0.f)); - addParam(ParamWidget::create(Vec(78, 106), module, AlmaFilter::CUTOFF_CV_PARAM, -1.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(127.1, 106), module, AlmaFilter::DRIVE_CV_PARAM, -1.f, 1.f, 0.f)); - - addInput(Port::create(Vec(26, 50), Port::INPUT, module, AlmaFilter::RESONANCE_CV_INPUT)); - addInput(Port::create(Vec(76, 50), Port::INPUT, module, AlmaFilter::CUTOFF_CV_INPUT)); - addInput(Port::create(Vec(125, 50), Port::INPUT, module, AlmaFilter::DRIVE_CV_INPUT)); - // ***** CV INPUTS ******* - - // ***** INPUTS ********** - addInput(Port::create(Vec(25, 326.5), Port::INPUT, module, AlmaFilter::FILTER_INPUT)); - // ***** INPUTS ********** - - // ***** OUTPUTS ********* - addOutput(Port::create(Vec(124.5, 326.5), Port::OUTPUT, module, AlmaFilter::LP_OUTPUT)); - // ***** OUTPUTS ********* - - // ***** LIGHTS ********** - addChild(ModuleLightWidget::create(Vec(85, 247), module, AlmaFilter::OVERLOAD_LIGHT)); - // ***** LIGHTS ********** -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, AlmaFilter) { - Model *modelAlmaFilter = Model::create("Lindenberg Research", "VCF", "Alma Ladder Filter", FILTER_TAG); - return modelAlmaFilter; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanel.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanel.cpp deleted file mode 100644 index 667ea109..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanel.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct BlankPanel : Module { - enum ParamIds { - NUM_PARAMS - }; - enum InputIds { - NUM_INPUTS - }; - enum OutputIds { - NUM_OUTPUTS - }; - enum LightIds { - NUM_LIGHTS - }; - - LCDWidget *lcd1 = new LCDWidget(LCD_COLOR_FG, 15); - - - BlankPanel() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - - - void step() override; -}; - - -void BlankPanel::step() { - -} - - -/** - * @brief Blank Panel with Logo - */ -struct BlankPanelWidget : LRModuleWidget { - BlankPanelWidget(BlankPanel *module); -}; - - -BlankPanelWidget::BlankPanelWidget(BlankPanel *module) : LRModuleWidget(module) { - //setPanel(SVG::load(assetPlugin(plugin, "res/BlankPanel.svg"))); - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/BlankPanel.svg"))); - addChild(panel); - - box.size = panel->box.size; - - float speed = 0.002; - - addChild(SVGRotator::create(Vec(140.5, 83), SVG::load(assetPlugin(plugin, "res/CogBig.svg")), speed)); - addChild(SVGRotator::create(Vec(120, 114.7), SVG::load(assetPlugin(plugin, "res/CogSmall.svg")), -speed * 1.6)); - - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - // ***** LCD ************* - /* module->lcd1->box.pos = Vec(34, 355); - addChild(module->lcd1); - module->lcd1->text = VERSION_STR;*/ - // ***** LCD ************* -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, BlankPanel) { - Model *modelBlankPanel = Model::create("Lindenberg Research", "BlankPanel 01", "Blank Panel 20TE", BLANK_TAG); - return modelBlankPanel; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanelM1.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanelM1.cpp deleted file mode 100644 index 40f84e8a..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/BlankPanelM1.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct BlankPanelM1 : Module { - enum ParamIds { - NUM_PARAMS - }; - enum InputIds { - NUM_INPUTS - }; - enum OutputIds { - NUM_OUTPUTS - }; - enum LightIds { - NUM_LIGHTS - }; - - - BlankPanelM1() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - - - void step() override; -}; - - -void BlankPanelM1::step() { -} - - -/** - * @brief Blank Panel Mark I - */ -struct BlankPanelWidgetM1 : LRModuleWidget { - BlankPanelWidgetM1(BlankPanelM1 *module); -}; - - -BlankPanelWidgetM1::BlankPanelWidgetM1(BlankPanelM1 *module) : LRModuleWidget(module) { - // setPanel(SVG::load(assetPlugin(plugin, "res/BlankPanelM1.svg"))); - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/BlankPanelM1.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, BlankPanelM1) { - Model *modelBlankPanelM1 = Model::create("Lindenberg Research", "BlankPanel 02", "Blank Panel 12TE", - BLANK_TAG); - return modelBlankPanelM1; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.cpp deleted file mode 100644 index 2d586370..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#include "LRComponents.hpp" - - -/** - * @brief Constructor of LCD Widget - */ -LCDWidget::LCDWidget(NVGcolor fg, unsigned char length) { - /** load LCD ttf font */ - gLCDFont_DIG7 = Font::load(assetPlugin(plugin, LCD_FONT_DIG7)); - - auto r = (unsigned char) (fg.r * 0xFF); - auto g = (unsigned char) (fg.g * 0xFF); - auto b = (unsigned char) (fg.b * 0xFF); - - LCDWidget::length = length; - - LCDWidget::fg = fg; - LCDWidget::bg = nvgRGBA(r - 0x40, g - 0x40, b - 0x40, 0x40); -} - - -LRModuleWidget::LRModuleWidget(Module *module) : ModuleWidget(module) { -} - - -/** - * @brief Draw method of custom LCD widget - * @param vg - */ -void LCDWidget::draw(NVGcontext *vg) { - nvgFontSize(vg, LCD_FONTSIZE); - nvgFontFaceId(vg, gLCDFont_DIG7->handle); - nvgTextLetterSpacing(vg, LCD_LETTER_SPACING); - - nvgFillColor(vg, bg); - - std::string s1; - std::string s2; - - for (int i = 0; i < LCDWidget::length; ++i) { - s1.append("8"); - s2.append(":"); - } - - nvgTextBox(vg, 0, 0, 220, s1.c_str(), nullptr); - nvgTextBox(vg, 0, 0, 220, s2.c_str(), nullptr); - - nvgFillColor(vg, fg); - nvgTextBox(vg, 0, 0, 220, text.c_str(), nullptr); -} - - -void LRRedLight::draw(NVGcontext *vg) { - //LightWidget::draw(vg); - - float radius = box.size.x / 1.5f; - float oradius = radius + 10.0f; - - /* color.r = clampf(color.r, 0.0f, 1.0f); - color.g = clampf(color.g, 0.0f, 1.0f); - color.b = clampf(color.b, 0.0f, 1.0f); - color.a = clampf(color.a, 0.0f, 1.0f);*/ - - // Solid - nvgBeginPath(vg); - nvgCircle(vg, radius, radius, radius); - nvgFillColor(vg, bgColor); - nvgFill(vg); - - // Border - nvgStrokeWidth(vg, 1.0f); - NVGcolor borderColor = bgColor; - borderColor.a *= 0.5f; - nvgStrokeColor(vg, borderColor); - nvgStroke(vg); - - // Inner glow - nvgGlobalCompositeOperation(vg, NVG_LIGHTER); - nvgFillColor(vg, color); - nvgFill(vg); - - // Outer glow - nvgBeginPath(vg); - nvgRect(vg, radius - oradius, radius - oradius, 2 * oradius, 2 * oradius); - NVGpaint paint; - NVGcolor icol = color; - icol.a *= 0.40f; - NVGcolor ocol = color; - ocol.a = 0.00f; - paint = nvgRadialGradient(vg, radius, radius, radius, oradius, icol, ocol); - nvgFillPaint(vg, paint); - nvgFill(vg); -} - - -/** - * @brief Constructor - */ -LRRedLight::LRRedLight() { - addBaseColor(COLOR_RED); -} - - -/** - * @brief Draw routine for cv indicator - * @param vg - */ -void Indicator::draw(NVGcontext *vg) { - NVGcolor current = normalColor; - - if (active) { - /** underrun */ - if (cv < 0.f - OVERFLOW_THRESHOLD) { - cv = 0.f - OVERFLOW_THRESHOLD; - current = overflowColor; - } - - /** overrun */ - if (cv > 1.f + OVERFLOW_THRESHOLD) { - cv = 1.f + OVERFLOW_THRESHOLD; - current = overflowColor; - } - - - float a = -angle + cv * angle2; - float d = distance - 4.f; - Vec p1, p2, p3; - - /** compute correct point of indicator on circle */ - p1.x = middle.x - sin(-a * (float) M_PI) * distance; - p1.y = middle.y - cos(-a * (float) M_PI) * distance; - - p2.x = middle.x - sin(-(a + 0.1f) * (float) M_PI) * d; - p2.y = middle.y - cos(-(a + 0.1f) * (float) M_PI) * d; - - p3.x = middle.x - sin(-(a - 0.1f) * (float) M_PI) * d; - p3.y = middle.y - cos(-(a - 0.1f) * (float) M_PI) * d; - - nvgBeginPath(vg); - nvgMoveTo(vg, p1.x, p1.y); - nvgLineTo(vg, p2.x, p2.y); - nvgLineTo(vg, p3.x, p3.y); - nvgLineTo(vg, p1.x, p1.y); - nvgClosePath(vg); - - nvgFillColor(vg, current); - nvgFill(vg); - } -} - - -/** - * @brief Draw shadow for circular knobs - * @param vg NVGcontext - * @param strength Alpha value of outside gradient - * @param size Outer size - * @param shift XY Offset shift from middle - */ -void LRShadow::drawShadow(NVGcontext *vg, float strength, float size) { - // add shadow - nvgBeginPath(vg); - nvgRect(vg, -20, -20, box.size.x + 40, box.size.y + 40); - - NVGcolor icol = nvgRGBAf(0.0f, 0.0f, 0.0f, strength); - NVGcolor ocol = nvgRGBAf(0.0f, 0.0f, 0.0f, 0.f);; - - NVGpaint paint = nvgRadialGradient(vg, box.size.x / 2 + shadowPos.x, box.size.y / 2 + shadowPos.y, - box.size.x * 0.3f, box.size.x * size, icol, ocol); - nvgFillPaint(vg, paint); - nvgFill(vg); -} - - -/** - * @brief Hook into widget draw routine to simulate shadow - * @param vg - */ -void LRShadow::draw(NVGcontext *vg) { - drawShadow(vg, strength, size); -} - - -/** - * @brief Setter for box dimensions - * @param box - */ -void LRShadow::setBox(const Rect &box) { - LRShadow::box = box; -} - - -/** - * @brief Setter for outer radius size - * @param size - */ -void LRShadow::setSize(float size) { - LRShadow::size = size; -} - - -/** - * @brief Setter for draw strength of shadow - * @param strength - */ -void LRShadow::setStrength(float strength) { - LRShadow::strength = strength; -} - - -/** - * @brief Extention for panel background - * @param vg - */ -void LRPanel::draw(NVGcontext *vg) { - FramebufferWidget::draw(vg); - - nvgBeginPath(vg); - nvgRect(vg, -MARGIN, -MARGIN, box.size.x + MARGIN * 2, box.size.y + MARGIN * 2); - - NVGpaint paint = nvgLinearGradient(vg, offset.x, offset.y, box.size.x, box.size.y, inner, outer); - nvgFillPaint(vg, paint); - nvgFill(vg); -} - - -void LRPanel::setInner(const NVGcolor &inner) { - LRPanel::inner = inner; -} - - -void LRPanel::setOuter(const NVGcolor &outer) { - LRPanel::outer = outer; -} - - -LRPanel::LRPanel() {} - - -SVGRotator::SVGRotator() : FramebufferWidget() { - tw = new TransformWidget(); - addChild(tw); - - sw = new SVGWidget(); - tw->addChild(sw); -} - - -/** - * @brief Set SVG image to rotator - * @param svg - */ -void SVGRotator::setSVG(std::shared_ptr svg) { - sw->setSVG(svg); - tw->box.size = sw->box.size; - box.size = sw->box.size; -} - - -/** - * @brief Rotate one step - */ -void SVGRotator::step() { - tw->identity(); - - angle = fmodf(angle + inc, 2 * M_PI);; - - Vec center = sw->box.getCenter(); - tw->translate(center); - tw->rotate(angle); - tw->translate(center.neg()); - - dirty = true; - - FramebufferWidget::step(); -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.hpp deleted file mode 100644 index 48d30922..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/LRComponents.hpp +++ /dev/null @@ -1,515 +0,0 @@ -#pragma once - -#include "rack.hpp" -#include "asset.hpp" -#include "widgets.hpp" - -#define LCD_FONT_DIG7 "res/digital-7.ttf" -#define LCD_COLOR_FG nvgRGBA(0x00, 0xE1, 0xE4, 0xFF) -#define LCD_FONTSIZE 8 -#define LCD_LETTER_SPACING 0 - -using namespace rack; - -#ifdef USE_VST2 -#define plugin "LindenbergResearch" -#else -extern Plugin *plugin; -#endif // USE_VST2 - - -/** - * @brief Standard LRT module - */ -struct LRModule : Module { - long cnt = 0; - - - /** - * @brief Overtake default constructor for module to be compatible - * @param numParams - * @param numInputs - * @param numOutputs - * @param numLights - */ - LRModule(int numParams, int numInputs, int numOutputs, int numLights = 0) : - Module(numParams, numInputs, numOutputs, numLights) {} - - - void step() override { - Module::step(); - - // increment counter - cnt++; - } -}; - - -/** - * @brief Standard LRT ModuleWidget definition - */ -struct LRModuleWidget : ModuleWidget { - explicit LRModuleWidget(Module *module); -}; - - -/** - * @brief Emulation of a LCD monochrome display - */ -struct LCDWidget : Label { - std::shared_ptr gLCDFont_DIG7; - NVGcolor fg; - NVGcolor bg; - unsigned char length = 0; - - - /** - * @brief Constructor - */ - LCDWidget(NVGcolor fg, unsigned char length); - - - /** - * @brief Draw LCD display - * @param vg - */ - void draw(NVGcontext *vg) override; -}; - - -/** - * @brief Indicator for control voltages on knobs - */ -struct Indicator { - static constexpr float OVERFLOW_THRESHOLD = 0.01f; - - /** flag to control drawing */ - bool active = false; - - /** color of indicator */ - NVGcolor normalColor = nvgRGBA(0x00, 0x00, 0x00, 0xBB); - NVGcolor overflowColor = nvgRGBA(0xBB, 0x00, 0x00, 0xBB); - - /** radius from middle */ - float distance; - - /** normalized control voltage. must between [0..1] */ - float cv = 0.f; - - /** draw angle */ - float angle; - float angle2; - - /** middle of parent */ - Vec middle; - - - /** - * @brief Init indicator - * @param distance Radius viewed from the middle - * @param angle Angle of active knob area - */ - Indicator(float distance, float angle) { - Indicator::distance = distance; - Indicator::angle = angle; - - /** for optimization */ - angle2 = 2 * angle; - } - - - /** - * @brief Draw routine for cv indicator - * @param vg - */ - void draw(NVGcontext *vg); - -}; - - -/** - * @brief Standard LR Shadow - */ -struct LRShadow { -private: - Rect box; - float size = 0.65; - float strength = 1.f; - - /** shadow shift */ - Vec shadowPos = Vec(3, 5); -public: - /** - * @brief Set the new offset of the shadow gradient - * @param x - * @param y - */ - void setShadowPosition(float x, float y) { - shadowPos = Vec(x, y); - } - - - void setBox(const Rect &box); - void setSize(float size); - void setStrength(float strength); - - /** - * @brief Draw shadow for circular knobs - * @param vg NVGcontext - * @param strength Alpha value of outside gradient - * @param size Outer size - * @param shift XY Offset shift from middle - */ - void drawShadow(NVGcontext *vg, float strength, float size); - - void draw(NVGcontext *vg); -}; - - -/** - * @brief The base of all knobs used in LR panels, includes a indicator - */ -struct LRKnob : SVGKnob { -private: - static constexpr float ANGLE = 0.83f; - - /** setup indicator with default values */ - Indicator idc = Indicator(15.f, ANGLE); - LRShadow shadow = LRShadow(); - - /** snap mode */ - bool snap = false; - /** position to snap */ - float snapAt = 0.0f; - /** snap sensitivity */ - float snapSens = 0.1; - -public: - /** - * @brief Default constructor - */ - LRKnob() { - minAngle = -ANGLE * (float) M_PI; - maxAngle = ANGLE * (float) M_PI; - } - - - /** - * @brief Set the value of the indicator - * @param value - */ - void setIndicatorValue(float value) { - idc.cv = value; - } - - - /** - * @brief Switch indicator on/off - * @param active - */ - void setIndicatorActive(bool active) { - idc.active = active; - } - - - /** - * @brief Get indicator state - * @return - */ - bool isIndicatorActive() { - return idc.active; - } - - - /** - * @brief Setup distance of indicator from middle - * @param distance - */ - void setIndicatorDistance(float distance) { - idc.distance = distance; - } - - - /** - * @brief Hook into setSVG() method to setup box dimensions correct for indicator - * @param svg - */ - void setSVG(std::shared_ptr svg) { - SVGKnob::setSVG(svg); - - /** inherit dimensions after loaded svg */ - idc.middle = Vec(box.size.x / 2, box.size.y / 2); - shadow.setBox(box); - } - - - /** - * @brief Route setter to shadow - * @param x - * @param y - */ - void setShadowPosition(float x, float y) { - shadow.setShadowPosition(x, y); - } - - - /** - * @brief Creates a new instance of a LRKnob child - * @tparam TParamWidget Subclass of LRKnob - * @param pos Position - * @param module Module pointer - * @param paramId Parameter ID - * @param minValue Min - * @param maxValue Max - * @param defaultValue Default - * @return Pointer to new subclass of LRKnob - */ - template - static TParamWidget *create(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue) { - auto *param = new TParamWidget(); - param->box.pos = pos; - param->module = module; - param->paramId = paramId; - param->setLimits(minValue, maxValue); - param->setDefaultValue(defaultValue); - return param; - } - - - /** - * @brief Draw knob - * @param vg - */ - void draw(NVGcontext *vg) override { - /** shadow */ - shadow.draw(vg); - - /** component */ - FramebufferWidget::draw(vg); - - /** indicator */ - idc.draw(vg); - } - - - /** - * @brief Setup knob snapping - * @param position - * @param sensitivity - */ - void setSnap(float position, float sensitivity) { - snap = true; - snapSens = sensitivity; - snapAt = position; - } - - - /** - * @brief Remove knob snaping - */ - void unsetSnap() { - snap = false; - } - - - /** - * @brief Snapping mode for knobs - * @param e - */ - void onChange(EventChange &e) override { - if (snap && value > -snapSens + snapAt && value < snapSens + snapAt) value = 0; - SVGKnob::onChange(e); - } -}; - - -/** - * @brief Quantize position to odd numbers to simulate a toggle switch - */ -struct LRToggleKnob : LRKnob { - LRToggleKnob(float length = 0.5f) { - minAngle = -length * (float) M_PI; - maxAngle = length * (float) M_PI; - - setSVG(SVG::load(assetPlugin(plugin, "res/ToggleKnob.svg"))); - setShadowPosition(2, 2); - - speed = 2.f; - } - - - void onChange(EventChange &e) override { - value = round(value); - SVGKnob::onChange(e); - } -}; - - -/** - * @brief LR Big Knob - */ -struct LRBigKnob : LRKnob { - LRBigKnob() { - setSVG(SVG::load(assetPlugin(plugin, "res/BigKnob.svg"))); - setIndicatorDistance(15); - setShadowPosition(5, 6); - } -}; - - -/** - * @brief LR Middle Knob - */ -struct LRMiddleKnob : LRKnob { - LRMiddleKnob() { - setSVG(SVG::load(assetPlugin(plugin, "res/MiddleKnob.svg"))); - setIndicatorDistance(12); - setShadowPosition(4, 4); - } -}; - - -/** - * @brief LR Small Knob - */ -struct LRSmallKnob : LRKnob { - LRSmallKnob() { - setSVG(SVG::load(assetPlugin(plugin, "res/SmallKnob.svg"))); - setShadowPosition(3, 3); - setSnap(0.0f, 0.03f); - - - speed = 0.7f; - } -}; - - -/** - * @brief Alternative IO Port - */ -struct IOPort : SVGPort { -private: - LRShadow shadow = LRShadow(); - -public: - IOPort() { - background->svg = SVG::load(assetPlugin(plugin, "res/IOPortB.svg")); - background->wrap(); - box.size = background->box.size; - - /** inherit dimensions */ - shadow.setBox(box); - shadow.setSize(0.50); - shadow.setShadowPosition(2, 2); - } - - - /** - * @brief Hook into draw method - * @param vg - */ - void draw(NVGcontext *vg) override { - shadow.draw(vg); - SVGPort::draw(vg); - } -}; - - -/** - * @brief Alternative screw head A - */ -struct ScrewDarkA : SVGScrew { - ScrewDarkA() { - sw->svg = SVG::load(assetPlugin(plugin, "res/ScrewDark.svg")); - sw->wrap(); - box.size = sw->box.size; - } -}; - - -/** - * @brief Custom switch based on original Rack files - */ -struct LRSwitch : SVGSwitch, ToggleSwitch { - LRSwitch() { - addFrame(SVG::load(assetPlugin(plugin, "res/Switch0.svg"))); - addFrame(SVG::load(assetPlugin(plugin, "res/Switch1.svg"))); - } -}; - - -/** - * @brief Standard LED Redlight - */ -struct LRRedLight : SmallLight { - LRRedLight(); - - void draw(NVGcontext *vg) override; -}; - - -/** - * @brief Standard LR module Panel - */ -struct LRPanel : SVGPanel { -private: - /** margin of gradient box */ - static constexpr float MARGIN = 20; - - /** gradient colors */ - NVGcolor inner = nvgRGBAf(.6f, 0.7f, 0.9f, 0.12f); - NVGcolor outer = nvgRGBAf(0.0f, 0.0f, 0.0f, 0.0f);; - - /** gradient offset */ - Vec offset = Vec(-40, -50); - - void setInner(const NVGcolor &inner); - void setOuter(const NVGcolor &outer); -public: - LRPanel(); - - - LRPanel(float x, float y) { - offset.x = x; - offset.y = y; - } - - - void draw(NVGcontext *vg) override; -}; - - -/** - * @brief Passive rotating SVG image - */ -struct SVGRotator : FramebufferWidget { - TransformWidget *tw; - SVGWidget *sw; - - /** angle to rotate per step */ - float angle = 0; - float inc; - - - SVGRotator(); - - - /** - * @brief Factory method - * @param pos Position - * @param svg Pointer to SVG image - * @param angle Increment angle per step - */ - SVGRotator static *create(Vec pos, std::shared_ptr svg, float inc) { - SVGRotator *rotator = FramebufferWidget::create(pos); - - rotator->setSVG(svg); - rotator->inc = inc; - - return rotator; - } - - - void setSVG(std::shared_ptr svg); - void step() override; -}; diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.cpp deleted file mode 100644 index b660c7b1..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "LindenbergResearch.hpp" - -using namespace rack; - -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, SimpleFilter); -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, MS20Filter); -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, AlmaFilter); -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, ReShaper); -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, BlankPanel); -RACK_PLUGIN_MODEL_DECLARE(LindenbergResearch, BlankPanelM1); - -RACK_PLUGIN_INIT(LindenbergResearch) { - RACK_PLUGIN_INIT_ID(); - - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, SimpleFilter); - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, MS20Filter); - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, AlmaFilter); - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, ReShaper); - - //TODO: RACK_PLUGIN_MODEL_ADD(LindenbergResearch, VCO); - - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, BlankPanel); - RACK_PLUGIN_MODEL_ADD(LindenbergResearch, BlankPanelM1); -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.hpp deleted file mode 100644 index 83838d8d..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/LindenbergResearch.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include "rack.hpp" -#include "asset.hpp" -#include "widgets.hpp" -#include "LRComponents.hpp" - -using namespace rack; - -RACK_PLUGIN_DECLARE(LindenbergResearch); - -#ifdef USE_VST2 -#define plugin "LindenbergResearch" -#endif // USE_VST2 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/MS20Filter.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/MS20Filter.cpp deleted file mode 100644 index d3c91d01..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/MS20Filter.cpp +++ /dev/null @@ -1,153 +0,0 @@ -#include "dsp/MS20zdf.hpp" -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct MS20Filter : LRModule { - - enum ParamIds { - FREQUENCY_PARAM, - PEAK_PARAM, - DRIVE_PARAM, - CUTOFF_CV_PARAM, - PEAK_CV_PARAM, - GAIN_CV_PARAM, - MODE_SWITCH_PARAM, - NUM_PARAMS - }; - - enum InputIds { - FILTER_INPUT, - CUTOFF_CV_INPUT, - PEAK_CV_INPUT, - GAIN_CV_INPUT, - NUM_INPUTS - }; - - enum OutputIds { - FILTER_OUTPUT, - NUM_OUTPUTS - }; - - enum LightIds { - NUM_LIGHTS - }; - - dsp::MS20zdf *ms20zdf = new dsp::MS20zdf(engineGetSampleRate()); - - LRBigKnob *frqKnob = NULL; - LRMiddleKnob *peakKnob = NULL; - LRMiddleKnob *driveKnob = NULL; - - - MS20Filter() : LRModule(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} - - - void step() override; - void onSampleRateChange() override; -}; - - -void MS20Filter::step() { - /* compute control voltages */ - float frqcv = inputs[CUTOFF_CV_INPUT].value * 0.1f * quadraticBipolar(params[CUTOFF_CV_PARAM].value); - float peakcv = inputs[PEAK_CV_INPUT].value * 0.1f * quadraticBipolar(params[PEAK_CV_PARAM].value); - float gaincv = inputs[GAIN_CV_INPUT].value * 0.1f * quadraticBipolar(params[GAIN_CV_PARAM].value); - - /* set cv modulated parameters */ - ms20zdf->setFrequency(params[FREQUENCY_PARAM].value + frqcv); - ms20zdf->setPeak(params[PEAK_PARAM].value + peakcv); - ms20zdf->setDrive(params[DRIVE_PARAM].value + gaincv); - - /* pass modulated parameter to knob widget for cv indicator */ - if (frqKnob != NULL && peakKnob != NULL && driveKnob != NULL) { - frqKnob->setIndicatorActive(inputs[CUTOFF_CV_INPUT].active); - peakKnob->setIndicatorActive(inputs[PEAK_CV_INPUT].active); - driveKnob->setIndicatorActive(inputs[GAIN_CV_INPUT].active); - - frqKnob->setIndicatorValue(params[FREQUENCY_PARAM].value + frqcv); - peakKnob->setIndicatorValue(params[PEAK_PARAM].value + peakcv); - driveKnob->setIndicatorValue(params[DRIVE_PARAM].value + gaincv); - } - - /* process signal */ - ms20zdf->setType(params[MODE_SWITCH_PARAM].value); - ms20zdf->setIn(inputs[FILTER_INPUT].value); - ms20zdf->process(); - - outputs[FILTER_OUTPUT].value = ms20zdf->getLPOut(); -} - - -void MS20Filter::onSampleRateChange() { - Module::onSampleRateChange(); - ms20zdf->updateSampleRate(engineGetSampleRate()); -} - - -/** - * @brief Valerie MS20 filter - */ -struct MS20FilterWidget : LRModuleWidget { - MS20FilterWidget(MS20Filter *module); -}; - - -MS20FilterWidget::MS20FilterWidget(MS20Filter *module) : LRModuleWidget(module) { - //setPanel(SVG::load(assetPlugin(plugin, "res/MS20.svg"))); - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/MS20.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - // ***** MAIN KNOBS ****** - module->frqKnob = LRKnob::create(Vec(102.f, 64.9f), module, MS20Filter::FREQUENCY_PARAM, 0.f, 1.f, 1.f); - module->peakKnob = LRKnob::create(Vec(110.f, 160.8f), module, MS20Filter::PEAK_PARAM, 0.0f, 1.0f, 0.0f); - module->driveKnob = LRKnob::create(Vec(110.f, 230.6f), module, MS20Filter::DRIVE_PARAM, 0.f, 1.0f, 0.0f); - - addParam(module->frqKnob); - addParam(module->peakKnob); - addParam(module->driveKnob); - - // ***** MAIN KNOBS ****** - - // ***** CV INPUTS ******* - addParam(ParamWidget::create(Vec(61.f, 169.3f), module, MS20Filter::PEAK_CV_PARAM, -1.f, 1.0f, 0.f)); - addParam(ParamWidget::create(Vec(61.f, 82.4f), module, MS20Filter::CUTOFF_CV_PARAM, -1.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(61.f, 239.f), module, MS20Filter::GAIN_CV_PARAM, -1.f, 1.f, 0.f)); - - addInput(Port::create(Vec(18, 168.5), Port::INPUT, module, MS20Filter::PEAK_CV_INPUT)); - addInput(Port::create(Vec(18, 81.5), Port::INPUT, module, MS20Filter::CUTOFF_CV_INPUT)); - addInput(Port::create(Vec(18, 239), Port::INPUT, module, MS20Filter::GAIN_CV_INPUT)); - // ***** CV INPUTS ******* - - // ***** INPUTS ********** - addInput(Port::create(Vec(17.999f, 326.05f), Port::INPUT, module, MS20Filter::FILTER_INPUT)); - // ***** INPUTS ********** - - // ***** OUTPUTS ********* - addOutput(Port::create(Vec(58.544f, 326.05f), Port::OUTPUT, module, MS20Filter::FILTER_OUTPUT)); - // ***** OUTPUTS ********* - - // ***** SWITCH ********* - addParam(ParamWidget::create(Vec(119.f, 331.f), module, MS20Filter::MODE_SWITCH_PARAM, 0.0f, 1.0f, 1.0f)); - // ***** SWITCH ********* -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, MS20Filter) { - Model *modelMS20Filter = Model::create("Lindenberg Research", "MS20 VCF", "Valerie MS20 Filter", FILTER_TAG); - return modelMS20Filter; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/ReShaper.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/ReShaper.cpp deleted file mode 100644 index 161815cd..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/ReShaper.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct ReShaper : Module { - enum ParamIds { - RESHAPER_AMOUNT, - RESHAPER_CV_AMOUNT, - NUM_PARAMS - }; - - enum InputIds { - RESHAPER_INPUT, - RESHAPER_CV_INPUT, - NUM_INPUTS - }; - - enum OutputIds { - RESHAPER_OUTPUT, - NUM_OUTPUTS - }; - - enum LightIds { - NUM_LIGHTS - }; - - - ReShaper() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - - - void step() override; -}; - - -void ReShaper::step() { - // normalize signal input to [-1.0...+1.0] - float x = clamp(inputs[RESHAPER_INPUT].value * 0.1f, -1.f, 1.f); - float cv = inputs[RESHAPER_CV_INPUT].value * params[RESHAPER_CV_AMOUNT].value; - float a = clamp(params[RESHAPER_AMOUNT].value + cv, 1.f, 50.f); - - // do the acid! - float out = x * (fabs(x) + a) / (x * x + (a - 1) * fabs(x) + 1); - - outputs[RESHAPER_OUTPUT].value = out * 5.0f; -} - - -/** - * @brief Reshaper Panel - */ -struct ReShaperWidget : LRModuleWidget { - ReShaperWidget(ReShaper *module); -}; - - -ReShaperWidget::ReShaperWidget(ReShaper *module) : LRModuleWidget(module) { - // setPanel(SVG::load(assetPlugin(plugin, "res/ReShaper.svg"))); - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/ReShaper.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - - // ***** MAIN KNOBS ****** - addParam(ParamWidget::create(Vec(32, 216), module, ReShaper::RESHAPER_AMOUNT, 1.f, 50.f, 1.f)); - addParam(ParamWidget::create(Vec(48, 126), module, ReShaper::RESHAPER_CV_AMOUNT, 0.f, 5.f, 0.f)); - // ***** MAIN KNOBS ****** - - - // ***** INPUTS ********** - addInput(Port::create(Vec(21, 60), Port::INPUT, module, ReShaper::RESHAPER_INPUT)); - addInput(Port::create(Vec(71, 60), Port::INPUT, module, ReShaper::RESHAPER_CV_INPUT)); - // ***** INPUTS ********** - - // ***** OUTPUTS ********* - addOutput(Port::create(Vec(46, 320), Port::OUTPUT, module, ReShaper::RESHAPER_OUTPUT)); - // ***** OUTPUTS ********* -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, ReShaper) { - Model *modelReShaper = Model::create("Lindenberg Research", "ReShaper", "ReShaper Wavefolder", WAVESHAPER_TAG); - return modelReShaper; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/Release.h b/plugins/community/repos/LindenbergResearch__ORIG/src/Release.h deleted file mode 100644 index 5535e9ab..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/Release.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#define VERSION_MAJOR "0" -#define VERSION_MINOR "6" -#define VERSION_PATCH "0" -#define VERSION_STR "Version " VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/SimpleFilter.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/SimpleFilter.cpp deleted file mode 100644 index f099931c..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/SimpleFilter.cpp +++ /dev/null @@ -1,184 +0,0 @@ -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct SimpleFilter : Module { - enum ParamIds { - CUTOFF_PARAM, - RESONANCE_PARAM, - CUTOFF_CV_PARAM, - RESONANCE_CV_PARAM, - NUM_PARAMS - }; - enum InputIds { - FILTER_INPUT, - CUTOFF_CV_INPUT, - RESONANCE_CV_INPUT, - NUM_INPUTS - }; - enum OutputIds { - FILTER_OUTPUT, - NUM_OUTPUTS - }; - enum LightIds { - NUM_LIGHTS - }; - - float f, p, q; - float b0, b1, b2, b3, b4; - float t1, t2; - float frequency, resonance, in; - - - SimpleFilter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) { - f = 0; - p = 0; - q = 0; - b0 = 0; - b1 = 0; - b2 = 0; - b3 = 0; - b4 = 0; - t1 = 0; - t2 = 0; - frequency = 0; - resonance = 0; - in = 0; - } - - - void step() override; - - - // For more advanced Module features, read Rack's engine.hpp header file - // - toJson, fromJson: serialization of internal data - // - onSampleRateChange: event triggered by a change of sample rate - // - reset, randomize: implements special behavior when user clicks these from the context menu -}; - - -float clip(float in, float level) { - // clipping high - if (in > level) { - in = level; - } - - // clipping low - if (in < -level) { - in = -level; - } - - return in; -} - - -void SimpleFilter::step() { - // Moog 24 dB/oct resonant lowpass VCF - // References: CSound source code, Stilson/Smith CCRMA paper. - // Modified by paul.kellett@maxim.abel.co.uk July 2000 - // - // Adapted for VCV Rack by Lindenberg Research - // http://musicdsp.org/showArchiveComment.php?ArchiveID=25 - - // calculate CV inputs - float cutoffCVValue = (inputs[CUTOFF_CV_INPUT].value * 0.05f * params[CUTOFF_CV_PARAM].value); - float resonanceCVValue = (inputs[RESONANCE_CV_INPUT].value * 0.1f * params[RESONANCE_CV_PARAM].value); - - // translate frequency to logarithmic scale - float freqHz = 20.f * powf(1000.f, params[CUTOFF_PARAM].value + cutoffCVValue); - frequency = clip(freqHz * (1.f / (engineGetSampleRate() / 2.0f)), 1.f); - resonance = clip(params[RESONANCE_PARAM].value + resonanceCVValue, 1.f); - - // normalize signal input to [-1.0...+1.0] - // filter starts to be very unstable for input gain above 1.f and below 0.f - in = clip(inputs[FILTER_INPUT].value * 0.1f, 1.0f); - - // Set coefficients given frequency & resonance [0.0...1.0] - q = 1.0f - frequency; - p = frequency + 0.8f * frequency * q; - f = p + p - 1.0f; - q = resonance * (1.0f + 0.5f * q * (1.0f - q + 5.6f * q * q)); - - - in -= q * b4; - - t1 = b1; - b1 = (in + b0) * p - b1 * f; - - t2 = b2; - b2 = (b1 + t1) * p - b2 * f; - - t1 = b3; - b3 = (b2 + t2) * p - b3 * f; - - b4 = (b3 + t1) * p - b4 * f; - - b4 = b4 - b4 * b4 * b4 * 0.166666667f; - b0 = in; - - // Lowpass output: b4 - // Highpass output: in - b4; - // Bandpass output: 3.0f * (b3 - b4); - - - // scale normalized output back to +/-5V - outputs[FILTER_OUTPUT].value = clip(b4, 1.0f) * 5.0f; -} - - -/** - * @brief Recover of old filer - */ -struct SimpleFilterWidget : LRModuleWidget { - SimpleFilterWidget(SimpleFilter *module); -}; - - -SimpleFilterWidget::SimpleFilterWidget(SimpleFilter *module) : LRModuleWidget(module) { - //setPanel(SVG::load(assetPlugin(plugin, "res/SimpleFilter.svg"))); - - panel = new LRPanel(); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/SimpleFilter.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - // ***** MAIN KNOBS ****** - addParam(ParamWidget::create(Vec(75 - 28, 167), module, SimpleFilter::CUTOFF_PARAM, 0.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(75 - 21, 252), module, SimpleFilter::RESONANCE_PARAM, -0.f, 1.f, 0.0f)); - // ***** MAIN KNOBS ****** - - // ***** CV INPUTS ******* - addParam(ParamWidget::create(Vec(39 - 12, 120), module, SimpleFilter::CUTOFF_CV_PARAM, 0.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(111 - 12, 120), module, SimpleFilter::RESONANCE_CV_PARAM, 0.f, 1.f, 0.f)); - - addInput(Port::create(Vec(39 - 14, 60), Port::INPUT, module, SimpleFilter::CUTOFF_CV_INPUT)); - addInput(Port::create(Vec(111 - 14, 60), Port::INPUT, module, SimpleFilter::RESONANCE_CV_INPUT)); - // ***** CV INPUTS ******* - - // ***** INPUTS ********** - addInput(Port::create(Vec(39 - 14, 320), Port::INPUT, module, SimpleFilter::FILTER_INPUT)); - // ***** INPUTS ********** - - // ***** OUTPUTS ********* - addOutput(Port::create(Vec(111 - 14, 320), Port::OUTPUT, module, SimpleFilter::FILTER_OUTPUT)); - // ***** OUTPUTS ********* -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, SimpleFilter) { - Model *modelSimpleFilter = Model::create("Lindenberg Research", "LPFilter24dB", "24dB Lowpass Filter", - FILTER_TAG); - return modelSimpleFilter; -} - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/VCO.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/VCO.cpp deleted file mode 100644 index c1d3d545..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/VCO.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "dsp/Oscillator.hpp" -#include "LindenbergResearch.hpp" - -namespace rack_plugin_LindenbergResearch { - -struct VCO : LRModule { - enum ParamIds { - FREQUENCY_PARAM, - OCTAVE_PARAM, - FM_CV_PARAM, - SHAPE_CV_PARAM, - PW_CV_PARAM, - SHAPE_PARAM, - PW_PARAM, - NUM_PARAMS - }; - enum InputIds { - VOCT_INPUT, - FM_CV_INPUT, - PW_CV_INPUT, - SHAPE_CV_INPUT, - NUM_INPUTS - }; - enum OutputIds { - SAW_OUTPUT, - PULSE_OUTPUT, - SINE_OUTPUT, - TRI_OUTPUT, - NUM_OUTPUTS - }; - enum LightIds { - NUM_LIGHTS - }; - - dsp::BLITOscillator *osc = new dsp::BLITOscillator(); - LCDWidget *label1 = new LCDWidget(COLOR_CYAN, 6); - - VCO() : LRModule(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} - - - void step() override; -}; - - -void VCO::step() { - LRModule::step(); - - float fm = clamp(inputs[FM_CV_INPUT].value, -10.f, 10.f) * 400.f * quadraticBipolar(params[FM_CV_PARAM].value); - - osc->updatePitch(inputs[VOCT_INPUT].value, clamp(fm, -10000.f, 10000.f), params[FREQUENCY_PARAM].value, params[OCTAVE_PARAM].value); - - float shape = quadraticBipolar(params[SHAPE_PARAM].value); - float pw = params[PW_CV_PARAM].value; - - if (osc->shape != shape) { - osc->setShape(shape); - } - - if (osc->pw != pw) { - osc->setPulseWidth(pw); - } - - osc->proccess(); - - outputs[SAW_OUTPUT].value = osc->saw; - - outputs[PULSE_OUTPUT].value = osc->pulse; - outputs[SINE_OUTPUT].value = osc->sine; - - outputs[TRI_OUTPUT].value = osc->tri; - - if (cnt % 1200 == 0) { - label1->text = stringf("%.2f Hz", osc->getFrequency()); - } -} - - -/** - * @brief Woldemar VCO - */ -struct VCOWidget : LRModuleWidget { - VCOWidget(VCO *module); -}; - - -VCOWidget::VCOWidget(VCO *module) : LRModuleWidget(module) { - // setPanel(SVG::load(assetPlugin(plugin, "res/VCO.svg"))); - - panel = new LRPanel(20,40); - panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCO.svg"))); - addChild(panel); - - box.size = panel->box.size; - - // ***** SCREWS ********** - addChild(Widget::create(Vec(15, 1))); - addChild(Widget::create(Vec(box.size.x - 30, 1))); - addChild(Widget::create(Vec(15, 366))); - addChild(Widget::create(Vec(box.size.x - 30, 366))); - // ***** SCREWS ********** - - - // ***** MAIN KNOBS ****** - addParam(ParamWidget::create(Vec(83, 172.0), module, VCO::FREQUENCY_PARAM, -15.f, 15.f, 0.f)); - addParam(ParamWidget::create(Vec(85, 240), module, VCO::OCTAVE_PARAM, -3.f, 3.f, 0.f)); - - addParam(ParamWidget::create(Vec(118, 111.5), module, VCO::PW_PARAM, -.1f, 1.f, 1.f)); - addParam(ParamWidget::create(Vec(65, 60), module, VCO::SHAPE_CV_PARAM, -1.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(15, 267), module, VCO::FM_CV_PARAM, -1.f, 1.f, 0.f)); - addParam(ParamWidget::create(Vec(65, 111.5), module, VCO::PW_CV_PARAM, 0.02f, 1.f, 1.f)); - addParam(ParamWidget::create(Vec(118, 59), module, VCO::SHAPE_PARAM, 1.f, 5.f, 1.f)); - - - // ***** MAIN KNOBS ****** - - - // ***** INPUTS ********** - addInput(Port::create(Vec(15, 182), Port::INPUT, module, VCO::VOCT_INPUT)); - addInput(Port::create(Vec(15, 228), Port::INPUT, module, VCO::FM_CV_INPUT)); - addInput(Port::create(Vec(15, 112), Port::INPUT, module, VCO::PW_CV_INPUT)); - addInput(Port::create(Vec(15, 60), Port::INPUT, module, VCO::SHAPE_CV_INPUT)); - - // addInput(createInput(Vec(71, 60), module, VCO::RESHAPER_CV_INPUT)); - // ***** INPUTS ********** - - // ***** OUTPUTS ********* - // addOutput(createOutput(Vec(20, 320), module, VCO::SAW_OUTPUT)); - addOutput(Port::create(Vec(20.8, 304.5), Port::OUTPUT, module, VCO::SAW_OUTPUT)); - addOutput(Port::create(Vec(57.2, 304.5), Port::OUTPUT, module, VCO::PULSE_OUTPUT)); - addOutput(Port::create(Vec(96.1, 304.5), Port::OUTPUT, module, VCO::SINE_OUTPUT)); - addOutput(Port::create(Vec(132, 304.5), Port::OUTPUT, module, VCO::TRI_OUTPUT)); - // ***** OUTPUTS ********* - - module->label1->box.pos = Vec(30,110); - - addChild(module->label1); -} - -} // namespace rack_plugin_LindenbergResearch - -using namespace rack_plugin_LindenbergResearch; - -RACK_PLUGIN_MODEL_INIT(LindenbergResearch, VCO) { - Model *modelVCO = Model::create("Lindenberg Research", "VCO", "Voltage Controlled Oscillator", OSCILLATOR_TAG); - return modelVCO; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPEffect.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPEffect.hpp deleted file mode 100644 index 6bc283a1..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPEffect.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -namespace rack { - - /** - * @brief Base class for all signal processors - */ - struct DSPEffect { - - /** - * @brief Method for mark parameters as invalidate to trigger recalculation - */ - virtual void invalidate() {}; - - - /** - * @brief Process one step and return the computed sample - * @return - */ - virtual void process() {}; - }; - -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.cpp deleted file mode 100644 index 3a56c6ee..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include "DSPMath.hpp" - -/** - * @brief Clip signal at bottom by value - * @param in Sample input - * @param clip Clipping value - * @return Clipped sample - */ -float clipl(float in, float clip) { - if (in < clip) return clip; - else return in; -} - - -/** - * @brief Clip signal at top by value - * @param in Sample input - * @param clip Clipping value - * @return Clipped sample - */ -float cliph(float in, float clip) { - if (in > clip) return clip; - else return in; -} - - -/** - * @brief Wrap input number between -PI..PI - * @param n Input number - * @return Wrapped value - */ -float wrapTWOPI(float n) { - float b = 1.f / TWOPI * n; - return (b - lround(b)) * TWOPI; -} - - -/** - * @brief Get PLL increment depending on frequency - * @param frq Frequency - * @return PLL increment - */ -float getPhaseIncrement(float frq) { - return TWOPI * frq / engineGetSampleRate(); -} - - -/** - * @brief Actual BLIT core computation - * @param N Harmonics - * @param phase Current phase value - * @return - */ -float BLITcore(float N, float phase) { - float a = wrapTWOPI((clipl(N - 1, 0.f) + 0.5f) * phase); - float x = fastSin(a) * 1.f / fastSin(0.5f * phase); - return (x - 1.f) * 2.f; -} - - -/** - * @brief BLIT generator based on current phase - * @param N Harmonics - * @param phase Current phase of PLL - * @return - */ -float BLIT(float N, float phase) { - if (phase == 0.f) return 1.f; - else return BLITcore(N, phase); -} - - -/** - * @brief Add value to integrator - * @param x Input - * @param Fn - * @return - */ -float Integrator::add(float x, float Fn) { - value = (x - value) * (d * Fn) + value; - return value; -} - - -/** - * @brief Filter function for DC block - * @param x Input sample - * @return Filtered sample - */ -float DCBlocker::filter(float x) { - float y = x - xm1 + R * ym1; - xm1 = x; - ym1 = y; - - return y; -} - - -/** - * @brief Filter function for simple 6dB lowpass filter - * @param x Input sample - * @return - */ -float LP6DBFilter::filter(float x) { - float y = y0 + (alpha * (x - y0)); - y0 = y; - - return y; -} - - -/** - * @brief Update filter parameter - * @param fc Cutoff frequency - */ -void LP6DBFilter::updateFrequency(float fc, int factor) { - LP6DBFilter::fc = fc; - RC = 1.f / (LP6DBFilter::fc * TWOPI); - dt = 1.f / engineGetSampleRate() * factor; - alpha = dt / (RC + dt); -} - - -/** - * @brief Shaper type 1 (Saturate) - * @param a Amount from 0 - x - * @param x Input sample - * @return - */ -float shape1(float a, float x) { - float k = 2 * a / (1 - a); - float b = (1 + k) * (x * 0.5f) / (1 + k * fabsf(x * 0.5f)); - - return b * 4; -} - - -/** - * @brief Waveshaper as used in ReShaper. Input should be in the range -1..+1 - * @param a Shaping factor - * @param x Input sample - * @return - */ -float shape2(float a, float x) { - return atanf(x * a);//x * (fabs(x) + a) / (x * x + (a - 1) * fabs(x) + 1); -} - -/** - * @brief Soft saturating with a clip of a. Works only with positive values so use 'b' as helper here. - * @param x Input sample - * @param a Saturating threshold - * @return - */ -double saturate(double x, double a) { - double b = 1; - - /* turn negative values positive and remind in b as coefficient */ - if (x < 0) { - b = -1; - x *= -1; - } - - // nothing to do - if (x <= a) return x * b; - - double d = (a + (x - a) / (1 + pow((x - a) / (1 - a), 2))); - - if (d > 1) { - return (a + 1) / 2 * b; - } else { - return d * b; - } -} - - -/** - * @brief - * @param input - * @return - */ -double overdrive(double input) { - const double x = input * 0.686306; - const double a = 1 + exp(sqrt(fabs(x)) * -0.75); - return (exp(x) - exp(-x * a)) / (exp(x) + exp(-x)); -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.hpp deleted file mode 100644 index ce6d8f6e..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPMath.hpp +++ /dev/null @@ -1,314 +0,0 @@ -#pragma once - -#include -#include -#include "rack.hpp" -#include "dsp/decimator.hpp" - -using namespace rack; - -const static float TWOPI = (float) M_PI * 2; - - -/** - * @brief Basic leaky integrator - */ -struct Integrator { - float d = 0.25f; - float value = 0.f; - - /** - * @brief Add value to integrator - * @param x Input sample - * @param Fn - * @return Current integrator state - */ - float add(float x, float Fn); -}; - - -/** - * @brief Filter out DC offset / 1-Pole HP Filter - */ -struct DCBlocker { - const float R = 0.999; - float xm1 = 0.f, ym1 = 0.f; - - /** - * @brief Filter signal - * @param x Input sample - * @return Filtered output - */ - float filter(float x); -}; - - -/** - * @brief Simple 6dB lowpass filter - */ -struct LP6DBFilter { -private: - float RC; - float dt; - float alpha; - float y0; - float fc; - -public: - - /** - * @brief Create a new filter with a given cutoff frequency - * @param fc cutoff frequency - * @param factor Oversampling factor - */ - LP6DBFilter(float fc, int factor) { - updateFrequency(fc, factor); - y0 = 0.f; - } - - - /** - * @brief Set new cutoff frequency - * @param fc cutoff frequency - */ - void updateFrequency(float fc, int factor); - - /** - * @brief Filter signal - * @param x Input sample - * @return Filtered output - */ - float filter(float x); -}; - - -/** - * @brief Simple noise generator - */ -struct Noise { - - Noise() { - - } - - - float nextFloat(float gain) { - static std::default_random_engine e; - static std::uniform_real_distribution<> dis(0, 1); // rage 0 - 1 - return (float) dis(e) * gain; - } -}; - - -/** - * @brief Simple oversampling class - */ -template -struct OverSampler { - - struct Vector { - float y0, y1; - }; - - Vector y[CHANNELS] = {}; - float up[CHANNELS][OVERSAMPLE] = {}; - float data[CHANNELS][OVERSAMPLE] = {}; - Decimator decimator[CHANNELS]; - int factor = OVERSAMPLE; - - - /** - * @brief Constructor - * @param factor Oversampling factor - */ - OverSampler() {} - - - /** - * @brief Return linear interpolated position - * @param point Point in oversampled data - * @return - */ - float interpolate(int channel, int point) { - return y[channel].y0 + (point / factor) * (y[channel].y1 - y[channel].y0); - } - - - /** - * @brief Create up-sampled data out of two basic values - */ - void doUpsample(int channel) { - for (int i = 0; i < factor; i++) { - up[channel][i] = interpolate(channel, i + 1); - } - } - - - /** - * @brief Downsample data from a given channel - * @param channel Channel to proccess - * @return Downsampled point - */ - float getDownsampled(int channel) { - return decimator[channel].process(data[channel]); - } - - - /** - * @brief Step to next sample point - * @param y Next sample point - */ - void next(int channel, float n) { - y[channel].y0 = y[channel].y1; - y[channel].y1 = n; - } -}; - - -/** - * @brief Fast sin approximation - * @param angle Angle - * @return App. value - */ -inline float fastSin(float angle) { - float sqr = angle * angle; - float result = -2.39e-08f; - result *= sqr; - result += 2.7526e-06f; - result *= sqr; - result -= 1.98409e-04f; - result *= sqr; - result += 8.3333315e-03f; - result *= sqr; - result -= 1.666666664e-01f; - result *= sqr; - result += 1.0f; - result *= angle; - return result; -} - - -float wrapTWOPI(float n); - -float getPhaseIncrement(float frq); - -float clipl(float in, float clip); - -float cliph(float in, float clip); - -float BLIT(float N, float phase); - -float shape1(float a, float x); - -double saturate(double x, double a); - -double overdrive(double input); - -float shape2(float a, float x); - - -/** - * @brief Double version of clamp - * @param x - * @param min - * @param max - * @return - */ -inline double clampd(double x, double min, double max) { - return fmax(fmin(x, max), min); -} - - -/** - * @brief Soft clipping - * @param x - * @param sat - * @param satinv - * @return - */ -inline float clip(float x, float sat, float satinv) { - float v2 = (x * satinv > 1 ? 1 : - (x * satinv < -1 ? -1 : - x * satinv)); - return (sat * (v2 - (1.f / 3.f) * v2 * v2 * v2)); -} - - -/** - * @brief Clamp without branching - * @param input Input sample - * @return - */ -inline double saturate2(double input) { //clamp without branching - const double _limit = 0.3; - double x1 = fabs(input + _limit); - double x2 = fabs(input - _limit); - return 0.5 * (x1 - x2); -} - - -/** - * @brief Fast arctan approximation, corresponds to tanhf() but decreases y to infinity - * @param x - * @return - */ -inline float fastatan(float x) { - return (x / (1.0f + 0.28f * (x * x))); -} - - -/** - * @brief Linear fade of two points - * @param a Point 1 - * @param b Point 2 - * @param n Fade value - * @return - */ -inline float fade2(float a, float b, float n) { - return (1 - n) * a + n * b; -} - - -/** - * @brief Linear fade of five points - * @param a Point 1 - * @param b Point 2 - * @param c Point 3 - * @param d Point 4 - * @param e Point 5 - * @param n Fade value - * @return - */ -inline float fade5(float a, float b, float c, float d, float e, float n) { - if (n >= 0 && n < 1) { - return fade2(a, b, n); - } else if (n >= 1 && n < 2) { - return fade2(b, c, n - 1); - } else if (n >= 2 && n < 3) { - return fade2(c, d, n - 2); - } else if (n >= 3 && n < 4) { - return fade2(d, e, n - 3); - } - - return e; -} - - -/** -* @brief Shapes between 0..1 with a log type courve -* @param x -* @return -*/ -inline float cubicShape(float x) { - return (x - 1.f) * (x - 1.f) * (x - 1.f) + 1.f; -} - - -/** - * @brief ArcTan like shaper for foldback distortion - * @param x - * @return - */ -inline float atanShaper(float x) { - return x / (1.f + (0.28f * x * x)); -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPSystem.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPSystem.hpp deleted file mode 100644 index c08b1b29..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/DSPSystem.hpp +++ /dev/null @@ -1,310 +0,0 @@ -#pragma once -#define DEFAULT_SR 44100.0f -#define TRIGGER_PROCESSING true - -/** - * @brief Basic DSP types - */ - -namespace dsp { - - /** - * @brief Represents an IOPort of a DSP system - */ - struct DSPPort { - float value; - }; - - - /** - * @brief Represents a parameter of a DSP system - */ - struct DSPParam { - float value; - }; - - - /** - * @brief Base class for all signal processors - */ - template - struct DSPSystem { - - /** - * @brief Enumerate all Inputs - */ - enum Inputs { - }; - - /** - * @brief Enumerate all Outputs - */ - enum Outputs { - }; - - /** - * @brief Enumerate all Parameters - */ - enum Params { - }; - - protected: -#ifdef _MSC_VER - DSPPort input[NUM_IN]; - DSPPort output[NUM_OUT]; - DSPParam param[NUM_PARAM + 1]; -#else - DSPPort input[NUM_IN] = {}; - DSPPort output[NUM_OUT] = {}; - DSPParam param[NUM_PARAM] = {}; -#endif - - float sr; - - public: - - /** - * @brief Default constructor - */ - DSPSystem() { - sr = DEFAULT_SR; - } - - - /** - * @brief Init system with sample rate - * @param sr - */ - explicit DSPSystem(float sr) : sr(sr) {} - - - /** - * @brief Update sample rate on change - * @param sr - */ - void updateSampleRate(float sr) { - DSPSystem::sr = sr; - invalidate(); - } - - - /** - * @brief Update a parameter of the system - * @param id Parameter ID - * @param value Value - * @param trigger Trigger call of invalidate() - use false to supress - */ - void setParam(int id, float value, bool trigger = true) { - if (param[id].value != value) { - param[id].value = value; - - /* setup of new parameter triggers invalidation per default */ - if (trigger) { - invalidate(); - } - } - - } - - - /** - * @brief Get the current parameter value by ID - * @param id Parameter ID - * @return current value - */ - float getParam(int id) { - return param[id].value; - } - - - /** - * @brief Get the current value of the output by ID - * @param id - * @return - */ - float getOutput(int id) { - return output[id].value; - } - - - /** - * @brief Set input port to new value - * @param id Port ID - * @param value - */ - void setInput(int id, float value, bool proccess = false) { - input[id].value = value; - - if (proccess) { - process(); - } - } - - - /** - * @brief Get current output value - * @param id Output ID - * @return - */ - float getOut(int id) { - return output[id].value; - } - - - /** - * @brief Method for mark parameters as invalidate to trigger recalculation - */ - virtual void invalidate() {}; - - - /** - * @brief Process one step and return the computed sample - * @return - */ - virtual void process() {}; - }; - - - /** - * @brief Basic 1 in and 1 out system definition - */ - struct DSPSystem1x1 : DSPSystem<1, 1, 0> { - enum Inputs { - IN - }; - - enum Outputs { - OUT - }; - - - /** - * @brief Get the delayed sample from signal, to processing are triggered - * @return - */ - float get() { - return output[OUT].value; - } - - - /** - * @brief Set new value to Input and trigger processing - * @param value - */ - void set(float value) { - setInput(IN, value, TRIGGER_PROCESSING); - } - }; - - -/** - * @brief Basic 1 in and 1 out system definition - */ - struct DSPSystem2x1 : DSPSystem<2, 1, 0> { - enum Inputs { - IN1, - IN2 - }; - - enum Outputs { - OUT - }; - - - /** - * @brief Get the delayed sample from signal, to processing are triggered - * @return - */ - float get() { - return output[OUT].value; - } - - - /** - * @brief Set new value to Input and trigger processing - * @param value - */ - void set(float in1, float in2, bool proccess = true) { - setInput(IN1, in1); - setInput(IN2, in2, proccess); - - } - }; - - -/** - * @brief Basic 1 in and 1 out system definition - */ - struct DSPSystem2x2 : DSPSystem<2, 2, 0> { - enum Inputs { - IN1, - IN2 - }; - - enum Outputs { - OUT1, - OUT2 - }; - - - /** - * @brief Get the delayed sample from signal, to processing are triggered - * @return - */ - float get(int out = 0) { - return output[out].value; - } - - - /** - * @brief Set new value to Input and trigger processing - * @param value - */ - void set(float in1, float in2, bool process = true) { - setInput(IN1, in1); - setInput(IN2, in2, process); - - } - }; - /** - * @brief Delayed signal model - * @tparam SIZE - */ - template - struct DSPDelay : DSPSystem1x1 { - - private: - float buffer[SIZE] = {}; - - - /** - * @brief Shift left all elements - */ - void shift() { - for (int i = 0; i < SIZE - 1; i++) { - buffer[i] = buffer[i + 1]; - } - } - - - public: - - /** - * @brief Proccess the Delay - */ - void process() override { - /* shift all elements left */ - shift(); - /* set last element to current input */ - buffer[SIZE - 1] = input[IN].value; - /* set output */ - output[OUT].value = buffer[0]; - } - }; - - - /** - * @brief Shortcut for a classic z^-1 delay (1-Sample) - */ - typedef DSPDelay<1> DSPDelay1; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.cpp deleted file mode 100644 index be4e3321..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include "LadderFilter.hpp" - -using namespace rack; - - -/** - * @brief Constructor - */ -LadderFilter::LadderFilter() {} - - -/** - * @brief Check parameter - */ -void LadderFilter::invalidate() { - // Set coefficients given frequency & resonance [0.0...1.0] - q = 1.0f - freqExp; - p = freqExp + 0.8f * freqExp * q; - f = p + p - 1.0f; - q = resExp * (1.0f + 0.5f * q * (1.0f - q + 5.6f * q * q)); -} - - -/** - * @brief Calculate new sample - * @return - */ -void LadderFilter::process() { - os.next(LOWPASS, in); - os.doUpsample(LOWPASS); - - for (int i = 0; i < os.factor; i++) { - float x = os.up[LOWPASS][i]; - - // non linear feedback with nice saturation - x -= fastatan(bx * q); - - t1 = b1; - b1 = ((x + b0) * p - b1 * f); - - t2 = b2; - b2 = ((b1 + t1) * p - b2 * f); - - t1 = b3; - b3 = ((b2 + t2) * p - b3 * f); - - t2 = b4; - b4 = ((b3 + t1) * p - b4 * f); - - b5 = ((b4 + t2) * p - b5 * f); - - // fade over filter poles from 3dB/oct (1P) => 48dB/oct (5P) - bx = fade5(b1, b2, b3, b4, b5, slope); - - // saturate and add very low noise to have self oscillation with no input and high res - b0 = fastatan(x + noise.nextFloat(NOISE_GAIN)); - - float y = bx * (1 + drive * 40); - - if (fabs(y) > 1) { - lightValue = (lightValue + fabs(y) / 5) / 2; - } else { - lightValue *= 0.99; - } - - - // overdrive with fast atan, which folds back the waves at high input and creates a noisy bright sound - os.data[LOWPASS][i] = fastatan(y); - } - - lpOut = os.getDownsampled(LOWPASS) * (INPUT_GAIN / (drive * 20 + 1) * (quadraticBipolar(drive * 3) + 1)); -} - - -/** - * @brief Return cutoff frequency in the range of 0..1 - * @return - */ -float LadderFilter::getFrequency() const { - return frequency; -} - - -/** - * @brief Update cutoff frequency in the range of 0..1 - * @param frequency - */ -void LadderFilter::setFrequency(float frequency) { - if (LadderFilter::frequency != frequency) { - LadderFilter::frequency = frequency; - // translate frequency to logarithmic scale - freqHz = 20.f * powf(1000.f, frequency); - freqExp = clamp(freqHz * (1.f / (engineGetSampleRate() * OVERSAMPLE / 2.f)), 0.f, 1.f); - - updateResExp(); - invalidate(); - } -} - - -/** - * @brief Update resonance factor - */ -void LadderFilter::updateResExp() { - resExp = clamp(resonance, 0.f, 1.5f); -} - - -/** - * @brief Get resonance - * @return - */ -float LadderFilter::getResonance() const { - return resExp; -} - - -/** - * @brief Set resonance - * @param resonance - */ -void LadderFilter::setResonance(float resonance) { - if (LadderFilter::resonance != resonance) { - LadderFilter::resonance = resonance; - - updateResExp(); - invalidate(); - } -} - - -/** - * @brief Get overdrive - * @return - */ -float LadderFilter::getDrive() const { - return drive; -} - - -/** - * @brief Set overdrive - * @param drive - */ -void LadderFilter::setDrive(float drive) { - if (LadderFilter::drive != drive) { - LadderFilter::drive = clamp(drive, 0.f, 1.f); - - updateResExp(); - invalidate(); - } -} - - -/** - * @brief Set input channel with sample - * @param in - */ -void LadderFilter::setIn(float in) { - float x = clamp(in / INPUT_GAIN, -0.8f, 0.8f); - - LadderFilter::in = x; -} - - -/** - * @brief Get lowpass output - * @return - */ -float LadderFilter::getLpOut() { - return lpOut; -} - - -/** - * @brief Get frequency of cutoff in Hz - * @return - */ -float LadderFilter::getFreqHz() const { - return freqHz; -} - - -/** - * @brief Get filter slope - * @return - */ -float LadderFilter::getSlope() const { - return slope; -} - - -/** - * @brief Set filter slope - * @param slope - */ -void LadderFilter::setSlope(float slope) { - LadderFilter::slope = clamp(slope, 0.f, 4.f); -} - - -/** - * @brief Get the current light value for overload - * @return - */ -float LadderFilter::getLightValue() const { - return lightValue; -} - - -/** - * @brief Set value for overload - * @param lightValue - */ -void LadderFilter::setLightValue(float lightValue) { - LadderFilter::lightValue = lightValue; -} diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.hpp deleted file mode 100644 index a6ceb723..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/LadderFilter.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - - -#include "DSPEffect.hpp" -#include "engine.hpp" -#include "DSPMath.hpp" - -namespace rack { - - struct LadderFilter : DSPEffect { - - static const int OVERSAMPLE = 8; // factor of internal oversampling - static constexpr float NOISE_GAIN = 10e-10f; // internal noise gain used for self-oscillation - static constexpr float INPUT_GAIN = 20.f; // input level - - enum FXChannel { - LOWPASS - }; - - private: - float f, p, q; - float b0, b1, b2, b3, b4, b5, bx; - float t1, t2; - float freqExp, freqHz, frequency, resExp, resonance, drive, slope; - float in, lpOut; - float lightValue; - - OverSampler os; - Noise noise; - - void updateResExp(); - - public: - LadderFilter(); - - void invalidate() override; - - void process() override; - - float getFrequency() const; - void setFrequency(float frequency); - float getResonance() const; - void setResonance(float resonance); - float getDrive() const; - void setDrive(float drive); - float getFreqHz() const; - - float getSlope() const; - void setSlope(float slope); - void setIn(float in); - float getLpOut(); - float getLightValue() const; - void setLightValue(float lightValue); - }; -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.cpp deleted file mode 100644 index aa5ca67f..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "MS20zdf.hpp" - -using namespace dsp; - - -/** - * @brief Calculate prewarped vars on parameter change - */ -void MS20zdf::invalidate() { - // translate frequency to logarithmic scale - // freqHz = 20.f * powf(860.f, param[FREQUENCY].value) - 20.f; - freqHz = 20.f * powf(950.f, param[FREQUENCY].value) - 20.f; - - b = tanf(freqHz * (float) M_PI / sr / OVERSAMPLE); - g = b / (1 + b); - - /* use shifted negative cubic shape for logarithmic like shaping of the peak parameter */ - k = 2.f * cubicShape(param[PEAK].value) * 1.0001f; - g2 = g * g; -} - - -/** - * @brief Proccess one sample of filter - */ -void MS20zdf::process() { - os.next(IN, input[IN].value); - os.doUpsample(IN); - - float s1, s2; - float gain = quadraticBipolar(param[DRIVE].value) * DRIVE_GAIN + 1.f; - float type = param[TYPE].value; - float x = 0; - - for (int i = 0; i < os.factor; i++) { - x = os.up[IN][i]; - - zdf1.set(x - ky, g); - s1 = zdf1.s; - - zdf2.set(zdf1.y + ky, g); - s2 = zdf2.s; - - y = 1.f / (g2 * k - g * k + 1.f) * (g2 * x + g * s1 + s2); - - ky = k * atanf(y / 70.f) * 70.f; - - if (type > 0) { - os.data[IN][i] = atanShaper(gain * y / 10.f) * 10.f; - } else { - os.data[IN][i] = atanf(gain * y / 10.f) * 10.f; - - } - } - - float out = os.getDownsampled(IN); - - output[OUT].value = out; -} - - -/** - * @brief Inherit constructor - * @param sr sample rate - */ -MS20zdf::MS20zdf(float sr) : DSPSystem(sr) {} - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.hpp deleted file mode 100644 index 319298f1..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/MS20zdf.hpp +++ /dev/null @@ -1,138 +0,0 @@ -#pragma once - -#include "DSPSystem.hpp" -#include "DSPMath.hpp" - -namespace dsp { - - - /** - * @brief - */ - struct MS20TPT : DSPSystem2x1 { - float s = 0; - DSPDelay1 z; - - - void process() override { - float gx = input[IN1].value * input[IN2].value; - - z.set(gx + z.get() + gx); - s = z.get(); - } - }; - - - /** - * @brief Zero Delay Feedback - */ - struct MS20ZDF : DSPSystem2x2 { - float y = 0; - float s = 0; - MS20TPT tpt; - - - void process() override { - y = input[IN1].value * input[IN2].value + s; - - tpt.set(input[IN1].value - y, input[IN2].value); - s = tpt.s; - } - - }; - - - /** - * @brief MS20 Filter class - */ - struct MS20zdf : DSPSystem<1, 2, 4> { - static const int OVERSAMPLE = 8; // factor of internal oversampling - static constexpr float DRIVE_GAIN = 20.f; // max drive gain - - enum Inputs { - IN - }; - - enum Params { - FREQUENCY, - PEAK, - DRIVE, - TYPE - }; - - enum Outputs { - OUT, - }; - - private: - float g = 0, g2 = 0, b = 0, k = 0; - float ky = 0, y = 0; - float freqHz = 0; - - MS20ZDF zdf1, zdf2; - OverSampler os; - - public: - explicit MS20zdf(float sr); - - - float getFrequency() { - return getParam(FREQUENCY); - } - - - float getFrequencyHz() const { - return freqHz; - } - - - void setFrequency(float value) { - setParam(FREQUENCY, clamp(value, 0.f, 1.1f)); - } - - - void setDrive(float value) { - setParam(DRIVE, clamp(value, 0.f, 1.1f)); - } - - - float getDrive() { - return getParam(DRIVE); - } - - - float getPeak() { - return getParam(PEAK); - } - - - void setPeak(float value) { - setParam(PEAK, clamp(value, 0.f, 1.1f)); - } - - - void setIn(float value) { - setInput(IN, value); - } - - - float getLPOut() { - return getOutput(OUT); - } - - - float getType() { - return getParam(TYPE); - } - - - void setType(float value) { - setParam(TYPE, value); - } - - void invalidate() override; - void process() override; - }; - - -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.cpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.cpp deleted file mode 100644 index 05489d15..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.cpp +++ /dev/null @@ -1,255 +0,0 @@ -#include "DSPMath.hpp" -#include "Oscillator.hpp" - -using namespace dsp; - - -/** - * @brief Set oscillator state back - */ -void BLITOscillator::reset() { - freq = 0.f; - pw = 1.f; - phase = 0.f; - incr = 0.f; - shape = 1.f; - detune = noise.nextFloat(0.32); - drift = 0.f; - warmup = 0.f; - - saw = 0.f; - ramp = 0.f; - pulse = 0.f; - sine = 0.f; - tri = 0.f; - - shape = 1.f; - n = 0; - - _cv = 0.f; - _oct = 0.f; - - _base = 1.f; - _coeff = 1.f; - _tune = 0.f; - _biqufm = 0.f; - - /* force recalculation of variables */ - setFrequency(NOTE_C4); -} - - -/** - * @brief Default constructor - */ -BLITOscillator::BLITOscillator() { - reset(); -} - - -/** - * @brief Default destructor - */ -BLITOscillator::~BLITOscillator() {} - - -/** - * @brief Get current frequency - * @return - */ -float BLITOscillator::getFrequency() const { - return freq; -} - - -/** - * @brief Set frequency - * @param freq - */ -void BLITOscillator::setFrequency(float freq) { - /* just set if frequency differs from old value */ - if (BLITOscillator::freq != freq) { - BLITOscillator::freq = freq; - - /* force recalculation of variables */ - invalidate(); - } -} - - -/** - * @brief Get current pulse-width - * @return - */ -float BLITOscillator::getPulseWidth() const { - return pw; -} - - -/** - * @brief Set current pulse-width - * @param pw - */ -void dsp::BLITOscillator::setPulseWidth(float pw) { - if (pw < 0.1f) { - BLITOscillator::pw = 0.1f; - return; - } - - if (pw > 1.f) { - BLITOscillator::pw = 1.f; - return; - } - - BLITOscillator::pw = pw; - - /* force recalculation of variables */ - invalidate(); -} - - -/** - * @brief Ramp waveform current - * @return - */ -float BLITOscillator::getRampWave() const { - return ramp; -} - - -/** - * @brief Saw waveform current - * @return - */ -float BLITOscillator::getSawWave() const { - return saw; -} - - -/** - * @brief Pulse waveform current - * @return - */ -float BLITOscillator::getPulseWave() const { - return pulse; -} - - -/** - * @brief SawTri waveform current - * @return - */ -float BLITOscillator::getSawTriWave() const { - return sine; -} - - -/** - * @brief Triangle waveform current - * @return - */ -float BLITOscillator::getTriangleWave() const { - return tri; -} - - -/** - * @brief Process band-limited oscillator - */ -void dsp::BLITOscillator::proccess() { - /* phase locked loop */ - phase = wrapTWOPI(incr + phase); - - /* pulse width */ - float w = pw * (float) M_PI; - - /* get impulse train */ - float blit1 = BLIT(n, phase); - float blit2 = BLIT(n, wrapTWOPI(w + phase)); - - /* feed integrator */ - int1.add(blit1, incr); - int2.add(blit2, incr); - - /* integrator delta */ - float delta = int1.value - int2.value; - - /* 3rd integrator */ - float beta = int3.add(delta, incr) * 1.8f; - - /* compute RAMP waveform */ - ramp = int1.value * 0.5f; - /* compute pulse waveform */ - pulse = delta; - /* compute SAW waveform */ - saw = ramp * -1; - - /* compute triangle */ - tri = (float) M_PI / w * beta; - /* compute sine */ - sine = fastSin(phase); - - //TODO: warmup oscillator with: y(x)=1-e^-(x/n) and slope - - saw *= 5; - - -/* sine = shape2(shape, sine); - tri = shape2(shape, tri); - pulse = shape2(shape, pulse);*/ - -} - - -/** - * @brief ReCompute basic parameter - */ -void BLITOscillator::invalidate() { - incr = getPhaseIncrement(freq); - n = (int) floorf(BLIT_HARMONICS / freq); -} - - -/** - * @brief Get saturation - * @return - */ -float BLITOscillator::getSaturate() const { - return shape; -} - - -/** - * @brief Set saturation - * @param saturate - */ -void BLITOscillator::setShape(float saturate) { - BLITOscillator::shape = saturate; -} - - -/** - * @brief Translate from control voltage to frequency - * @param cv ControlVoltage from MIDI2CV - * @param fm Frequency modulation - * @param oct Octave - */ -void dsp::BLITOscillator::updatePitch(float cv, float fm, float tune, float oct) { - // CV is at 1V/OCt, C0 = 16.3516Hz, C4 = 261.626Hz - // 10.3V = 20614.33hz - - /* optimize the usage of expensive exp function and other computations */ - float coeff = (_oct != oct) ? powf(2.f, oct) : _coeff; - float base = (_cv != cv) ? powf(2.f, cv) : _base; - float biqufm = (_tune != tune) ? quadraticBipolar(tune) : _biqufm; - - setFrequency((NOTE_C4 + biqufm) * base * coeff + detune + fm); - - /* save states */ - _cv = cv; - _oct = oct; - _base = base; - _coeff = coeff; - _tune = tune; - _biqufm = biqufm; -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.hpp b/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.hpp deleted file mode 100644 index 735aa4a2..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/src/dsp/Oscillator.hpp +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once - -#include "DSPMath.hpp" -#include "DSPSystem.hpp" - -#define BLIT_HARMONICS 21000.f -#define NOTE_C4 261.626f - -namespace dsp { - - struct DSPIntegrator : DSPSystem<1, 1, 1> { - enum Inputs { - IN - }; - - enum Outputs { - OUT - }; - - enum Params { - D - }; - - float d = 0.25; - float x = 0; - - - }; - - -/** - * @brief Oscillator base class - */ - struct BLITOscillator { - - public: - enum SIGNAL { - SAW, - PULSE, - SINE, - TRI - }; - - - float freq; // oscillator frequency - float pw; // pulse-width value - float phase; // current phase - float incr; // current phase increment for PLL - float detune; // analogue detune - float drift; // oscillator drift - float warmup; // oscillator warmup detune - Noise noise; // randomizer - - float shape; - int n; - - /* currents of waveforms */ - float ramp; - float saw; - float pulse; - float sine; - float tri; - - /* saved frequency states */ - float _cv, _oct, _base, _coeff, _tune, _biqufm; - - /* leaky integrators */ - Integrator int1; - Integrator int2; - Integrator int3; - - BLITOscillator(); - ~BLITOscillator(); - - /** - * @brief Proccess next sample for output - */ - void proccess(); - - - /** - * @brief ReCompute states on change - */ - void invalidate(); - - - /** - * @brief Reset oscillator - */ - void reset(); - - - void updatePitch(float cv, float fm, float tune, float oct); - - /* common getter and setter */ - float getFrequency() const; - void setFrequency(float freq); - float getPulseWidth() const; - void setPulseWidth(float pw); - - float getRampWave() const; - float getSawWave() const; - float getPulseWave() const; - float getSawTriWave() const; - float getTriangleWave() const; - float getSaturate() const; - void setShape(float saturate); - }; - -} \ No newline at end of file diff --git a/plugins/community/repos/Template_shared/Template_shared.dll b/plugins/community/repos/Template_shared/Template_shared.dll index d498a11963dae6121dd18a4e29b277019f0b26c8..79aafafa2c62e13279682dcfa758d458f917f325 100644 GIT binary patch delta 123 zcmZp86W8!2Zi50N)3m$IN{sDFj3CSe#LPg<0>rF9%m&2lK+FNeoIuP4#N0s41H`;Q w%m>8$+m#pvm=*!eX;)h;uw8AjU|%hWvrRz=h=qYz1c*g}SZw>0aySG893Q=%B1r%M diff --git a/plugins/community/repos/dBiz/dBiz.dll b/plugins/community/repos/dBiz/dBiz.dll index 68c7d4f7168d4c88a9719aa4efb6041bd653cea6..d9e878dba3875f573a7d0782d5dabfa57eeaa83b 100644 GIT binary patch delta 139 zcmWm6u@QnW06@_TA|isQKn!sQR?68@r1DaFxuakMDu%GjG!DQDRD6n8{O0@F`q}=J zh~ED}i&2YRgacw6k>G?BXJoh_M}aF!+;GPuXi=>no}+YCkgonNdrYQ*#1jfFbePPm F?>0}GCRP9d delta 139 zcmWm6JrYAe06^hc#9xH?Te9xpN_vILY?;}ia08V?q}wy)3MxxA2Ydtw5h2DC30_E%;f)-HRiZp+o}1LAmAd-=@7RYL5)E2>pzJ<$V}Ah{ CdnJSb diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index 8efe845f..f87953b9 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -1097,6 +1097,7 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, case VSTPluginWrapper::IDLE_DETECT_NONE: // should not be reachable wrapper->b_idle = false; + wrapper->idle_output_framecount = 0u; break; case VSTPluginWrapper::IDLE_DETECT_MIDI: @@ -1313,6 +1314,10 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, Dprintf_idle("xxx vstrack_plugin: now idle\n"); } } + else + { + wrapper->idle_output_framecount = 0u; + } } } // if !wrapper->b_idle @@ -1644,10 +1649,6 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, Dprintf("vstrack_plugin:effProcessEvents: ev[%u].detune = %d\n", evIdx, mev->detune); // -64..63 Dprintf("vstrack_plugin:effProcessEvents: ev[%u].noteOffVelocity = %d\n", evIdx, mev->noteOffVelocity); // 0..127 #endif // DEBUG_PRINT_EVENTS - vst2_process_midi_input_event(mev->midiData[0], - mev->midiData[1], - mev->midiData[2] - ); if((VSTPluginWrapper::IDLE_DETECT_MIDI == wrapper->idle_detect_mode) && wrapper->b_idle) { @@ -1661,6 +1662,11 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, } } + vst2_process_midi_input_event(mev->midiData[0], + mev->midiData[1], + mev->midiData[2] + ); + } break; @@ -1917,7 +1923,7 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, b_idle = false; idle_input_level_threshold = 0.00018f;//0.00007f; idle_output_level_threshold = 0.00018f;//0.00003f; - idle_output_sec_threshold = 50.0f / 1000.0f; // idle after 50ms of silence + idle_output_sec_threshold = 120.0f / 1000.0f; // idle after 120ms of silence idle_output_framecount = 0u; last_program_chunk_str = NULL; diff --git a/vst2_bin/CHANGELOG_VST.txt b/vst2_bin/CHANGELOG_VST.txt index 07439b86..ee86c060 100644 --- a/vst2_bin/CHANGELOG_VST.txt +++ b/vst2_bin/CHANGELOG_VST.txt @@ -6,6 +6,7 @@ - "Wake on MIDI Note-On" (1): Detect idle output, wake up when MIDI note-on is received - "Wake on Audio Input" (2): Detect idle output, wake up when audio input level exceeds silence threshold - idle mode is also (re-)stored per patch +- update module LindenbergResearch.Westcoast (preview) ** August 18th, 2018 diff --git a/vst2_bin/log.txt b/vst2_bin/log.txt index 51f9b58e..0bc5f730 100644 --- a/vst2_bin/log.txt +++ b/vst2_bin/log.txt @@ -24,14 +24,14 @@ [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin Gratrix 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin HetrickCV 0.6.1 [0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin huaba 0.6.1 -[0.004 info src/plugin.cpp:686] vcvrack: Loaded static plugin ImpromptuModular 0.6.1 +[0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin ImpromptuModular 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin JE 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin JW-Modules 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin LOGinstruments 0.6.1 [0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin ML_modules 0.6.1 -[0.005 info src/plugin.cpp:686] vcvrack: Loaded static plugin moDllz 0.6.1 +[0.006 info src/plugin.cpp:686] vcvrack: Loaded static plugin moDllz 0.6.1 [0.006 info src/plugin.cpp:686] vcvrack: Loaded static plugin modular80 0.6.1 [0.006 info src/plugin.cpp:686] vcvrack: Loaded static plugin mscHack 0.6.1 [0.006 info src/plugin.cpp:686] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 @@ -51,14 +51,14 @@ [0.008 info src/plugin.cpp:686] vcvrack: Loaded static plugin Template 0.6.1 [0.008 info src/plugin.cpp:686] vcvrack: Loaded static plugin TheXOR 0.6.1 [0.008 info src/plugin.cpp:686] vcvrack: Loaded static plugin trowaSoft 0.6.1 -[0.009 info src/plugin.cpp:686] vcvrack: Loaded static plugin unless_modules 0.6.1 +[0.008 info src/plugin.cpp:686] vcvrack: Loaded static plugin unless_modules 0.6.1 [0.009 info src/plugin.cpp:686] vcvrack: Loaded static plugin Valley 0.6.1 [0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/21kHz/plugin.dll does not exist [0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist [0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/alto777_LFSR/plugin.dll does not exist [0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist -[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Autodafe/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist +[0.009 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Autodafe/plugin.dll does not exist [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist @@ -66,17 +66,17 @@ [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/CastleRocktronics/plugin.dll does not exist [0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist -[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/computerscare/plugin.dll does not exist -[0.012 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll -[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist +[0.010 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/computerscare/plugin.dll does not exist +[0.011 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll +[0.011 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrankBussFormula/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist [0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist -[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist +[0.012 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ImpromptuModular/plugin.dll does not exist [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JE/plugin.dll does not exist @@ -84,7 +84,7 @@ [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist [0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist -[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist +[0.013 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist @@ -92,8 +92,8 @@ [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Nohmad/plugin.dll does not exist [0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist -[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/PG-Instruments/plugin.dll does not exist -[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist +[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/PG-Instruments/plugin.dll does not exist +[0.014 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist @@ -101,48 +101,50 @@ [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist [0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist -[0.016 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SynthKit/plugin.dll does not exist -[0.016 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist -[0.017 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll -[0.017 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/TheXOR/plugin.dll does not exist -[0.017 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist +[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SynthKit/plugin.dll does not exist +[0.015 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist +[0.016 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll +[0.016 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/TheXOR/plugin.dll does not exist +[0.016 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist [0.017 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist [0.017 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist [0.017 info src/settings.cpp:339] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.032 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf -[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg -[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg -[0.034 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg -[0.035 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/idle_mode_icon_cc.svg -[0.035 info src/settings.cpp:339] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json -[0.038 info src/app/RackWidget.cpp:207] Loading patch from string -[0.039 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg -[0.039 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg -[0.040 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg -[0.040 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf -[0.041 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg -[0.043 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg -[0.044 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg -[0.044 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg -[0.044 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg -[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg -[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg -[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg -[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg -[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg -[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg -[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg -[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg -[0.049 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg -[0.050 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg -[3.460 info src/app/RackWidget.cpp:169] Saving patch to string +[0.031 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf +[0.031 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg +[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg +[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg +[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg +[0.032 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg +[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg +[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg +[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg +[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg +[0.033 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/idle_mode_icon_cc.svg +[0.034 info src/settings.cpp:339] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json +[0.035 info src/app/RackWidget.cpp:207] Loading patch from string +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg +[0.037 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg +[0.038 info src/window.cpp:599] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf +[0.039 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg +[0.041 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/XCO.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg +[0.042 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg +[0.043 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg +[0.043 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg +[0.043 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg +[0.043 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Bogaudio/res/port.svg +[0.044 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg +[0.045 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg +[0.046 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCF.svg +[0.046 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg +[0.047 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/ADSR.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-hexscrew.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePot.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg +[0.048 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/AS/res/as-PJ301M.svg +[0.051 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Southpole/res/Piste.svg +[0.051 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Southpole/res/sp-Port20.svg +[0.051 info src/window.cpp:654] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Southpole/res/sp-knobBlack.svg diff --git a/vst2_bin/plugins/LindenbergResearch/README.md b/vst2_bin/plugins/LindenbergResearch/README.md index 691f5996..45445b2f 100644 --- a/vst2_bin/plugins/LindenbergResearch/README.md +++ b/vst2_bin/plugins/LindenbergResearch/README.md @@ -3,26 +3,33 @@ LRT Rack modules is a collection of modules made for [VCV Rack](https://vcvrack. Copyright (C) 2017-2018 by Lindenberg Research / Patrick Lindenberg -![SCREENSHOT](doc/LRTRackModules_0.6.0.png) +![SCREENSHOT](doc/LRTRackModules_0.6.1.png) ## 1. Installation -You can find the latest release here: https://github.com/lindenbergresearch/LRTRack/releases -Just download fpr you architecture and unzip in your _**Rack**_ folder located in your documents. +You can obtain the latest release via the VCV Rack package manager, or download and install it manually: + +https://github.com/lindenbergresearch/LRTRack/releases + + +Just download for you architecture and unzip in your _**Rack**_ folder located in your documents. ## 2. Build from source _**NOTE:**_ +You have to install a C++ environment including a compiler and other commandline tools. +For further information about this, check the documentation found here: [VCV Rack GIT](https://github.com/VCVRack/Rack) + + The current master has been migrated to 0.6.0dev! So you have to install the correct version of Rack in order to get it running. I suggest to fetch a clean 0.6.xx version of Rack via git and build all from scratch. -You can build build the latest release from source, to do so use the following steps: -Note that you have to install a C++ environment with a compiler and other needed tools. -For further information about this, check the documentation found here of: [VCV Rack GIT](https://github.com/VCVRack/Rack) +You can build the latest release from source, to do so use the following steps: + Clone git to local machine (into Rack/plugins): diff --git a/vst2_bin/plugins/LindenbergResearch/res/AlternateBigKnob.svg b/vst2_bin/plugins/LindenbergResearch/res/AlternateBigKnob.svg index 43ca9106..6220bcf2 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/AlternateBigKnob.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/AlternateBigKnob.svg @@ -7,14 +7,11 @@ - - + + - - - - - + + diff --git a/vst2_bin/plugins/LindenbergResearch/res/AlternateMiddleKnob.svg b/vst2_bin/plugins/LindenbergResearch/res/AlternateMiddleKnob.svg index 333cb5fe..d7611d51 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/AlternateMiddleKnob.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/AlternateMiddleKnob.svg @@ -1,15 +1,15 @@ - + - - + + - - + + diff --git a/vst2_bin/plugins/LindenbergResearch/res/AlternateSmallKnob.svg b/vst2_bin/plugins/LindenbergResearch/res/AlternateSmallKnob.svg index cfbc2e28..3413815e 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/AlternateSmallKnob.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/AlternateSmallKnob.svg @@ -2,14 +2,14 @@ - - + + - - + + - - + + diff --git a/vst2_bin/plugins/LindenbergResearch/res/IOPortC.svg b/vst2_bin/plugins/LindenbergResearch/res/IOPortC.svg index 0393045b..1b50a505 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/IOPortC.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/IOPortC.svg @@ -3,16 +3,16 @@ - - + + - - + + - - + + - + diff --git a/vst2_bin/plugins/LindenbergResearch/res/MiddleIncremental.svg b/vst2_bin/plugins/LindenbergResearch/res/MiddleIncremental.svg index 333cb5fe..0458e765 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/MiddleIncremental.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/MiddleIncremental.svg @@ -1,15 +1,15 @@ - + - - - - - + + + + + - - + + diff --git a/vst2_bin/plugins/LindenbergResearch/res/ScrewLight.svg b/vst2_bin/plugins/LindenbergResearch/res/ScrewLight.svg index c2442435..75b2658c 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/ScrewLight.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/ScrewLight.svg @@ -1,17 +1,19 @@ - + - - - + + - + + + + - + diff --git a/vst2_bin/plugins/LindenbergResearch/res/Westcoast.svg b/vst2_bin/plugins/LindenbergResearch/res/Westcoast.svg index d4d540fd..595e39fe 100644 --- a/vst2_bin/plugins/LindenbergResearch/res/Westcoast.svg +++ b/vst2_bin/plugins/LindenbergResearch/res/Westcoast.svg @@ -2,244 +2,228 @@ - + - - - - - - - - - - - + + + + + + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + + + + + - + - - + + - + - + - + - + - + + + + - + - - - - - - - + + + + + + + + + + + + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + @@ -249,37 +233,32 @@ - + - + + + + + + + + + + + + - + - - - - + - - - - - - - - - - - - - - + @@ -290,15 +269,15 @@ - - - + + + - - - + + + - + @@ -318,38 +297,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vst2_bin/plugins/LindenbergResearch/res/WestcoastAged.svg b/vst2_bin/plugins/LindenbergResearch/res/WestcoastAged.svg new file mode 100644 index 00000000..046a403e --- /dev/null +++ b/vst2_bin/plugins/LindenbergResearch/res/WestcoastAged.svg @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vst2_bin/plugins/Template_shared/plugin.dll b/vst2_bin/plugins/Template_shared/plugin.dll index d498a11963dae6121dd18a4e29b277019f0b26c8..79aafafa2c62e13279682dcfa758d458f917f325 100644 GIT binary patch delta 123 zcmZp86W8!2Zi50N)3m$IN{sDFj3CSe#LPg<0>rF9%m&2lK+FNeoIuP4#N0s41H`;Q w%m>8$+m#pvm=*!eX;)h;uw8AjU|%hWvrRz=h=qYz1c*g}SZw>0aySG893Q=%B1r%M diff --git a/vst2_bin/plugins/dBiz/plugin.dll b/vst2_bin/plugins/dBiz/plugin.dll index 68c7d4f7168d4c88a9719aa4efb6041bd653cea6..d9e878dba3875f573a7d0782d5dabfa57eeaa83b 100644 GIT binary patch delta 139 zcmWm6u@QnW06@_TA|isQKn!sQR?68@r1DaFxuakMDu%GjG!DQDRD6n8{O0@F`q}=J zh~ED}i&2YRgacw6k>G?BXJoh_M}aF!+;GPuXi=>no}+YCkgonNdrYQ*#1jfFbePPm F?>0}GCRP9d delta 139 zcmWm6JrYAe06^hc#9xH?Te9xpN_vILY?;}ia08V?q}wy)3MxxA2Ydtw5h2DC30_E%;f)-HRiZp+o}1LAmAd-=@7RYL5)E2>pzJ<$V}Ah{ CdnJSb diff --git a/vst2_bin/settings.json b/vst2_bin/settings.json index b096612b..d4441c1e 100644 --- a/vst2_bin/settings.json +++ b/vst2_bin/settings.json @@ -29,6 +29,10 @@ "lastPath": "", "moduleBrowser": { "favorites": [ + { + "plugin": "21kHz", + "model": "kHzD_Inf" + }, { "plugin": "Template_shared", "model": "MyModule" @@ -89,6 +93,10 @@ "plugin": "Bogaudio", "model": "Bogaudio-Switch" }, + { + "plugin": "Bogaudio", + "model": "Bogaudio-XFade" + }, { "plugin": "HetrickCV", "model": "Exponent" @@ -102,8 +110,12 @@ "model": "MPEToCV" }, { - "plugin": "FrozenWasteland", - "model": "TheOneRingModulator" + "plugin": "FrankBussFormula", + "model": "FrankBussFormula" + }, + { + "plugin": "JE", + "model": "RingModulator" }, { "plugin": "Fundamental", @@ -111,7 +123,11 @@ }, { "plugin": "Fundamental", - "model": "VCO-1" + "model": "VCO" + }, + { + "plugin": "Fundamental", + "model": "VCO2" }, { "plugin": "Fundamental", @@ -123,7 +139,7 @@ }, { "plugin": "Fundamental", - "model": "VCA-2" + "model": "VCA" }, { "plugin": "Fundamental", @@ -149,6 +165,10 @@ "plugin": "LindenbergResearch", "model": "MS20 VCF" }, + { + "plugin": "LindenbergResearch", + "model": "Westcoast VCS" + }, { "plugin": "ML_modules", "model": "VoltMeter" @@ -161,6 +181,10 @@ "plugin": "RJModules", "model": "Noise" }, + { + "plugin": "Southpole", + "model": "Abr" + }, { "plugin": "Valley", "model": "Dexter"

    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 - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.afdesign deleted file mode 100644 index 1403b5c0fb9ea8ffea76dc0a21731b4926492539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50394 zcmYhC1yEaU+pUYcLvStb?otR8r=_^NyA?0)R$Pk~x8UyX?gfgwyZ@o@H)jqr8L~6k zd$OP0x#e2x`S2zyiumEf2U{n{uOFptO@|V|2jD-B#Q*-g|L^#}qYoeQbP6=zpF{rd z@zv4J84CRT<7W$NH;C;vgcKc#Iv8!2lx}1QBfP*tbjA^>-*DA7cXvGon|Yr>A?dm35Zd_3lKtq|VGn zHv{KbTTL;!Q71#IVFmyb6OFdN0e5>U~g< zqS398<(wkQr#r2xKd&b1I6518%}Ja%7o}DJCLL{Y8uQ!UT$~Ys9Toy&)(em$dF34g z7qi8hEaEo(jZ5O=qjO1fL5A#{@?65VptQqfWgQ!N9T$ErdgTS>m$ym1`#6ReUS1ya zESo@F7_EnAb*hfM%!B3uaW=DBUpy6Q4JV0&dbiz$i3OI`SJ;1Za8F#>|g(sNss z`=wFktf9Ciq0-LU223MONMhD<^UYfniAkkCS%&t>YCk+z_39OGIdAD$Vb*&}v#4K_ z4=PZ!Q>Qr$dwY9xV>GNk7~2*(48@U1EuJ15(QJk=lzaUMW!;^_fO^;mH5qU_@pjU2 zRKUgDdU{Qo)$VrlcER{ruVGB&xHI3!M?E?&m!OB8J8*KX_-SY*~U+s&3lSw5Lf>c>pDyQvBM&d)K zl^Wdc<91wmBu$imiq|@Z3Mv=7!{lAt*5JxNUY(_nUDAntLBbS#9alqbdgwx5s?dj2 zNx3_2^L(ya8eOSqcx|q8H}F1dxx8v6yYI7uK{!p(xQlAFWV5FaWHO%t?Q`XS5)Ext zW7MG|m|r?J+EV3E`YDsBXl1gNr53;b1#i~nT=eqlhMS|rGkvzM(C-Fw*+Dg(kB;T+ z5en4qo7r46R@M`5_krOK1w~~0A)1iD9jcdHih1MpeX_DprD1OzXIKufA4F_x+*8rFAErz7!i-W5AJty zrn}4iUlfjEkM8V-kX-7Q?3&TbO!8v%y!U#~+W-M|DMIs>1lv~=0z_qn(Q6ka2P+NB zfFJl}`O~1P%7(?|7znH5yt~%9hffh*W*x6?pnhq|Rr`oYz_UBQx`2!d?wdBc`-VIV z?2)6Kzm=Ap$KUjhA6t$fg@LERR`sYK?GR-u5gj*|$v>72sXsIp(sEFR1?oLK))z%0 z-me;ks!I3P*e+YpKuJFex{G%OovB^3$5qa*)VltUNg-UT>7ySk|xj6 zE&=0m(SpPd(H2W5ZO3a&(tZiGALTv8@(nl33D(2tGE3{r(>T_c=@^Mmf<~0^c4T6z zCyVJCiT<4O$OI}=|6o9jH`K>N*-MD5j8((W-YUVfGcX4|x{+Cx!^izjBt5)DQ5Rks z5eGVCVjH5MiiC}tziR-FFVtP-cm9du3A%nwHLY{iwlEA~<}RULofZ@IX|>3koAO0R zx{*D^#+inrx@hw>Y(KuoUNA!LlxN{=w>?Tk))g#|w*3UE1@vj8T5%ZVANagrsCNWh zXH1)Bd6B4-3e(23uABC6xSRR8RCxK%!Nh)WyW8q=99;Pcodq{S{tP%#)cI`eAKK%} zo7}W35hhN`t@F&A2ZF_)PT8> zk~%~pu7i>BqCBP)hs_Eer?=^vj1i?h>7-K0I_rl0V!!1ekf!%kQWM>7Dn~zzj14PZ zmKPHFH^-GGs^*NJ0w`(z#4A~%|7ug$qMJ3AJy7;$R+E}DX75vGR-)qf^ltj9LWg~1 z=|q)3AS3S~&R`>u69in$I75E5KRj&7?#3uCeZ!K``j8*ha{Q)()g!F(ea>@`G;ina z(#b9apMm0XA9FsLGMACkWZsa84I#Y-tSHMY8AvmyVxx(GJ~B>^Go6rS~> zZ%nkXAF1_e9&fKt!p_$*_I+CLdtUQ+#Vw?EnS?EQFfb`G%Hu+(J;fr-EqUzndT#qW z6(}^RFeWSmO30M@Ylt>AP%qAK+AOYhQM)K}HwL02_n(GXSS45YNsKY1%|^K99?BSr z>*iD(H@}V+9L_WyDi?fXOlHWJk+;#&JkZ&3|LBSFfUU_JC}GTV9^!pp<0z_Ddog=Nor~8-4 zlW1YsPcm@qvn7o12$Z|$$Y+*y1PiS*{Mx0k-UVb=2SzycaVXxu2j?isB7*~7@s3IhB(;=}?$-Sew|F_M0DF6496{C*lG znP~jbu1fFYE?JCpd4*I|iqvvDCNRb?)dbbmjIkm+XJOm(wT6H?P*A+8ndJSE%nzXc~mZFIRb7pdf(3NMKWc!dZG2mzA&o%b%^@t}r#E z{1yV7W~i-|3csguxm_}Xsuz`SUDFg7D-0vBXN|TTA|)ZYaMz!{#n86#%qOSsAZ^Al zgMN6m9Pj;Dv6#MWB7mFhCe;@gnzC?o>*y;wa!-lWO>zjW9`K)wI+WBq7)tSS8-|*3Wy6*rM(@1m)vS@&oFQ9!5o!qIsdX(;-oNp-UK)j~U)p@t z+A~;oG4f5ww7I;c3+sx?dKjFHge3W~R4eYfx=rr_m=E}mk9fL3u^Wx%-%7oxozJ52 zxDC4w%k2(1Q9$JKz51nHlNnPMYp=1&nrHx$EByd3?BlYPPRGHfML!bQBp~y^03RHq z*NNv2AL7$~mY)Qcd;}R5+jFM}(f1OCVq(%e2aq{S`hrEj*qs{$<3Yr!4QldTT)W~? zXSX_`lXYPe0c2o2JmHd7`;rB-B!@1XY{B?wbA%8k?fj1xNn^#3ovR6U>#sc{`dy>; zYqHZ5c!$#@<>px)@~|CJ%_2gf07F9WR%E8g7mG`P;i~^nkA@k%+RZ|9@~n?N!Tccg ziiCbfURCiOHV{%KViK^Zh7p{1kJ+jQ=}t0R0qa&QApHWjN0j0SZbFcGls1h`Fxj;J z(8})$9Eav46E^N2of9AJ!s|!O5oVLgUyU^#YFjByu7wRv7jOC(@sQ?8LvosTC=&?B zY;|%SG>xyw4pl4Kzm=4il*=Q~%FD37bEC6E-(!mBk1M*&bp zSG#o`)#u8E6gOah+uBf`F<`p*JQ&qB6J9-7S7IOBpy%u0^AxH46c=Qm&ual8YYQ`c z+kS7z`~jf-1C4?OCVW+x<=PeXrf41d>x#Y=*Yq7_H+x+&*{x2VyAy6B0~is}Ve|3L zp;c2RfOBRhs3O?biAB6E0|XsDtm4|xM9_Uws4wcec;;&h6nHr)inv`1TBU|dy=GJw zG~jDo`QyhQ;14nv(D`E%E$(@XPH8{5gI+#E4kQvgs6}MV93-8!8TVZjgey}s_DgB` zWEtXeD}qF!H~Hut8{ZeF zP7l(85U&Pz=$BT=GB)&il}q`ZEh3@VTf9Zf9++X_{Yf`w~ipr$L4@M>* z8B8?s|f?G-Dn!NqXL2Tp=_6xQ{h<_TN<~%yCwddAH!%-Zq86rQ3ZQr+3BSy zG=GJ~c)FHF_BXq4DAgca^W;@PN5JV%j2!8gca)J4!+7rvb&Rnm8|mxOnq0Fj-gIz{ zkZ}A0|De=O@zqfc3a7uKtvrzG{W9s_bPEmkFvp4!<{2Te-96XM@R-gd%nl7Z(6t!# zf65=zzOE@k;zwS)#$X)d(x<}67n#7BO;!~BSMie0fZ#O$Ov@^LA5)EY_-L11)flsh zo}bfBOlR~_3|#k4__l~^MkP{KFNyMVmdCv1_z|}rzK>#G&j|Tsnk=6yLL*Rh@;}f{ zve?2PJ(aDjr<)+xe{Aq|5jG7!Npp^Qd#I&9n%)+Cy>c1_H zi{@@DhL#(q!k(BWMyD2ELI)U`>>Vx^%U8}SsVE&$GqD_2Nj!}E=D|{IX{^-_vLFbj z=O%gHsP#GtKzt)suF6w&;XXjPMMV>hvE8K4? zM+%zWM!r!qH@%h0Mm0Mc;`=JS!7bri zJ38J$UYyQMaI+a4iRPAJ@gTU0}r+%_XJE7IF(86s=xYgIAD4}ovo!YbhEp+dA-D1-cPuk6rauhjSA zd0zZ2xxA#ZoI$zp(uMD0rkr_q`?^Cod05%ZG1XC6i+RT?aa@W+@>aQ63@LU3LKV^cM;Xf&?31oK4R5NPr0vq4?OZNsXZ$6Rzt$dJi3;x3ULny#`QDC0#a{n` zC4;^cC@;Mv%97aklUxobRpmZR$Qm7nQ7xTmZdNtoR7H)cR7T#rt&H9UGbn}GjDAU5 z@n^<#{5H5nDv|sA{&5R@MKY8m{4-vo3c`>1U-Oly{*>OUP_=VB-0M=kz%-OJvio~! zLpXK#Rs@sY{abeF5jy$&dR-!8ORL`RU&oWTkEwqt;5g1L$*?KuF`6AE^kacnV<;~O zm_lD|LcCV|O&q-HrQs<_@0ZtB=>~t^rl1d4TW?Rw7cudYFL_G&1qqcCv)iTLf)2G+ zwMW=fm30fG>2=~ql4=g*_?0SRXI$JfKg(@|qR^LSzh8F-yvi#15IE6;#og-NV^gi4 zpUuQu@+Uqag`6*$`HN&^5%+h;J}kWAelCVz~hR-iAr?%)W+Hd-LPA_j6)X$TIAPc%sk=aqxi8YSF{uj69g&8;gmG zI{!VS@;AI0?TCasbU3B5WI}Dv60!OhrcD)f6i!uK1#bGU3_%sjRoMbsVUhC7-?2>S zE0f*i@V(#9LzKwAgXf7R)K@G>Hs4P~+QSAv!V-G;S(o{dGX#4EMH1rNe=h(N3Y7d3 z90D|9-bVxWv{Q(n0zB{x0V5e(`P?`(8LMGj)@!`nuh@Rx$Fx2^WFY6B- zP7=1ly~3S^qKfnf<<6Qre#8IL2J{!s!CAh>9kF6;&;JJg`FVJ3mq?uX2O4AXLHYQ& zDex`eEC2?ss0CJR8&01*;VC+RvKxCmKH0C2T{hk3_f<^SX6&267%a~7d7=K4(E-v} zuyD%H^LZC9iJB-dLuG8QA+ztHdqq=6&FR=X>oSx(tv2o9cn;|@R6gD`RYDq=8tCGO ztjKaoNBPo`1rgB>?Og_^R&Cp+`ALMOXJ35pASi%GauT4GL)@1Cj7sb(3kMo--vqU zyoHTzeiVWJ+OdnakAJ^^)$)_DgA={=UFbCj5nZP6>Jim*^m}1mlpXy=AGzuKFYF>2 z+jEA*r8?E8@N#Xg&5@-+{W(FTMhKf4G5U>Om}f3TM4msUjEOz#;Ywk2hZlzAL_53Y z_ff`Ev$#_siE?b$uIT zeVci^uSll8j}D;c+svMif}>%dwVGFz+VDZx`M=50lq5jOwAVxU->5kvErQedZ)S9J z$0Lswbe0;u2|e{OEihFcIVF#>0f|ApK+9udhGilu$r%zeBAA z!-NznFHKGwjR6G?DZ`^Db~3h$H+TSWwbGJ3V>rgY@6%-#4?e$ya3DZ6oBD;_Sm=W) zM1>d+4}LgwXhA2roWq6I><;>1jgl>l6$3By8Z8up?M5j$9J+4|bQ-dmEj`tEmS$ym z{BMv|lOxiRd-Ci)M4UW)zSs3PuY)w)T%-ol&?QWvbxG<4?>C_%bbN@ACi;!W0vtzu zFSK#Td-=wTY2m^g;~_zT-@)LitWh%1aR8_ zFY8#w{T>KIFXin+FP~??sv_|>Vpc8={Wk*H83c+mIfvTi00kq$C>p(5?%s2exCMXs z*{Uf;Z*%m(f9DuG+gqXYXCRHdGXoQEW0P9((6MnWpm8I)-WTMHGV>?&Dk4nj+3gQ5 zD6TlD6pE!*S95)GI;yQa40D^JsztJM3&tf%eO@XR+A8rA$<=c*J$tssvdX__iNeKC zpnQ0#4y~0NA*5&RBT(Qkr}pQxp(bQxt!=`MlYgNl0^x1Nw1hY)SP5JSUDQ{9x*nh2E6Kssfc;tG3G zmBWm363oBat}m*{{~ap^dj9U^mRqmCpr5~T%pPg*&ak>{YsK1A9hZmfigFb_vw`Oj zoI<#PW7kSW5tvPQ)Kn_~@4>Ih#RjSJorbB>28XO^q{P$yW2af!dHj@cX7?*OJk5Kc zJ&Q;emlHIl-Y=cYL^;wNE2Fymg-D%_HklE=!~{ftJefYZp^RZWUnaZS0Z-N;kz(by zPR%(63}(DxRT0I#Gr3BH#31XCn(L-MZUCOnzxOnBI^~}29OW8-lMPng04&m<`O_7m zW8WAL*OrU3zFynAy7ZN*sTKg!GyW|CT5Y-xhCP&x;NR2DF3@P@6rmjXP005iXjyfw z8*2DAjBN^NHbM9#Al~>nGE1X7-G`ScrmGX^+ zJDqY69yS86du-t~!vk6BLAj;N)$;*WkTs0fs*u0=*GK1JCv(^nWj1jJuZB_>QF!r8 zZa@mVDpL1gd10p`JcnYrs1B;Z-)QSHN=t-Q`ZA8MFb#^eQ$%yN=4Q=U#5d^H6nfS? zkz#&rYx2`QuPZ@vY?c;-z}>d#5SRz(iVz! zTXkh_aRcU-i6BVmbZSDlhA%C39S(#$!L%HIV=&mZnk;-%BkL}!YoL1yux_B>P5_gks zGq_ib1gGrbw_GyCbx=3L`jPYvGBc@DU(DOIXhMm(*HJJqaQzIKtC5yRm94+8!$s7| z_IKBXHu|H`t3#zvMcKdx|0LuRr-C`M>%Q~1>D@K(Y#uw84VR#jTLrmz20|b1g^Ctm zO5wqLls3W}l^`7PQeSyoE|*X^oTd+JJeV{E^n^BXdsMm#ZYB}N1o~-Kx##$Aw}#F# z(Xjm*b*vdHhYBdtIuI*pu28O!$C)+#U+a%x_Ay+h>x*Mgf>g3QXt^f3~)hRQ?R}AKDY-al>;O z16Li@QQoNqgPlD+G9Vr~Z%dE;`X#-3tsK z?I|atEMFwq$lidgEeb*ZBq3@}V3O_}eHiTtdYruicGbU5j3A6wF98|vojEG9#+gtg zS;Z7l8Q_PQ_s!r+Pj`1Nb!;*K?b06R6c{!{#E_o8K93j_gvw8a&=|c4mCXE&QFFk| z;ql*eF8V#$Mc=@n8vZ64*h0CN)Aur?-xiqvnLUuTnc%S5)XTYGrou!peUYSOb>3hi zB8`}Ko*BXN9ww*a$ZAqtIwnB87EaM`ukhY3CeX~d&|TcZy|meGkk@#nxYLO2Ilrdo zJmHfi8umn6IB~E+V(xTEv!qSPh9N}a+AfW>^eJyf><~BQ*HC!fIl%pmzamGlrS_vN}Gkl1F-P+&5bQCXT zbm~a`9SH|o)e6#x9TN}(Ta6=z7tyWhwnnKphDm_AiK|@QI4(VZP=1Q4-pb@KMz1@f zeX4H{bhd}NfW~c@SJu&SQK_#_VNN{iZM*rv2>j?_k`)3#H89CSd$q4PM*6xD+)(|| z&AoP0_h{hP)Z+XRxr|bXPac@-fXCbNOi~uCDvBDX-hYMbARcsVH;cm|PxH=_%@nH& zESCRc;1;Jo^WXdAW~9ZVPe2gi$zkfT5Pbht$P1>(pPhA+VD%AvD|W`;|1~nkFyhUD zJS~O=2b2_db(ACGjQD_@|93H-9~8a2Ivz{fx zRDp!FthrGMQsz&N_4RvP_M%T#P%Av_)BaVdJg1yoVq97KHI1v9>W~6FzhT~d0{7&( zB!P%L%3(4#mLVFkwX>=n;p90BV|DFvDF;Hqfe742q0_Du0bi{eii2_z=Of?II|4`U zUB8AiWGFcpl&7MzI>>U<@SMDJuA8{2wI)8A@@M(w5rZ6bp`?hY*n2>%Axo5oh87H@@XR*yXDQuaD5<@yBgE8;U z&!0K3ujXAb5T8~HW_)Xlllq-U?Gt-^EJ|tV!k5f4FWnp}*UrdY=%rIG-V<>{7ayBm za>!8Er>#0ILBuFex`gS%rpXH()(ri;kx&$p-Hq}k*N}x(vuj~LuEF!T>4P^lSV{fE z;(Gh}eOlUvrBK&z_CP^qT?mhovN#Qb*(h_z6;KVCgo_uBN8RA-qdktcaIrkAqapi4 zeD#`!-!`A6Du~eI84=zVoCJH^!WFYw-8Nrc3wJxqyQJ}aplb#9lelf$IN*4|$ge&p%Y#zTSL*=7!J^a2^tP7~IjhS-%qFG@-`1#>^}N?`g2al( zZ+7lDi`a8?p=x1|oVuJM{Z8FSs{Z_mHP?I5rX6l2a*-&Z9dYkdrK~9*9_hYC6Jbnn z^GTba<1Fn^hy~37H&5;M=ko8kHlguG9=-AfeqMUSidLK6CLpYkh%jtcj3xxeVN0Qc z>YQ>cj>pOw3dyijRG&xuh{Txe{9BnT8&UDdJ@dNM!qj- zpEWw|g+SI2Upr%4=x(I>0?@N+d^}#Xn)%wJkn4l2?^U^kM6FbRPKEcIy{%qt0_F(V z82ROdOKo!{6AiF#=uvr6C3~)GvF-P3$x0G3#(BwTtj!e13#$_12zHT8%X3T}*(lS1 z&zNL9`W4BAFVF}IH7bo{w7aCswZ}r|oF`>Y(_^fScYZt72oocO$g63=BbR+sGyYR; zU5RvR{!d!x!fiPWV@Y@zzHl5_cIp(e3L(uglg)O}p514pte!=;rU7ll9N+jZ-`mZ- zZuVR?sd?VWsR7TjiQ5}}9kh4WW4?t z!=X+hW|h!W;hZn!$J?yYXM^@?=JC`$&rw_Sd;ic0k<6Nk0WX+pQ3W{VPR@(UyA%Zb z(w}pp+BQuwr)=5~Apb?d>1s_yN25f9xKfqhVSI`^1#McE86Z+|tkQU8@q=$JY${Y5 zQ9DGeI`PAE3B$#X1Ioy%vRvX{I2`+6h=Pz0z^>;k_Kj)lm=~q~A zn}n_*k8x$x%chYrv}l3qll2PA~J@WQ%1aZ{lw&#ZIaP6aGJ-JY>k{# zS2&3{`BvQ1`}6Bj1i8%BF?|ZL5mhYfExqn%Bf95l2=8FNNV=W4(8fuc_k_*0u{Qs| z>~9&|JRu%BhXWSaj}pVw+k^fiqB1lc#nnp-M(dn$YD2jdE7}}zv1$j)hE4S{;ws*- z^^MjlQTKmjAXhGmqwa}Sf5Ja(L_kHhgNQTd6Vdj$8(B1|3$J*En}=W7rFnSX9rn<7z9hFPM3IKkG}19C3C0Y+ovx`8erAmXU^Pa z^~t{uRhUr3ma|sH2e!U?(^yB)XE>`60^ZBg_z`&i31u@d<%OcP{ndh(eNF9pg9<9l)kO6-K61g`M|z*yc?XAvJ>%qOu} z-v-7GK@_hz7OZ9+fvy;~+Q5y1ff0x3ZqPq75=Dc)(Snd_|Ce4F3QU<)Myx7cIKr?0 ztQg(dPpTMaF7Sd>{hXQtnGmH(cVnCc9$~{RaN!LDwln70;<~H|jQzrJQQXe4-n^(Q zl^xvbl?xu%uvu5m0UJwoWO4I&EY6YvH-#{mW&S#!F5M=TBEesHHnMa@%z+|)pZN%{ zVMH&+1Vy^gS>`|YN3tRY<`8X2Z>}MNbdQ@Mef*%vBzXlsiX#4kTTGzhhX$U&am9UF z{(E8ORme7-%reMWzn!Ce4hx;lK$A3IG=gK}KZK0*4_Z8$90$7k`36pZ*fKoWFX}dl zQP^vFgG5jOV{t8<%PZvM%+}plqP#(_eIM*i@N`-@)UhW8f&z>g)hBxky(!9$;){^x zJAO6TaB@C;Qn&E9FSSQJg9ohCaC@M{Y$fj8{L~8Sn*8+@ zz3B=G$PpaMhw)kDfxkk|jm-gh%Ce1pN2pZa(4g z@<7>!Dx&P!v0h0}EnZ&5(d8y6t;CrseTeo&qS(Ti!9p@O2sk+w1L?!-a+RmJ5js2e z#w9}lCMGyYD;7Um@MG!o!TnL?-o1g6GIeX_$KXIUi>@SjIEn{0>BN8`|{1LIRm$2iOoI zGh6wuYa*ek6w*$p8 z->kV+c)#Va$8fBz*jaLS1p7+>Xg1s8!V%L=szGY6!$xD=a7Y@0$DUst8UNM>F=jB5 z>dY86;*dq)Mv^QTGP{~^#++1GvMuB(RD*h$*JcgVjP2ZUG`^4tp1cBjPOyj7fk*L7 zw*++6`wF%7eV@IndE8oW8UQP%wmh^{>$Yq(K!|dn9q+cel*bZlu;kjeV79`0{xrDT z%8)W-_1dnEX~RKG%GT_|B>)E+A*Zz(R{-6q4O?X=1hLlg2Z0xnx7xnj8nO+Og7urw z#{4e(s^5LATF4s6bPvuEOLzm?)tgf0Br$)}ZN`agt73Xg|5lr(lZTXIQdLJr<+I|& z_p!%yTJqG2)gR_SeJWX+G(eH+G&amK=jMz$4w=&G;&Ce-I)$P3@8i_{!jtM+Rkf=S zhzf`ql0m#^gVVg{vYvaJG|mDB1ibjme=i$G6`QudNas#vh^>~sMe=hT)Pb*D0=WE& zt_c<4!8aYosF7|IaMPLwlK(MN0u^c7%~_j&U4myMz@X+{G1nuoaeH2%F7El8AgY9h zLduYC6IcxyAsXu{^^KkA60*u-CQXxq@@qywvYYtQYF8TIEyMSvMzPeL_=xpr(@#dF z)E(<3;MRORqC(Y)ssLx1h|JV^G)~p?BpENZSI!ULQ>@e-{mL3!z3in-6^Mn6B96LY zVp*Mqs6}hi9unYs3ev`pR#^%PqFWxf=ISV5fNy7yVq_EF#YOecvJ4vzEtP|e^~TR2 z%a`+Q#dWLR6&jf)0$Sls-uBsGw zHLu77Qb)@yGu%!}RbgmZz)q+gR_1lQYq zoV+Lgfc8M6*Q@j~Gj!vAZ%(_J7wMXuRKzQ>FTU5Fiqof}Rlm7q9|Q~gh{DLprLt+q z?5x<}y6l74A59zGt>-PH`w#xw7DZHhPN+IDv{#e)wZW{^rrAsqW+Za3ws>leeaE}n z>eLJjJ?SeqRU5^wf`#VhTT?6#?&nTjH3+ZA(mLtOGX%n)9lWZBhVF>Q;ZsN*Y^pj5 z0g4gyFNTsEmKo&fY>2v-t-!_+C3Q&Jy;LQM%o>pbz9_}kES*CS*vmXC6*dzG@MFde6YENt^%p0qqeZ?u?HzsQojxrtBYBU62AqBA#zo{VyuOT$7PxP5*ab%-kZ(R>DZ524I;2iMEC8aRz)xMWhvj#I6r@<}nwaumCG!AX=sOlCx8?zlo!;tG zxV2aP_ejNPUWhSC+jw%xCuY)IkPWxGJ67X5@0Ks59MdbP_#W$RH`87UkuV8jE5QSbmdfK!ek;!TLpC7 z=@bw4m|uV=!I+61@#0vh2-s-K(YK+~*q&nsB-}E}%T+Zt{R=mw&YCtg2EWZ?g4r=! z7c6tR;r>Xr(psTA!?rIJBV(eC*!viNjMG9n+1$_SByUF}?k1R=SQZK~IcLgke!g=& z32QIz|9&?9Jt2o2CEU*xFyGHj zh%#0qLV_n%LQyIc025^rG0%N;Gl0U*xpwy`1{lAAM19QPn2bZw*WcQVLFA~imkkBh zD4K=v>H024^015ZF%53+xlezTF)Dnv!C&MYjO~MHYx*7KPw@rd(;(a8jg-m3&hP2f zV&~M!{lz+_4Y#B3$4T&tl`Un?luf*4LlexTh{3FT%UIH=u(OG-?;&F1s4biDM?Qa0 zd2lr@2yJJ`4yc$~rMNpR>uos8lIQv{Ar`%8)d3(}u=*%y z^lVP;8t2-9S=jYMyp6i}!QOw&AyhxBiluHzZc6#dq?4ZN;k!a#D$`H>mnp&$L|fQt zMDm($X)YQGSVf%aL_?M0l6Lw;W*n-57Ro!okj=ncE=$58y^3R#r3!cH^~H2TY&pFb z3OK+^>>e?q9@fqU^Y~g)A18g8~@z| z+N%b!0(wJcG0!al^Q2YAfsy?X^6Q2pkT89M+B*-<<;0S*CNO(HQ_8JVh<;6s#C-sL z%-RvjFmzhk+4x!9&eEy-pMsRPKxib28HTDF*CF-&mJG8lqq4M;etxJtH^`b}ofF+q{=;L0;OS9Z2p=qpVRHTPI-vwNJ#28Zhs+<} zvb`pc$PM}nNnP+s974M*AwM62buO@v^ebVdTQx_&%)5m&`MR3JG6u1TV|@d|rfwg+ zI*j?L?(LDeC!EoXay<^>rzAlQYatF{Y41Rc9V+Mi*ECLikF@v-igjxwSHKr|qbxc_ z3%nRGW{YKYFh4#j(tkOlN>3=?S&33*6;a@?8nF+dG$Zm5qP*6&JZ0bOHj5QtJcTfl z!s|u{WAv&Xg!oNxpZ{)_%?#IqX%~9;I)Ob$@pd`>l$Z!wcXI|lM>sZQOFjYcE6zIJ znzmBIze}u~D6D7j9o8!`)72{I<0p2kC^wwSjYmWz9$k!)R+Of|a{kH;nBW_D@`DL} zAQP;W@qyv)_Hmh%^E<~oKJqy?=@vX>qa4j60e06ku{aORs@Yb&+srAEl?D07H7&VIwlbcZKepsGpf{{RQ>eXBqNjf5MR)~*DWMoz7TB&p)rMD6`Oi8jh3BY( zOFfwlG8t4sMgUfTzi&>F9YsF*^_Go>|ppKEbKM8;FNjRs~zd9VUIe}TNVj$^xv{MxqO%>S#Z z>g_VpUu1P;I*nzku}lfP$Neuq^eg!=F=O{iu(CyOr92=q969}6a542{;!vpdu>@Lw z3w&}`C|RK14wReGIqzL7TS$vOq5FXB9w+5zAqb6t4b*Nw!N`Be08+V;jzE}fsb|pL z-7K;~i&AokL=z1Qaqs)ORQXU2^`C6;RU*!d(fp|#NHbUx)5YXgn8waNaYOPJQkW3I zFW`x-QNuY#KB}jT)h8WBkjhT^ZZre>&gTk1gHCuTS|J#^(kF&?>V;dKALN5!eC%&s zv5DGd#Xcf%!)aZ$iRu(|u!j#?6xQbpv;zV?aGaIhQKL>-2UkAb-?gB~w{H%i7qN7$ zh%Wai)=(W9rbQ?U1^*C27Joz(4C4$V#G3!6;eEIv=$h~qXM`y*a?>DsGK9?4` zJjB>6YL3OPc2d+FI4na_3cvuo+)$5~V`eIhh(7^hxXp#Qp*j^a0kWcv6 zi`pb**wAdY?`z1H>t$o=vQmf~bALh9$`2MXs&eUM(o*A++GBX2(?X20g<4URY>dbQ zd2X~3cuZPql?TwkF+>(N!HEyqs?&{lNB9^q``@`OCiD%%PWOo%`c2Ke0ajm=te#|{8P^0 zZt)(A4Zg#zOS1kgA@LOQBik$u;B7VPnf)Z_^!u4lZ5wU8&<%3rh@MI(7}!gLb#)a( z61y$I8yDNu!-;FG@$hlTA2emABhsmuLCIpcPr97sGwiLx-wLf71OX-(WP zqgFD#X(|1UBb&BMGh=XXO*WVsqMg)$bDO#0I;;;bSCtc311bz#%EM>mg!_ecC|jKt z`1uJBvjEq#nq}Fw$hU_tIPh)&ysvB%JKOp{ABwogmYI$n<1SU$A_Xbf^x$MnV6~5I&XgIUK}m-T#E3GTKZk!+&S!0-u%j7y);;tYg(8(h zrA}pM*-NEFU5}>OR>hk-vD7%C_#0dL#CA=-ShLKZpUeqqpKp=d;F*ZJk=yW|H!^ZW zJ_Ql3A=foCyENUsj3VCD;!z|a_OId?ad3tOj?2aynq04hzG|ve@9}DkPQKSZhuDt} zfRD}!*P-=n0&L+T>ZJJnzHyt5W0j6hog9F2$ zjilWA@BEURH}Lh45hm^pr5g1@W7t~sLdj#r`MOCW*EcOZWijOTn(hUbY&wsz7KW|_cC+Boy(0waDvJKpQfq%oF zYChcoS0mvkoWE#$W^ZiZ&4pPndU;2%m+i5V&=eOx7DZP2Ut7H!7hNoHUo$1U6J{I6 z>Z?S)QOj*T^jZ_HU!bZ-BC5S`!*1))<>4m_6|DEadcn_2fTqso?Tmc5`5;}U%0(D! zg37ROf9zene1BOLMIXToWTR{G>)V6xW)1c3a-1+Y{-V+w*Sznf=o+|xKDtkNVn8&e z3`&8PUmm5w?c7`@Ka;?nr8wM7jc*lT8lVEX)vdXjt@wtrtIHkC?O{kWj}?802}C&8 zL!24f10~H(5*M&S-ZUqNm&weMl z7S0iG4ScRX!zMJkl?jT8>Y=?2X&@X;v)Q7n@0BztdJ`r=NX#uaCB$Eru?gzu2un0x zGRgN3Y(VZg)}Y*dviz_StXzu|{8%sQ&6 z5)ts*LH~Ra2{l44_y`7~-#7K%Pl5*FkzRVGB&!Q6W$&*)IA#eUE|HcIUU03UYFL2w zc^f5oYuWWhX)H+vR{D?ODM(=kj8tk)VtLRBgIRzHRU*bqe|ckQnQT9MJ}bgSv_n1x`-6-A_tm)CfwL)Gs^FWs64pY_=}>{)vv2f8*CFaF>GhXi=t=($B{ zr4~cv`l#X2{9Pd;06_O>p={^~@B5Xd+rP(H`zZbJ&!+WJFH0nhs26XkHby?rYV8)_ z7h+@4X?OXbAFK(V0xt48Vm`RJyY|1@i?coLq}JFRqYaS9)G1`z#Pq=+cpt=sMvcCY zAhyk`$i~Mpqlh$fcuyZ4P0(?wzWyq$V4hFf@hxuFv?U#pUHrnvaL2b>GOPl_7A9j# zmhVHMWMEv1s0L=PUvXZso;Q?nD#U^af0p>ZL=J)n-J~T&!pD<-C1_8#1~p^^+)Y_8 zd}$OvD&b)BmVGdF-JA|jC8;8!(3rvKcD3jjb84a4CD=PgdphyfN+{A!Vm{)Lix3+E zzT&*>BJ)j*f6M*0@u1O>;~^G?Nb0L(d(sdm`Sa6Ke$)C|6O^?1&RoPxFx*r^RDy&S zvba>ru#rg2;21S}&;tZR*Wl(aun%TFUle`l29c%*2I@AO^khozbCYxDd1ex}M?mS2 z0n`SHfc^zaG8$eps)M(I^#LyIsKFoy{iPBNYEEs!yI&*_qqsX)Ho;2?yi*8li9=nV zGIH$$Z*luZ`)&qU$UOf{=^hR2uDWP}=(!er%H~Ol+!+Um`Ev$iS?`u1UeTPFdH6XqTVQRltkffNLkryG-Q zf`wQ@%eA=z^}hDj{z-%iYkTv}`3Qwh_^UQwQY`2^_J`i*nz4l&Ei=q{37F%j7gLr< z`1w9I504HFUo!ampNI2RFW-OV4iDoku-vYw(8T~8%SZvj8f%=+odREXVYG7!a)KfO ze4nuGQVa@wB_v#vXy@+j<2yYNnSnMh!KfekK(`@UicTGT_)`;H`idv%Q+BozGU(B| z%z9B9PPb4IVP7O!Uwq^f`7JX2{_Vd-GAg8?9LT)cMOD9 zsOF<&-=ZYlgROg-4Jey>(5zZ8MqE;^`U>cAYmSrMiAZ&nam-079bw%i>)a@0PmsJN z@a6&=^tm1hzhrLETCwfPs9!%CL?Iz2B+{@zI0Pb-mOc}ddpk;i-pPw&Z z*cX<3?$XCl87lS(nBJC4%d2xE%#TH|S|FlDszH!9$d4TDlec$BCk^&HepG^{n{kP< z%{RM9dn|T|yYeeu8<(nzHZiH+$3%CiaMIL#nDc`vPAcGhc=K0TzHW3x)vkP7qpoq5 z&S&bBe*QnE-ZHF?rim6!AUFgK4q>Cg-8Hxq+}+*XgS)#0cXxNU;O-6y?s|s2-@WJj z=)E5p>*?vKu3BqVZLjYJ&~(;Tv?>CDBy0%f*8ydROptoy$!53jgtGmsMkn|LBf--^;FJEgbN6 z3f}M|p7OfpW=R2*m8en{-q$>jQ8QOu@@PRWuRJoBVAjWXMd{FgX$Z$D^5?L{FgW+5 zGtk|kTsVNp&fx;uTAt~w^CAn`)BnyKfCf0;-T=ple@{t)jga@La~~SfEN5}gDT!CO zG!BXMf-hnG>c?r^iz5om%=&8!4FzgJdju$_oe0?q{(>qqbVxVmAL*CFq^K*e-}`$= zoY1bZxK5)Vc*V^}zyFU5iba4g9-Jtytsrd#Ql0^XAhTcNbMEf!xBq6-@$>XPv@ZAs z`sZ%r>NCKV+_p~4rTLHefq_TtH1+=^*5|!fB-yvk9vlAYOEr)ae0X_)f8e#n)8W2I z@D!#&uNg-ZZ>TIwlop;!VXHW7Ttb0jr!kaJbJMKW>@0htb)u8YvUnV3i|X>ow0%OM7q?#O?cRuKx7Uyw8kX zsX+o^{qpeEbmrh;zU_sQ^lc>O=qm7p?UE|durE6F8LzYg1|XF-v#nEd7V2BMDwA;! zhtMrg=O8~JxYw+LDFJE7*yNMW+{dW|-qBtYfHg|h)a))2egJ{{bV$y7W4 zvHHaB0gfx^&Csvm|6BM1FIwJx72IV9O(5*XNlut?_`Y2J&lgSoE{?Au?x*o&I~wK~ zRmsvX>*Tjo`!hP!0VywtAO>Wr0&#CP1I1bz6({_dTLKFXsQGcWL5yAa-KK9p_o6v% zhSmes;Nql!=>VW-+p5Vw&G6L@->ucXrTV#+2%-N?)$l%K z`owPcGBRioO5*R~DL@?$&aV!$Sa^F^tp_Fv8P@2UynU(~p#SAw^HSiR%X*(aZlFY{ z;7nV!%hlHM=qq;X22Jo$KJ@DWa&r@un>4(v+ZO@V6a9bS(*;!rr~CRpNkrdh5p;+_ zynx=_=>^zt{S(WDVPZgJIs_RTk%g8Jvv~X|XKrqqmvfzQ_*|_=gbwde<6@n-cXyW$ z%qw%842RQ$PS@6cdo+%0h3gH`uRk2do^(YW68}Tk%vJO-OW3QX2`FH8B>D!Yssqxx zh=>eFT0S_e3xse^_JDP42hDr=MdzYtTrqBZ&L+AEvkWCxks9HIdv@N$_ewkjYB~>54n|4`J<)!?Pzc)r%Xcs>MisLs>o=)ptcc zKx$9M?i}Yb5bB@?yNHk>-L*fnI&O>-#l$9Rw5P8+);b}Ply|hqC6OCa7C&luYL*lT zGhpwJ4k4$F?w7zR=G4teuq1DY-$huE{FMeQjQH{y05FmKr2*vW@B`8}3- zDY#qFd;7dsr0<-tECmqogf&8hHX)7$EpAXzxPZS_OInv6UC{}l6GLl@rG zL|c1!G7#=SJ^l-npynKH!J+>hmeUhnEf35umY^~bgQls*UZPB)iy_NO%AIJ@9MT~D z8d*QlSqc~?8uY#OcK!&1wM0A{MT(@+g#zMdHfrHD$&Qw2rAI5%$DzccJ0P7Zx~LOa zAxMtfi)_GSi?$kAi7L65*AeS$EJ%_qaIf8h4?#mmwcbls!Akr`QiM4{#G@+uQ|2V@ zn)e!2Ca9qxwRWH0$3ck#jFgJcfj^~^j?~5XiSux{(aOLanyz{nMt_aXNEn$8d%(Co zz*ZH-SZOmb|KL>ig{c3=mX8VY)x)1H=SFGSe9hU+Lj6sC*Z0#B@gzq=y+g-kWA;E6 zBjdv$+MgG_T3HN|OCtz(#07KMC45o`SFPg{X!^oKEGif87SeejOp^jIWdIzXEEbWON(;S>goGK5?o)zJ3<1^DcaMJ6s^RRfs|uI@j9sjQa0K4tZytQ3hI4MNOG21`!SuWxoJyO6T>!yi z@e3}Vko8Tk0YhK|c7BSLh3v4}5TMbAY<3up_6d4&?$WFI9T?k;w(^Tn7GtJ5Upz46 zq6zf#sMtO?7U3n@2DRA)KD(w8qx=K1pi|%C(T02-3q8RUQocQ>DsEkh3f6e`t5Wx} zhYE(ZmTQa7z1MW+Z=yRIa=&=b)x)W$J7ov~ZOsmh7rIK?Mf7QDp_T4A2po1o?H{IA zrj=BfnRgq3=p6n%;?qU`D_Z0;fmW_~RN+e*-fC6SY}kGgz5B)x0vANv{1t6|{nV`D zn&%PmCh&%phMj=o2UiCJR%vIXWdSZQ?TouSM`umx5h+*L0$W_$zmlQdgj#y1JI987 zl4y(Bb<&ME92HBwrh#gi+eJ#N-orWAxL5+P=mi2(ZY~u9){94*$c?Kmg3obrwOx>B zefvUrR_q~128n5wR(P0#YZOWel(9j)WR0n!pDd)BRVa@nNd`cg!w2Gk^h_~dxPrX{ zv86khN22{J!1}b@d;nM^paPeFf5M z{V33O26U^veQw5)x}KIiO9Rug5oy@)GAJD%&~uLynUfb% zz&@6dnS8qvJv8+`cF-PJKcqKp@nlGl!6%8#w2Jh1RL;a*T#QJfP@3qH!`6yWqgUVJ z3NRy12+~#6$v2}qvN^ZPV^2>bwnEe@)GE2gievfEGb>PKE4n17Mak_t{F_+S z0{DHZNOLGbRpSeK`7S>X1ivsMl6_Dq1k=)8QKnDo{q*EmMk}(ZaQMNMVM097w;$Di zujeP2;|G<45lU-&wf;Y$d#30rOct-d^sEA0e_@ryRU54;RkL`c(?D?cetvc9chFrN z5?0ZZ`z7>;S{rJac}`Tz|H1HqgKh-7%H`uRP)Dgu)6>n5Hn*{>c`ONMY{_Of?^0~{ zCuA)&jL+V%F9!xa%NwdG< zevi%^u`hSM_+5wF|BJC)E*^}C5A&CioETLfBLAJP9NET26G@XQMPC6W{hJOXsvsK+ z4fuJh-)8>xm>atyMWr|x%`kSzXrrZ|kFmjhc;_cf|ME}kmSHbw3rALC^usThOtPZv zGvu))5ylpiaw;Zm3TJgTG?#M~v0v=u7OxI+0z78)^AM*hYP%kB6Bet&lPkfQF_za? zA?+zvAm*{DrrlYS|DJoTCa?Zvzgjs$CS1YF40aVfQvRhmnPJt?!^ZK&v3*iL`N(ND zBe10-(v{h^#TCY_ah7I*HFuDgeJ#AFIPx$K#oP}w?{7gGbM#Mzr{;$xyOt%)hm7J7 zP1vY?*_mty&bD6c{*$iYj^jS}aR;*m=LU>phRO?SdHrkn_Dl6ajC=CQ zql3CcEoTm#w7(1?xQ^23*XnfBNUt;}%#fejOkXdo!v{oOze2bHk(ZfX)Vs(FwKj%o z*29h8Q*55$o!Ml|dY(RI)DwYucOwa5a)fMdIv9I3LhZdz6aK04O>qKv-kDE5nmC9D ze@#6@CjE7-G%Rynlo)x7p+greO`pC8L;3K3v5emOApHnCV?=oB@7+wnzP2nX{ksP3 z3}k)VMjV0NK3qx@c$k~%#RX(}M293y6tT=*T8&;!Kqt$k_@L)m{6kqZp|)PnuCfRJ zhttnu2l_0^M3My!kTRwGuB_|q&~2_4JYd8QABgUI$=&cp0*K_Ue@D5YGM&lXPX=q* zX8udeegp2->z4UHbUWhf%^(+iO8Z^_K9MJq8zw38)Jzp+Jj1DuERcuv$6}b_HgJ5! zU7u>7KN6%yFEY|N9{0H*C-0-d@(}ZP1z0s~X90LCMf#I>I32m%ZdNe|sR74`!>%Gx9slM-LsXR=c z!MLK!i{xme-Pb)tI{Vk4d(X0Vhk?C7F*W*Jkesn1&6Ir;C8fYFL!%#dgAI|(NU!M( z;K=TP{^)*cDy(?l!YcLtXNs?`$9q3SsI%f)ss^)zK(yAG>+jciX_o5H+0_*tZMde8 zM7G{sZ)7mGbvvqJg{R%O9jInq2TF0YKe4)mw$mN%_4k z2!v?+=>k9SGtk5YO@r7fi3}0_cG*9_%PmtuS<6W=+zb{_^n!XiEDz@!Xm#bP|(znAdXs*l=JNeS*>_gSO*7a(sND)PAI!{jMy$lqU@2v+C4oO~S#;D+KH?3; zBd$U;Y{Q1T6ptDe-`*sQ8Ezcy_^$H8n`6rJxC4OLUCbRDfKI0~zXQ-|Y+yIGE2iD8 zXEUu_KL1Bdfq0{l4o)Kx!#>lmE&T9PEalojV(pMS-G3lMpl|SQXta+nh+a@*n|>6i zWOU(ijS+44pIQ|~>4W>mc&+~XV}B1VW4`Ka{)55(-#{X?4T|U=#-(>YDAF!JeE|wV zlC1n+y_4|B->X~yA!k9(Ttm_LgNRA9#DvAA@7Zz6PnuW&KhMnmAFnlU1gF?9?nt9Z zo>WWTJSRxQM!t7hTwWH_y;Pc(){k6VWb?`!$ z@S>5$tJ}TQ26z}wo$HIyhm~{ZyzqUm?;Ye{q#oO4_WTSi2;iloyH3dm#IQWV8oRcO zR!TO`gOMs!KW2231YH%gd3Zsz+{xQvv%e^cQHPaef`>sycZ$ZU+#3Xw6~emc+{P2< z^?zT*D+=Q^C$^=`1V7*~mrm07?ZDC%W2n<<8a!lcsWW~g7dRNB4G|WpF*(7apFQ>! zUI~XoZMj!paH$XKHhHss$%s6XR;?S`54lRHQ#IUA9)FMV`au3=KE_An!AbCTg{TKi zC0)pqVZa45vL!k5k}GN`hShD$DJr=3x3V-L!~T>}igrafY-}*@ z-p((Lkv|mGzk)W0AF-0H^H?W7XMp;tp%}!Yna@2F(ao5@1Wm}?;WR)EZo7FyM-CdY zY^5I(*PVOfUTrK`3wLJWUEW8c2E+bN>(|y-9Nv<%-<#ijd!VITpm%Gw9BrDeyqsB_5jr zQpgS6rmk$fs^kWffa1 zFLklV#VJrJfvY0CH~-$M(YGJJ6q_!J59Jx1iX&ql4z2>W6Dq8j*-#MK6_W}RSBnxc z*>u| z3REl-4v{alf355JvPCWBJgF<3ty~WnZLAZ+b8>5UPu)JGT-@0qjY5^V-B?buQ?(vQluRWtg2$+$*17h8|OD7e%+DC+9Pu!lD=q{+_#AW=Lp3F&^Ayj(M zx2ih$y>Z1;dMu+J$2r29m27`vM88dHAJ}k&{!~#WAHzu*<*1c#z3_YEXu^zo7@Xc& zX<3l?dy%uTValMvm*7=ZQ)O=#g8c~&NE$uF&<6D8TDu4@9pE3wNN4|AsC)?wuvAZs z)c?u$1uiT=fS*8?dvG{0LNHqB57GYfv}|^I0Rgxq7V~XpS%`|_;RJ=-mh$H%GoW8z zBnFGx-~01-E5ifNgn8DNy#al6!Pf#9B%b1yRU%(ERBp#ck@$iAo0fWez0)$m^-NTI z<9ZPXd;QZgro=OPU|2#yPPS%NV;PE%o8=Q??;A9j#NWTTrjmJp?IZYUpxO^D>$bnS zO=Qy97hIf`g8tX=hhRrrYZ>gsf!j$H`!v%T!Svf3Wry-cW4k($s@idutSrZtf^M_y8gTL zq^m2?gBvzUa4g>Sj0DC#W>@Lm30RWbiiP*SE@*f5TpLO&G@G6!rh0c})GL&f?^2@3 z6N@cM6sKxr5XX(j_Z_Mgl~3Dm4as9 z>QK2nUN>Jt1Z}0S)%>;Ofux+}Cl_iVY%5y^%+4O_O!?Vnn5k-dY;bFht*`mzbFKf+$&_%cj74KAKP4~iI%Nn z2wdz%7{hUb@dHa+H=JXk?+H*Q0qrIyWJXIKxNn-)@dF*qoJNVNe!+jRMe&2e{Vq)U z4-9Ys9o-VUL2MP02akKHYM`qWV_ZOhKor!*DML8L%eaAV^%$e35%uR#bZKPt=fwS& zlF@K}v&^SYFgkGVCoZnE{$^H;iYit97V@VIER5x%@HqKzqJ>yN2>0dZAiQRb}5JKJ5{ z-TXUYa4Y4dCr|SJ{aVyOVViXiq%)y8SG`u(Pl54g+wD5vxvdACX854st6WgGRxAUN z2Peg&OfxTd7l2|RE^IzL2Jq`yEAZ~G%VIs-2VPC%t6>%Lhpzaf+yqp~`!q?kCh~$X zJuMYwsEL$uy~-`jlvMi(u0`V-{)@+NMabx#6FZi-aO=v{ROyWPPZnv->0&&4a)h32 zj|V_m95VmvpPyQH&RslO#dg}RYQpssRxC@3=feT;J=p0fed^~Y^=;^v0VhV-G@qpD zo=1d@!d{D@o!X7O0HMNAT4xoJ=qxyt-`A>ZSRh@!VmR&`3#9-I&T%!|qz$ln2KdN~ z7I@n74h+ZaOX|;u3@1or1f>nT8VCD%qt`vS+@GmeA!xm&hSVbOdXUDsrVXvfJU^WE zGgLY)9sYbcj2O2ad(}$9f{Oc7aVTIk2xFAekDD{sle1+ZpF)24Aa>{)biJ)|-jA)z z?mzXKd){uet@A^Licvm#QyH`DrwX{C5-}eN%$W~-OAZ4?70o98lo{T3r(+T~O@?2K z*H37#Im3y)WD!lM9)cIy!Z~47vS3R2FP z0T;E1$IJL4{b^1rai>hP0gUlU+Gebl$tD{RCqH(7xRk7g`z;pty5sp+pARBEK)Cr$ zs33+&b|K$~)c4p8eHtr}pzp-3!JRnnOwc$i2E*o-`;YiFtzxSeh$qpbZ<`HZacWRv5Rtp6*<5)sDctMrGC1znm#8>GI-B37W- z>_pR2Mn`xDrt!kY8PkEDQxs%a;Dokw>R-BB=DcyEY5q7;b3b%7~<_Zg=oDeA_rDs>XpGlt1CJ4uHTyJlZZ^`sT1-X#8S!g-~{ zf>NP5v2Nw=X~Jx~V=Q-%~1!ECM(p*T*bo!C9VHTd#lA!xtxCWfrln6J2nu;n!f_!o#z@Js*ApKVoqF zl{N6RD*(woOYBX?T^kI4K{j9Au{N1amyr`*N0JnE>6?kbU3V|*nBh}TL zx8hBE3&`kl?EdNwYcFi>v2~)nr9PeGV3xgbJ;cG}nx{E%A;B2APeFDQUjUXydq7b2 z6TRXRgA@h%va<#lDgMYO;%r#xHpazFM8tk6;t|4*fFodQ{qH|Qn!XeSFp7L0npY1rLP!n}@_|jctq5n{ zPWO5@KO&7nCoNfz>^R%$AUghlm#z2o*Ws7#k7egYtF*7Ym?DA$7aI&eE+MxaX^alj z1jZAr&I0dI?+-E-sCH(m@{zp3viKPk)XX^=5eXbUv{02MP{ax7teaJ9pGJmY3o{!L(-#@I=oX6=`Lk zEcW!OWFr#3#AswA8U+ll!@kIu|HyFF%qrvYc1ht6=Z-TfR1cJ=WC~M>6Z(nlM0`q8 ze{1eKx0XpTpFbr9qN|rDy;qb2#g)#gx$-Ldm>ZAL7Hczvqf$Nsww!Ez4o|+|egTLdWAlxHq^r*+IjyU!C&U zk9(u&BaczD*&|0#gCwkOHH5Bs!|v-8v%~k_N*Ge#RQm==l19nBg!c9m(SF`*W@@(c zC=LkuZ>U6y9O`Gc#G72*+EGP$5QwUdgNMpfR7d*qfbr-%Qav7uQ~B=a?s9eRO=cp{XWW!htmecZ@p%As*dZ(;${eUQX^IfXDH_RI2V?t?Cr+~<-A8K*FQv*)r25#sgk?j`TM>J z_X%8G;3z3~wumh<{X*4mfeMA^n8z4Jdx8@@kL=P-f z`m{OwPnULOqF%Dak|f{Da>YR@SR_1cX0ImrJ^I6{rC*eqtm}%=b~05?CCK|!0;YQw z$Yj%Np-&HXm)5oOMi!H%tv4MFSxM@SD2pC7_wM(&x}i|89G41TuAe~K4}ugm+SG$~ zx^Fz3;&|5xyb;z!2@)SRIlrU&h)7r7Td^B;zRfg>eL*5&yXOFg=D;(-k=*BU-mc8X zT#6;YI)_Fof;L)wP{t&Ru$)P#eu78d>7XNdfK+b1^)6ut(PmoL{8qQvnqsiUIytR= zF4ovFO^EKOf9e)+E6lH$VN-z;HN_hsUm|`wj>`)iO>Cqnd>Hz zrIZg!r{RdD`>0LADly-4*!zT6)sGKPhHf0{8*Xmk>zwvu4q#b-C8@QpKtj5;z&@Pn zS+6gO*etM>D5i}bk>+} z@9!ZBg=Jr3=;*`2KO@IA_Uz7#>@1JE&O|W3S}qwUu0^w0CKdP3%7wpdIDB&-XlM!n z-sty}iY3hMWB#*_!L~CHSA`)>Tx8_LDYD~$b*vT|0rCTcl|W7<2z;;end&6RpcXP!#N$>vA&o$G5fI_ zaOZXkBup)YTZ!`q$Y+)3m@bCQh|UgW8T@UX{IK+i7W>zwTWfPn=!VGVHNn*mb=Yq1 zsTA)w7jF3Hq(^;*dW;Y_QvWFR7O_)O{(UdN%%mGDVukFfeoAT_9h_evDWQ6|8%oEE ze^=xNa;Wq&MiOauxI{V=3SzI*_{-vgFyfgN<`uEMG7=; z5CfmUc3i^XWsD&L7}~$f0yeYjxHQ9*=#W^dN+y5*VDW{<-177_-|n4jWS=YH!b#(qnm{~{}9 z{HL5FA$mVIm?aacuLFKeBqket(NsXunUZ`=WI(Ne1gCu9tPt^vOtk-cPuZ$;U~p#V zT0So)^zGb?d3~_pm9qHy6!l!fXlXKl5;sghU*I?1IJ zWqos>`^=s>Mi%%8uZZ0I4@xc^;nkvnGILuerM6=&2FbCIwqM^)Q`=Sh7M=A%x$nbv zD#o`T{!R6itDNcN3N>;SLBu)2Se%QA3l$a#_JgoL1_QZ_#r#R|8Pxtx8{7R&RApUzc77DU&Wt)yQHCVzrk-tnAdXUi?Cn~|p z&n+ik@n)R&Ym_5-E0f4D|G9{AECE4`1fmTX8;T*f>~MpNIP?4qlC#YZG>MQyav@_A zPcd~Z<%k3;nM5(MADclf73zt@KHosEf6FKdTJC;QE=ZqGxzyBY9ZfOJR(^Z~iGb-v zOqXQ`XzwQ1gnwauJ#z8jP;M+TC>6B+^lmob#lOYD8}h|wB8u`STzg=S_~&L+y@zy=v6!0{6ghdutt>L;%NOP4%EIo~3{}agvVntxvJ0G;!Vrrhm(j-7yK!Z`N zT6j48{+|UsyNkLrBb@N#4RAqxMT`9b!L#%7DogtA35F}yt#3#(jV1%e6=N!iW+u-} z?I2a*{girTdZl#gsiN^hWnrD-Nv3iEs>c6q*%k`89&^ayhwT=3@?hgE7l86N!vBfr zjCkz?IwxOH!~J%1zCYD5&(oLJhz@0s_u$)I@yy3cgJTMsVJmq!7Y5Ab{WqvYTiusck?*h)#3;5EktyEt*Stv8 zGk;&Yy^l4!7?0MwyTb8PtlFRi2~%zRgC}i$&7_&0 z2kyFP4iblzp>&{xIcI%x=uKgV7=>85c4;%4Sw^#S?GQqJGURvh^7(I@cP(mVyRoqr zd!H^t)XJ=hm*h;>FS6Cf_*SIY#v5shuWnwc9Xe=lVA@L(#fg;QI%UHWsCQW!epm-< zDN54k+3I^s3iOuOtHj*IE@Ex8BfOM3EZU%jNV>=irHf4@QI1)@4o{QUS?f{d;XNlS zgmOU<22%c259#$4EqP;qq9X{^c_Z1N1YXW)<(WuAZjLZwg>i<&{ea~YGh5V<8t7;G z8pBitnF1G?wa)kXC*Jy3^N#>|xOb3kVTn*v+n8`EH?!oFQ_PxA7=baV!tKAs8@UiFLNc7 z#iD_IC3X|ra^%NawTu4Vb74!Z)F4kKy!r>kU5makrcAocfWZ58tQ#ly8O>9Odfrns zN3MuBP%QG0L3h|2PM|n1O6C4_9bS?;Lt(wIB@g?}bDTWW07F_8GG|$L@0@+Y_Ztz# zs*y)DS0<5>WMhh`6=Sk!OaG~TUMw%xa&B8!jr-w5i}JjlA!oa<0?Ieq%Knjim_F=) zNM1yEf5vpfRVn9WmQ=MYk_7Z)q56A{f-fKRG?xR=z=CjjN%*n6MWBSq2!>rCh_l59 zD7nZ87WXrv8_bM!-k{S}P&Tp?_N4PZ_pl4No2zF&{M~F@US615pHHRTUx9RUmmpci zK-_^M3C&d#<@BTGf(KbL9!2Fv&kw*xfj|hAqu{||eU-%0ZPll3^qnJ$aY8mpa4Aln zHL8$W8CZQSI25F089~HNu$NHw6W}rQQt4y_6LI0I1OzB_#1w6Qi43zO6TaiimA^xV zRY;jEm|~ESG*)BPIVX&`I9-KNQVZ>$8?d4 zib}((!>re3qbiL!;0ZF1OC6m*fGBJm%};0!T8fAx+ep6K>`@^S-jM`%_BiC6ewGp> z*_dy_m%x;T+oN$Y;}9*3y%^fayXw z`1ic1AXoY6vnj|3$GFb4oD;4&GR5HKw4!wh>=SGLk7v%pQ$Zz|bCim}lj=S`!qbl8 z!dZQ)5Bk80vF*d%ei{qwne5n{R(5O^i5zl`ekO*by-*ILSC(lXn-!EZ4KWdw>EJb6 zA_4jLc35Tj`W{{BGoaC1RxIKXJnqdFYmCeBe)g5^uOz+67T4D_Y4=K1KruFtvy!Ao zk7?yZE){zzTT{yN5jFaakB5XcMPC58ky+{(XJ1C{S6j&Yuvt&zs@D<4gS=_uWs^&e zr!iNJr`M!ExPG9gUFDZaSEwi#rB<+B6k~N~&Lv)b12YejfaG-F{nWE^B0aHndM4-K zS%Gi9CV`KXnHlwQZ zH1aywHhr9duA}*v%{3w-cGI>~G?H>O@-+RM~u3JQ{A3aP7$yeg^E?cM7~-&BGOYvSJ=SA@l0fiUo8Gpun$Z$e94aYsoRj z{Mz2SU=FgK@O8FTCemCf8$^fCoS=DL(dl%tDz_7BP|UGpiNEvQnwW19O`4D(OES5M~EGMV9Teo*5Idm38a1hhF5#p^%Ny$R%+x(97^ z1V6{}htE;>E$;ARp&BB4%iFd9frm4qzOiJ{yS3`uzz;w8*799p=_P(fWP-vs#S90$ z7CJ4P=Aj4O7TQlsUE3I7YF1X3=T{>A5;Q=Fep+V)&!u5&Ye;yUHZq^5FJ!COOAPy+ zfOXQK|1+>os#eE+!5666rtr&@27W_m_kIj^2e&r3`r}mIsm{JX5Zf@1HkB@)asF{q zmz@GX)q%a>?2ptXo2m}~Qu(IcYqf!v5Z#C{7)$H3Ss}r(=wY+CmO@04;>*MM=iY`) z{aeI6smz=Zg&3$2u~oA*&5``{5TmymSI$i=U-PK3_Y{4cM^4OKi*cK{g)CMaGWsd9 z={8-8f+VChOXN|Eq~oCrnQRU|TD(!E3@1ce2vjLr;v?$Bouu$l7HvRD?&vl8DXK5l zhawL}nZvYCtVBOAcEZ{d%`8HJqpriA&5Hq#j!cY%<$7-`S?_W;j%}m{Zk6s&I-@UU z((vo@mdcco4Cx%$A9h|2wm%;DJ}SoI?Y4{U5Ti{O{FNiUTjY6e)EO>b?6{=|nFHv@ zP6XE_Os`jBirFrn&%tqTv;=dL?O-eRQitJ@Tlh!!`HZTtlW1dh-hl z)L%+563Z7%#`rwwR`YniCwZ@o<%IhI`jm3>l$QUbycob~#vr77RnQfEPHWfIGFz5w6 zMn*kYdL=?UExLH$Xkid-z&&njdG9H|Cf6Ws`=X2^VNAF~{+7zCs#=xXgnUrOU06}x zvtDxEPXL*q!Bxk0!tl}G+KClQ&A{%p(o0fJLLVT3hB*)GIWE8 zyAWpK647h~$~M>XY3jj{$e9*vz$@{|;4n}oQC>akk};u+lBhqP+i;0r;UJl>GWYjZ zSD@)(i8w-HQYE;_4jTpXJkw`n0E5{U>I*;=T@--Ao*1hV7;0c?Eb-AvbLLk|#?q~X z^7bJ)yao&UN{K5$oL3-88HEXY{V_#>t`UDL)LQUzR%0u{IzG zly?*TDhg}bUUrU&GJW2{bjW^&VVSQkoSGBg2_gv4;Uoz2nm4Hp52*=uWG|QjJRSzC zz2*vV#ec|%xlSkjb`FXl$&4cGcQ!`EbU9Ieq0;FN-T5#7gA!OjjYSMd5lSBUYwM$fDD{j*l<_g3>Ol^lW9n z@fK{`Q3W5HDlAEt_l+QeDDXxal=QG}R0k+HU5)$qbbq@eOckxj+qz=T;#@BB=^Fm%yCYzunKYV+L1d!;j;Ab z*7`fi0#9ZO@^abkSGmNu*i6}|^1h68WIjTo+yeoWPxgMf=9CkYA_|>3Sl9Z80!=#U zv=pErT3Z-yP1S)!%)yIzI}Z-T!@8vMTtuk-Ks^~Bf`ULYN<`{GID<#I1Kxq^`(YCe zT?hs+jh-_rEJs@!$BA{P)FxgY>?pb7bREr>qwTd^nx97L?bV5DlPe-S7`6?3XI*>M zt5WL>$9CUFB|!lf5xEzorgeeqx;Z{v>9L%3;X~vJ-*T&cV){yR-q?=ab|mGvlW$*S z!UxvEG5><*6m8V8U#Cr;C2wiQ*qR(N25p=pTV7*|MHaAmt8f?COskV*Stb<5WB9)daNHVoEd$N_pUjy4Kx`B!5_ZW^Ix|y18@eViNTTh$a_qh z3ujafna~#~(}2fi2{B#99czsDC=!%z62%g~OjEWATo2xw2K-G$vSDn~0fBt~mVk;Ijw|6IuS z7TqQ)Q;`10EjKt`#3G9LKni}pRAD=<{?1 zesa(P9feuE!nUk?^k#56pHhH&lk9WzSHl$CJ^EX!RgPXiqD4wVdlqi;tOM7A`#|D# z3o>Bk^-M&z3^N`FyN;1g`Y64t|QcbvawvXau>VrsF_6)NVX34aP|^ zB*Amr#B_BhIgTt;)A@|h2LXACXy~Q*t$~+O*`!+NdK}8y6=h+~w7H(Fn)^cGHLHNe zt_voa!42kP_$oU7$FTVgF6_=sUsH@~nkA14d`F%lhC?yI4l|}#aw&&n0Zr{I$TwWE z&mXr8u(I^N8X@bSkv6hX{t%D-m=HHDFx7?LOJ@g}85zmtAHO~~HMKB5muNkXNFbwa zEYk6T9FN=&(*1HRBfmQ{^VAC0G(#%pvM6zSQWp+UK>UpCB_@8FeSh#*{AujX#ivbh z<(+k^Q`*It@?pZ)f@<>y=Fw!)`3SV__HlVp{`{I6_fP*;fBHn6z69QqyfTviaAgvw zs2~5(l(wWZ_lEp35`z|N0J(8s3LsVpStA1C*KAnP=^oN;z4nWOk78;7{#9ZMV=DLl z|KMsgto64TOLB8DbYF9m2EdbK{JzThA8@lOlbFey13*3OQUUA(z(PQG(pIYY4g8Zi z!ya+;BjHLBfZOW1^DHnfuFb3YH-50#4gr~Wp!{ejAe7(v*5QDbFzzum=3|3l?w1KPGei+pe= zGkRkyi2_>bMh5?Lc{M*F<=9#z6#=Yt6VZ*S6Zs}IQes_-lnf*~CYza!j!AXi z>_Rlb_6Tg+GV=6QD|5+gp)WY_V)S+clx*p2oLyVqu43^wPznoX=@PHp(=y|H{1|f# zVLLQJ!`;1m@w;7MZt7AZKp*NfsEc|Nr~GXOTm=ROccT-2DowX^e;5FokCsU$4J?^7 zBh)1V96{Y}oIx%8AC@!_sHXIJNO_hq^nHadTXE$*565%yB8f)P!YnHLpcHVFA^_th8(&1+u5{N!CW;4nBL8keT1lSIf*{R_^KbpxN5*+T?~r3 zUF^1FNV0a56y)($VW~S;$ta^m5+C>2-@Ekb5BK{Q=G=@eJ#|DD!g^5w{cZ08QlLm-B&lPqkn;7sZzHyvQeytESH2ysJ-{EDSRry%oO_b)*Tp zhe>Zub7IIizY1oNB0|x);l5a!Snd#xgAusbx})#Xbogl@p`?r6J#-}as%n|wz__9# z#478Eo9K-?jS!_ZVw3{U^Z$D^b=N)DaUzM35UAuALnx(xpeRk;3{1gvmWLubyY8k_ zHum4g*jH%iIMKx*z%&l{XcO*^8%d@5NdPwBtM9;%Mch6~VDo1Z0Brvec2(n?5o}}O zRmu<@I7TBN|2ncq$S!-uK;yMdz-W%nsCmkP&_}&ehra9ox*B?_-~PBpub!| zKQ7gYmOGf-UUc1KF9>P%=*^0ie2%o})-L zpjl+H%G=m|zrm|kOnpS&Xo)8L!H0I9FYlwN@XMQROZvevcAFtdip>$8jGU+MG7Xi+ zI7V77e(pRBwHhqXK{`9)cn6gR3C0*J#(l;QmBz;;fI58}|CV7@Mg~eEBhMpoi+u(L z?7-5j#uC6oPOCaM1k3)$PTIQCc_}*Tn)4Cnjs-OmWf5PomeACn13Bjm{O%ryhZrRn z%HNQ3#$&ds?`e7dHo9~KtjUl*RhyN~#FEH~T|Dc|K@?Nl*eevRxtGwOLOc$-TRrDu z{GaaLJE+OG{TGa&@RcfEx}pe3lioo@M35%E_oDPBEf7GYNJn}X5s==S0fHdCi}WfT zA#?~3LiXl;-?KA2yLAvfZAD~E2pqnFA)GU5-&UVXuX>o4XK~4VxIn!#X&d?2)aO@6CzFHu{o}ibjX%C8 zMYb5ufzwg9TH_@YS^5fRuIqNgBH2g5JRaq^9_x$%&-Zts0e}DWOn$BYA|5oq4>r%@ z{HWud>sXK(EoF?jEixI97Jf8$=23u%e!m+{QALvRm5V`P<1~Y94u-!7sdSI1Yq*#h zwj!kRK9y3tCEvCIYno3PrLAh#X_fi2o_abM$bMJ-YWT*e^sS$IS)sv7L4=anXd}q% z^U^qpD2};xs$a?Xy0Same@%j~0*TbC(LI-XwA|l_|JUjqV*N%P6UTAyA?e(UoIpfI zc+OK-a%9zdjYoX|@_FfqRHpihjeT~7=||Z5KbtMBLt+;MrPg%mfqF;M5&xv9H7-e{ zzuC#EmEsL%8`%hX`L$VOgY~7=(3fY`VzN>G(rPZuQe@kb`dR@$o(8|8sJgfvj!F|F zy9{fmnzdwBNc$@?es(WJZ}8l{$m6omwBLKI$1mvb0`L8f5u$HNUlPXP#Z{TLt~Swe zdUQ*H;pn&ix1Q%d(a36dr)<8>%tR6L{o%81N%7jSsMTmuHlb5E<BOL1ss*^KTXiHZaZ@@|vU4rZL+l*J>D5t$$nI$x1L;VgFR z8Ght*NA0xms7I&pDeHLthS{98#N5#L-!=o(Ei|6^h{EO@0zqstbF!tB6gxTuhLo{= zyE=1os|mDvNin~xj5>5EQZe@*R<-ULm9s5QjvEYkt%%P^|6_iBTAn>oUT;BjwY@bU z5a`O;8JcH6PHzox3pr=P)k`G{Djn|~MT^~9-OS}ggRyVcD%1zM6xlh6eDOGCU~aPr z0PsN&{(#r+-!P-_JM*)`w~0#MG{Os&fIXxh=x5AM@h?m1vC?My*Qi)}rThP~&>yqw z0%Hh-0v>WZu#}68w1WpkFQ2hGs~ni0Nd8;l(lqBve_6AEyIl0kdaf?%X?mSV(Z8gx zsee00pJ>OqfRz*@51e?tgqXb0?hxMgzz<=-Qm-eiC0&J!yPE%aT3%6CLz8m%xNdF6 z5dT%vkVa7roMtkB-hFS^PnsLiEErQikJ(5^R<+rmc5!P{Ru>Kq3^^m9P2(@i`K4r> z8V=r_^ro^mxGR|diXr>O_7q=-4(>w~MF01EZ?|2VDdTxlKEJfqZEmf;4+FQ(qD|M| z^I_3Am>9RDXW%ygE;H-}3+mIOU%_>?#=GY8{gcpvZYx)R{nnoQh4V1x zRNS*_5VECS)^4`enk)xoKx% zq@A+%U754q{w{@3g5W${Lwp$@+ADUVD54m(L?yX|oMs}^1}-8by&$Q*a;y;iTstr) z=rKv@=Zbw=lp{^D*ZKqD!zBWfz)+@3n_zYHE)}&{-D_9oGljFaX(ePH`QF=Yxk`*i zZ?){ca_O8-sACkztK8xPa(uVWNc^8{@#PdNrzpR&Z03J|D%53z_uy2?3Fg^srs!mI zK!)H;g@eBT3id^X#b!`p4g$9sX8&+Z3@_0yD6?sWzKp>UmOr z;da7YxW7S_g&-ED%W(!KyX$kKiOT6_hin2_%MKMqDiFO~+ja9es1=BY9 z+fZa=YnxZ49gNB^NXMJVN|&MV7^s|YdU|-ut4vM%zpvm&nI85-o%ln|(S|AO^-OA3-R*a}CjHe#n0k;Iv@D02b6S>} z0%W+UHFD|a!@bkRp*PhjKYzQ;Nb`9medOSVc9f!SUlt5EJM=;Y%G72-UKyaj9YE9TRd z{Fr|dJPz&2!FHkSH|R9~iX1t7?VfF_OugijL5NZ_Aw2z~k8ousqdJlFDLRimR}Q&u z)&_H4SPu;RW_t1p?uogm@BLusKZJF)m1%veh8>OPnK=C_sB#hOi49{K8NKW%)i+tl z+p;#mqhI}wU%$6d;p1ZlYkfFGn-vwdzOOqfO^a(mXQ>^LIO^J&`|-7ExRIr+>wt8~ z;$YMvT-7fx%qe@miT}n_N^79J@ZfGX9c%4vL|r&ZsS$t4mG~0@M86Q;Nm7J7T8n%q zwUbTqzAghZ$4ud$yet!rnAI0Hkq=J&u9^^h(uX%=wmAHFV7q@~M=I;0jU~28&YS|A ztcUpv)cPG-MJ)^px(}S8x74247o4TZG#$kIjaJ7O5%4s36U4mIb@44F*rANbSi4O1 zB@uGl%%coQHJ}R^Oo|n?U0I&+QCUweI}dU_#W*mYkS;GK{}7KmZHYW$g(G@|bF>Vn zVqpjruW+!N6hj*whl|V$Woi%Y@#-8|RML6Kv)7yQBma zzZ5Jq7<)xz+PbCh@8iMbL@~9yDVpdvUU6(^41Agt#&gPGD z5}qB&%*H4ZxRy+eNJ$41Zg@$rC5}6Pr>kugW8g>E(-QoYzLm7`yR3Z?A18N2buPcp?XWm#*G_Z@;lo z(EL1X?Prv;_DifiHvyo#STvew|@zE`R+CtGV zr9Ro-%D z#GEKuns45OolC%Y7F%tryb)dPC46AlWtgs^GOJq;tTBd?wi0qA=BFu$=n%_jsWXshC2G9S~OvR`*A^;JiXTHu1 zr%!!LB>2WAl7vUlhIJq+rTFFyJz<;$9bx3%I+f_8PJ(gptwK#j=Vjw6XfL&-v+oyB z70V3=O#Z#MX*qU8X+m(D^}mh3Af|{iCGU@X-I(*6HIE(aB z8O*!mmWm^nKPcN*4Mt{#@E!)fC2$pmEvngw&-+gWEaJ|g&Zitd_lD+MMHs@?MJnMk z@?*ENET$Z;-r%{8&dNVqnJxS_uYjLIO;5*mRsX2L+PD5qik=0mpGVw1BOh~QxX&r> zmWOl^Y(m(yL+E=G8W2T7BnR|9L&)SDQ9Rvo$xyyf`H(jj9{k1qc8_Mckb zxRs@VGd`!k^P?_@cIZR$+G)zZ??Vvqw||~KJ}jeU! z0_XFe{ivrT_|}xKZVo9HnZPl?qIppAWLWceVj=vdfSZ}a)06DEu!`-iG zc);s&FW-Nhu2k;TJ?FsR8Z`Zz=Fo6W(g!eJ!SY~d;0)W_E9Si&vJ`o&&X+64J&$*Bk59YoX`O%M))o zJTfAZ$`Vi^OfVg6YktvIq%Hk+!|-mVp(wP25sT`epBNs@Y{^}yt8?7eF!!9CYf9l6 zjxiNC$Z9=a-fB%F#%z>I*)OJ{J$aGYj>=_=4N#c*+JL{Ub85Q&oHX>2G{r)*c}s*K zk2JJnb)xU0efeBZY zJq;z!FxJlSH-2-vZUaA|V%nEMcj#i6vFDbosNzWMlySgLIdmKsRlLt^JIM^+HaTf) zd3@PDeS*JTUiWcT01k1r+j;iStS zqXn1bLo|xgdQ2&wYKra>RB(w(!1=JZ4&Qyf!h+j_7h3#~|J?G73kx4Kfe6WbGc{#-umC(Bdw+1f8!?Dh!3%Hw&bxg_qhHvtv8Mq*RM+f z{{`cJ-WdTN-}tDmsz6LYM*yB9R($zf1KjsPAUKeJ@W7*vk4Ku|?zYQIeRl|iX^yqCA;8V(rCpM(_&xoe}6agtu2;>B~kB1?PE!V=CU>q5#f zi5%bl?%VSCePCdq10~ssI9YtO@-%dBH|eX28i18*2E{}~Qlc~JD_usz2C}dwX6J46&P(-%3YX>nS96iPh`yfaworZ zGP|z!jQaIMPc~op`K>M1R%AHsm@Z9Q{jH_7va$K~U7K)yD1B&9g!pVe9`fPChmp%) z1(K)%O(G`2eXl)*0V=e5vk9+rs}SF!TgiCeW_-ilJvK?Ms6TSfLk*G-9t6J?u)*1n z#qTz&nTBDl2%p%kx;WHZV297b#-xb2jA~Q!x??sBVa7T3-|o`b*2dCboUlHA{CM$j zOTacEIayU%+2`*>k^c{OOw-|7-|I);2jmwkZgQSZvd5uP11>)(UT){8;c+)iJ47{G zv#VVlnIc3NoEiiy&f@&~YpQF~4u^;!7JVtaE)Ggc1jCXjmTeKI_9P_B>{|Pp8yUI9 z1AdlIJw5-hfCU&8wGY`x5H%)e#KL_64_P?yMeJ|rbuc;OW z|B=Hx`o&oRPQF1|6wlJT$jnTJN2=L$wOl)rwu#_In0dlmGwm=Z_!;X=SL28#2{{z- zo!GWr=k`XlZO6;vqBXyJY<;#i7B^KqvC}?sgfC%8MSTvnMyltGoP)XvZ{KbSobJn! z&%KPAMcTA~y{vc{78WM3%Er5^&qeJ77sA$koZMb3`{=x3Xfk4`3iN)Ri3X*O~g9{y=g(gm{eNO?JCv|*ioh1j}Ul;an@vxt=&u1W8Am{Z1r(ET<&ChFjFGvb4!#oAw&ap41 zb~0mQ<-$m58W96WnXi34_g>74ztcmQKj3Mg2YqFBt!w*exl+PKbVrndWcjhyXE}5~ z;av9>E`Go)4I3iunOLktN~B^!;o*KT3ZI*ll$7@gIbw0R@%F786$n_nayB-PSd|ic z8p?g^if>7CnAy$NBN5Qj)X~mM-m@*vZN&Q6Fv4ta;Rvyxl9txHS~SKx@f!zpHVH3e z>n1wMj9`t%%Gy@oZJ)%8*;X-WtVCRZQ(x^?sd2*o*B1}hiAgE!G-YhLdi}TZ%g;(l-VC1jxw*MM z*qSg4(mMPF@x24@mr6>HIK!50vul*lgI z?dcdE%@I5A)XhW}!TmFIc%x(E#PwoFKbhOKvucIyeV5pdr?}~8P=u=t%we=>%=XOe z06PRNwbL#cY0{J+r${*W>(y{-ZdD7KJ;(U$NxV{4vgj4*S5#4fvzywx7O3;6m-MHP zR>F+$?J>4HHPAcPla`Dtd1$>YP7Y@ieE4CjX8l&zPwnu0uh{ZL9^=PvOnFk!G_h-y zVH%Ib>72`HGRBqCHaAV@TK$@;y(Pu`F1Kh9MwO zE<4*~iNR*bKQ>`wfzJ8<-uzEoG%DXA?M)_0xBOK^BwL7EkTm+QeXDU(`mcPJB18Bi zb93_#VPUUXBs1x5`!I8_x;0hlaUCOCNws-D;+qY(V*C!Lb-|d?D6-gRLxAb>#INTm zOTg*Y;|+VHM+ZZ2cTsoYJ;%pc z5_N@dS3=KYTou=pWGfa7%XGM?37r};n%$#}*ulZj{VsX+5rl}c8CnaM(`%P?C;0p zOeTGdU}5?4&?z>If=w+xGZWRz_2-XyZF4DYw^}C47pvQJLZ!M(XPgrCGG3<;F0(ql zZ+9|K4hFK!bUcWxXH8G&@D@TA(OpSnxUJENDPn@aTbI88wEY~NDyv`6lDY5ddFv5)hA?um%dH1x~6 zDG@lUq_;;TmEc$cFgIx25L=*;A0e7W0(yFr39q7}qH=&2_3PL9TjO~Wkunz_ipCa+ zqX2YJWkFF;UCJ?_9>n%hB0D5K-H9 zpeBQsM9$W&^{Fztif4&3c)Gc{y?pg*qa#*&J!?w_-w?E6>MOP>IxKZWS!X}Kny+hOeUko;2BrFBzwm=bl?B7Q z?cX*XAcXhm(XFz`Xb!b`@j5Z@%{w1I_WC3c+|HH7d>6FS%c($|Cx3rumyjL*$bs3A*EwxV(M~ih*{d1e%^X! zciX8UY-B{ed}}%jz1I|pS}>(-Bvl|{R+{9=QdCm4=}#^@^OFXg=U44pid_VX=ew~x zBY>DhbW=Ig?i=oa2SMn5S9I64KwXcg_*xAS2g5DFL+6?~C+Q7Kn9sbw6IRTBR^Ep+ z^Eu%#2OPdNn?Dn|deu#W1c(y?=0LUEN&06DQpP2Y1UZAV|Es@(-+oB)nVeix>3P1x zRO83-MVLxwV`JM`62z6t;>KOc9i12^3F;|bEX@BlA>qo;-h}J%-#U3}(-tlA#Qc{P z=x%v0i25@oKQ!;+za{a{BTWCMbWxXVvN>(Z$65S zFDi@~N*?(7K^X3n17y+a`nt(##oRy+T^}L#!gd5nOfOOeATT79nCUqVC=v@h{)%1=l=EO$Ljj7K0zw!9=O_<_$Zf zsHjL5oi5-kyM$mBRN-YbGk;tvRmz;q+}GQxaZQ(UQKZF&z1xJ zgkJqt?~2K38_I&?HfU;UHWeRHLA1)X;`yz=+^C#Ieh3Zyl%5_jym8BHqkR6D-o?Gu ze}T{UAw<{nZ%;i^Lht*Ip$WZ2OngTeIW=|Y`XNgR!l~A{8@_DH7x*7%=u%3OZA!}IL2&T7U#WOX1|dEtaD@kG_fe;f^HC8 z_R#1I{U*D2Bh}2$d@f9RZ!-A;&ays~`Jw~wBJh-531X78`AI0zSh0EAsd1TADV7W)FN@ z^c;2ilDP@nay!CsXLsk}u|v8ZtMOr7`#o}&?@w1w&PClG?#(!_?=%rH^M~6*Q8?FK zVgVX3Dvve@h?QYY1g-XyKbrLBZg|ec`s~_6R<;@_YN3rEaEe+l+t(+bUWvk%Z&pNe zpXu}J)<>#IV~EsZ!qRWwmL2}yIM4J+Q)8;e)_Lg(_^1eef*Sb$e}#@O#ePtaqAK)k{q% zo2{o2g?09g6ER3e>2MpUe|awI3C|iR<>Ke(pRRIelknUnaFBp4&oYSnr50=R{BUZ( zuUAo3vO#)ni}|gx$9YLzjO3}Q7kY9-S{J`_?}vY`q%1=De!P5r{66ph)RWjXoNEHk zJ2$==6|oem<@_0fc3)mVnl=}_PppB|&<$4O-J_8QVDLv4ybRH3G0-M2*3HwhvNBi8 zpDK=5&x)X0sl={QVZJ;iZFx?_PDzG)4TSzPbpMC`DF0V&j8VoFCudkeL&NQQ|HR#n z@22VNXG*>+t}JwWO;w~0*d!1|gaAP^nbPE_f2>>lvNOU}uS|aXhtlYU-Sew^|Fib~ zf8o!)qcKHs_TXn%*Zy>OBmtBTVVJTzNqI`SY8#=&4&7LHHV<(;UW&M%QZ|MM2me=dRg>Q(59vvr+8Ri<-(Ck`xN zghgiQ=zOTG-mEUuOVA{TG_vy<=%}h;xM5>Kprx<5t$4x@vJ9~u(#;#E=#@X*L0B2= z>%;Zqu@jm3*uivE&Bz971%(FuQ#4C8lLQ}BGLR5{{Tc(%^|k|gtb*+QULNzQ<{Twj zJ=^=(`~tOYxb(fDP<16aH~5Gfg~ouc9Z8nAYt|`ZN-ZkP%^jWXf5GR|p7HRZ)^NiD z@^pXQkiusVL#lT$n6fk9ki*mxym2s!Px#HG?6EFtbFh$^>Jr~bElYZ^RP3k;RX&UB zPA_?>Gf|Ev3Dh-(#g~Yi{-}&^Ak)2{jK7Bn>*?wF?B6)&)D;6I4CF&CsA#zHPtHGy zqhM1dCns+|=Ad{x^OY|r;D8DhH~m*c-)cU;Se)`-*)Ee=mYO$L^~P7 z)f-eD=|t@Qd1`0(*jX)&T5tk+Faj3E^)TqwEIhO8)c~CR>{7b;XScid24|z=?|&As zOL8k>*-{xjwX_1k$<{X3x7K~m_Q{r4IFFXyhg}BiFfU)Jb#Gt~23)!w8^~#Cd%O21YnOJzOWQu#=ag^|Q1n@`(-torZgmi3N{KZ0W=nLG+O zRDo6r055|COwvU{>OpWpG(GPAmaXX%uPf-&g^tftsdvRqr#~81&;-WC-6_^CA+JS% z2CZ4{AO?A)lHE5jee@40sqNH~tmN?~1rWKy-PZcZnbwJRP#dt;f!)dtiJ>kPLmaG> z{jTIptzGAuqv6p{OHzULT!n*k*yWb#V}A0A;qDevNrq!$#G3t840T(t)(!onoy`m*$CaE^omy+! z(*$gR6jf``>@(2&hBBg*CCIL#DJ7%2$EW(qZ#{$JLMcur9F z79gg|K)PddmNu&_pPH}(-2X)uVq}}# z&hNAyyiqyhkSXS#+@0eaT2;}~t{E%SeucrunYFRDCS#$zBA8h~3&!~FX{2RgeoW$&4L!fJKm=|{j8<}*p?8Z0AprAobF6{ju#7g?0E{Q zNnO2cT`5I7N%1sDxXcbWjcM^UyYPnRYmBFNUSz)nq&+qDuIKIyP|GbwzCTVeYG*x2 znyztX2B-WVt_n>!^;&<@3fgh@nZ5f1xwv-;$_<(k2~ugpE5Ec`;m`? zgp#D7r#F0PR()*0@q-5T?3qL3ywmB<>~IhUzf!L(sHSUpZGGMC^2~L4Wkt+m(`9LZ zhMM{XSOU1SjH&j8wxMa?v*TsASWG{;#l@DcP=t;!yPb@r1i92{FB zS+Avyo8then1VaY_?II_z2{7gt4QT}%D>P>n55DCi_8BHg%$tb59aH68F#smBT`aX zxDQX_H7y7CVe0GwvH-->oKo`iToBWPdj8d(-6fx|e)T>kM^t}Gv+-Vz{{dCa#t`q$ zTO+OiCeg42y!)Q||BKV|wCb{?4XA6sD|AH`4~;5PfOuAIyJrFlN4b}rm4E>|9~%8U zkxMc7;sj{>A7+rN-jWXszgELK@IaBMh6NX>WT;nL-39|vCxckGo-n1qGkLG!Q(~ra zO+hpVS+-ZynC(!d`=k>DkYPu|2A0Wf>$T$Xpp~w!pXxO)a3Do*-#RQD`kNW&g%Yz< z(cXRv#+G4&BWbDq*mo-7k|gVX-POSoMN1Zz2QK0aQx3vFQ<;W4GXvSbz+n8b7Whu% z{p|%%BWzde0aa(H$H@UyjmERW$_&^ppUFj^VN6u(yPH5V;c@ZD1_h@b49x-txNg|s zJ18C+%P{x_wGpr0Vi2@q%tK=gHSWI_1prgU?JwV&&5;Wuv8*weu0NLmgTJZt9lEVi zai!bMXLbUzy1MG3jk3pCY!q1V$ygsu$D1$?So!?an|^|ejf*QPbkN}N0G}{Cw!&zs zIota}zgWAhFD?V0y78(v;3~4|Xpz&!__Z$AFuROioelRjv1+rZ8iDJoeFyv=oNt_2 zqNX*SU%!3@cNvqLrU7lF_3W>Gw$JV@V0xIVvY`OCVpaN}S#P8d@cn}a4-&vMjsN-e zp_{uK2arO&=K0d;0N=5#Wi<_uD~v(4i1tOm6ca>6>{#evQmY046QlN zJn`7ScfC}UlpaH{SHt$D1}%@?EV8Lm57*qLJW{W&sTTA3D+mEsabQ3hqMfQC|I6nA5q38at1OF&eFs0f)EK${n41u@} za;ENEeB4tHEiJQYLM$xgtS{-!?@H-Bg@yL11B!igfaItl7xgY;Llv^%eZ;L(ZX&lR z-Lf?XrvWE+qwPm)R2xVYkUqK20t5#+ngV`bZQVaoDeJ%6vaM=zhT=RM4q5gPzcJNp z%?WrOL6knioC52=q5@%pEx{m8E!OP8&UAMKQ9;3BKn}O?!&0+$iYKZv&W;sXqCZ_K8_6@AY!mi` zKiG@{zFyN{S}S}P0!$It+0FPMSCgDr zCtcIduf3YM{iQmDVI+*}O*E$KIcm~fuZCq_>FM2lYGwk^&+2Fx^F1-KTR@k@_`cg3 zxpGUc(Cb|AM<2EBj;J$uDvV&X%j~Fxoo4)Qpw1R`t4P+`egw~de9oMamMW@s@BkD1DR5>SD5lV0O1a!P2sx|;GprnvL$w# z*cZ~Sc#yo#a*_S8Ion~T`Ii6<$7I19>lXt*hgm%cCH`{--CN$3a3;K zZt~qEkTVSIba%G9Fel(gQkFRXo2BR=J{TfrtZ;aLw^Xdw!Ic)0Rk4%kyvtF<(J7p0 zab7xk4s0>5KxTsG&sSoF9YF#E9|x(Q0h83JL1M8kq{FFu*Tt+x-?eGZdv3R_^PPFs zv;&y)JEzUI$X^;`1pcZ4@2kx9a}Sk( zbc;_*>jawDe&c-Y+j)Y9?rTZseV4G^R3LB>GbMc@8VRU|pi%F(ML->46aqL9k=L;6 zsy+Ls^E*(Bb6zOMfout80O?gk79fEjDFcW{HMUI_@+g}56uHkW_i`-wr^BNf{$oea8ZbCb!J{^v)ld88DkP2^Q;{g}Tnol>L0ScJ@RRKuqVDTE%op#B!V%W&w|v|$Z{iU*#{+A?y?Zmh`Qjqu>@onJux6^^ zp+yPlPp(+18AcEpOk)1>c>JBp{gNTnjWSIk$rI~svV?`Ps{u2%9A*xfhS_XivrW^aJF0tECwKRl4x z06sF^5-${E{-r1LH5WA}^mKP^P1kheS_S-dH2f*^lg8B8WAaa*5^iiRR`3Eh_iKK> zWt{r4oWJGh@~4Z(QML?H*yl8O`{Dtw>FAnp@$|@R@Sz79v%JyVd5$@mJH4=zO=q7rSS=AiUnDTtI5|Hv8?^vYgh6}DZr5RB zuaRnbcZ2#jOjD2e_~IwKV!Dy1m(!YvH&@BSzS?CPAv1M$E}Q#gAU>nb^U-#@9?2k< zjyh{lPUAQ7d^^^5%BfR!pPRd^vcS*^)H2{Es)e`+<~bf3r&xTfTKO%I*dl>vRqj6l z=^7?AlC7;R+1X1*47VKFc@0%sq))uer~h|NPJW%63!xA)br+9ha~SwL`mJu-Wq^sh6w zUJbm{Jq2Y4>?*HeV^{NeQjS%^UT@;!RVo;@}pq3H8H z?yn#nqE%tSjfJK7$rY+1gTv1KKr)OEI^<_zVY%sfqW%2E^CcHi7x=uDl~uLJbc4e= zY}*+@5&6-AQ7Mhz`YvFT)6>(kxj#F#%|-&RGR1u&c7gU#W~UAKilF_kR3MedWn}b6 zV=8P<{?;)_`zFfbUerK`O+Xk1G<3jxSROoR#Qsp&^gYqm0@s8%L--aWT%%JIk9ae- zf31DX!|h@~UmCm2X*XHi`}qdu+;@u~Y#Xjx=@xU@zeCNH_?Su&Op+Vd(+u!gtCL|^ zMy20*H4)uN4!{nsrw%N@R0ag|@z1WMgVm7|1rfW4TDJWt!`^{D77&gA%fM}{?W%VB z_pOxvlkUZX0J%J4-|_mVSKP?A5JPVh|E?WUE(6?{1vazx4N2&{FaKAx7`df`} zwDtUvyE}sQ1;K`RGBS``JUmZ%)#!ixa&80WwR&L>9jlUqD#^b9LeP)qTYDQB@YUDs zPy74REkVM@iCM;#Z-e=e9XrOmuX$g8-^7dqOLxOMe$>(g%(K z>bxyskQ zEBWT0LJZRi(1RYbKB@}9-TzBj!mPJ4o9336qk#V^LNES#|eT<3tqC32+$3+cV5EO;nSW%PC)9&vF#)nla zMm0@1*dL8LTKiO?UwdW=0V60 zO8UoLeE=CFkS~AkVfY|3(*6FlDZ_RwA2CA?kj2ZGN+06>06tjwC+qF zLYx&-^zf@hZp}~t#!b(%w4*@ku*$&kXSc4+Sn?k5y@ViZeaUMV+rUnl9S6ZB*56LH zz$*>z8n4ie1r2Sb>|?^UbflA!M2|kX_Uq5i0&>WJxeu&leCb`PrM4e(5J3lZ;BNZv zkAKRqb?~9}nwO5qeeeQ^!bN&jI4~J5qvQJ!5_oWs$mvQKeYq_vyX9I(oIav<*&H!v zAd#3a-)&!##no?sJpk+pS4|H4`I!S3A70L1_8%Z^#~|jGSdqfhVNrF5p1uS4X7{(} z@Ehe7k_v!PhC5qOSctz+BD7gR4-yLZ0lkZgQWkcYA)nektSZBd9wYVq#Vu3$uqRgPu!rJ5;@M`^9JZK@Rg$dG=#}7FrG5}%${#*0e9`>g6 zn$_+l3fPXIiBkm{h7zwA+z`1LL;Je=t91Ojmpc0fP`q?O){m|+D=TZTFvnjOUS9@C z;4+w|INNhfq;S*@h(9JMDynqa)ByI>RIRD7+lH?=g1`xW7jhaNo6OC# z0xC)jxH}!8bIQ-3FW{RmzC*v!DKjB_3g~v44D^Lr=HlK)@FewExno9i>>UE)PGm27 zptLKR?$`GrwGfb$o=%-g*!DqDvu9vn^@tb2a^S$i$G3JH#BKIaNAnlNAit2- zp%BCW?gH+xP|doT8c7|X-1~`@XJTI4VKWIhIKGVkHxIB4dqYu9<#!=Diw6kTLlosz LpO-%~d;fm`LfU+I diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.svg deleted file mode 100644 index 01b4adc0..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/SimpleFilter.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.afdesign deleted file mode 100644 index 3eecb4faddfda0e71d055f7e0a00614de990438a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51791 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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.svg deleted file mode 100644 index e0e1896f..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/SmallKnob.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.afdesign deleted file mode 100644 index 2c694a3da23dc4c7601b3b2de3d12c61bbf7e7b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21987 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%0AHUEfDaIyZ(u))Bs z;0Ju680ZqYd3xsL=H5*e9xrxo761?VC0>))TuOjPVY1dKS#n$6|vRZlnS z5}V z&p;sr@J2v^nf!$qjD%L_UGiVL65IBGvFL0!*Ln7LI5}LddJ0{8VDP7=rd}2o-~5jH zySiE(T(Xd`u#>m1!s6RV37uh~!wD*f1qkv1D^TirP|y*e0s@K5jUgU;?NDpx zi)XQF^T$PIV7(7=NFm?o!_vFr8ECoWU7o+C0zpSrzqJ(zd6xqPX<=bO?(Q~&&>$#C z9jJDzq|rmX>@V{2fM|ERawYQJyFWgD^v&CvB~hdp8;wgehYH3?M;?N4V!>3Nd}x&} zyY3EX(5RW2qiVY5$JRq;YW&z%=V~&b+dgn-d@&F(?Cjdw^s=(DF$Oe)FI>EM#mE@Y zeo##)Lo!Du^MOlX{=i_SCvdk;$O;gaw%$3{u2H3V2?YP>gHDh3lGwoTf*>UEH$*7I zO7bHa;tS%~`i6pn^p1$&zFMDREqtGZqN11j0Vx?7NkzqZlQ7tX$zi5FGQTAoK9HW5 ztd~>UAtFo0YB8gB!s!O=pZt#cW>B)z_> zxE?7F9|fX?%LBOSpjC9Rw4y9gUd^Y3xG0^uHRRZqIscmZ$jhh( zp14Ty-x?li1P8?b>C_XIw*{n7D+v2=eD(!MgCl@3j%yIeQp8k#i?MCB@-e z5Ag413QkG+atMSoShtL!6nQ;B>H1S11OYnQhy@`Esb$qDme5<{iU}AZ#sP>Gd}puC zm$ol{qq#|-ig5BjM@au*!G+3#I?M&|dmy+_18zZ#GLF|_ow`J~y5NWea=cH3^Sqg7 zd+04+C`mdTK|!-xAs<<9{*M&F3KPyn~H_RC1A?ORT?e_9IoZ8 z1@D&0)6lW3^;&zB%?a<-Av<#S#XjDw!PLTtgSFmkCrdM`8=u9B#?;WzVO(1{s9Ba_ z_8DA2QFM)5?uNyXX{6~k!IfK@o_*vNQOt>QN4u}S%bGqfpro&%u(ANJo?g>YEED}x zEhDE}V>{y9jGx%D7?%KWZ1{Lo1KaDm#rD=#!=0Yrn@eVKYgjC!cUW+fw#?lXS{Cs? zg?UFU-pw0zp0$*<5jAAj6@ZD?rl3jlXuQYm7XV*is=Tf=RRWjd-uYA%l213Co0%&~ zqMTfAc1dr{_}1o0&Tuh@?f!Fcu~onJK2#`AAd6JUh%4ZBpwxV&((w@x=1=XdD= zm=8ah%EY7RGRJ*;_;)W7M82ShchGrudSDz@z}9jf`*VfdBlEqZ!`)xK3NKEx?gM2a z$TCWnd8*mr@E{}ytNTzjUEA!A2n4hrYm}7TkE++5a&wT~D1XQsz8@A(?V%xy_O7Ca zZdayIv!N2-U9r2!;lG8NokWBG2tJKX+IvCpDXM^QIHXz?_Fq!XW1yzcSvW?CAgQi$ z+zPj_;4kvPUH;y`qr2kx`AgQGE>9kuP*;8bp-mfx^37k`nWdys9gfmS|NtUbRRxKLVh^|r^sWxB9?VIc?} zbDmO6{O%Pg>xesFyON%r;8Q~5_9d3bLv>1?vbPF@)~uo}g&gM{g?0#sY;3{rQw#jDE zl_TDG)!7pHbY^$yBPl4=5uHsL#>FAU=o_d1zyHEU%9!5_Fk^lf;Q#Jkwm%qb*S)Y? UtrEiTVRVFn{<+g7r!L?57bg@yu>b%7 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.svg deleted file mode 100644 index 83fd938e..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/Switch0.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/Switch1.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/Switch1.afdesign deleted file mode 100644 index a4325846ffa42bb7d3f3b9ab445627b70ef725fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21429 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 z 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 ZV{v>M1Z9if*YMd - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.afdesign deleted file mode 100644 index 12db062535e42b49a69b4c5a9fd706bc9afed382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52334 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 *m+Kb9CAM-*o_(wf=p5Q zLw5mhAGTNxq*7>P+)gSS1M5M}oiGfVhqLGN#adSucX#)?%=H{m7+_8M{JNMubfcM2q~o03w0AqZp+cm96GEjc-~&HL2j6}Lgble=R{yzjonw#Hl@;Cg z_1cj0_V>)MMPAGFt#<3}x;~G)CMG6QJuF950P@h*#s{!HrJ!I|!nG> zLvHRR6DzI-Eb4SQ381mHzVAM7K<215>iLPE)Sk)b9InW1w+C3O#dI_0YO`~m=<{9k z$gIU`GpE!3h|zRWR*l1SA^tXOfNdvsf$Hy`&4;NGA$)jgP=F8}C)5KB_4!s3VA(Un zEGTaKt$?NwP5kAbf0oZyr=sBF?F}IJNvW%2YiVh5l&ey!h5jrA2DRcaK=h$h)mhEg zxSVQ_Wt6&`uHY$Vr3FG`hCw0P>hy;o zP;m2=4{ESBq;PM7QQfDlMIW29vSXoXI;&0#3>mFB}Z2FXn-q|k2ibj~nU zGU3p8lIWnoMzg0%@VzuVNf8n71RD9=1Qh|_aUf~(dYs@6#E`i92)IPH@|BU;&Q}n9 zY#MNconfQ|725&q0r!gs2f#V^01e7|p~@eLfa_vfQE>LDEm&Oq{hRhP?TJz!`a=d?fi}nv!rPlykea$bBP9u7vOq!w%(8Z0z`iwBe=`>zeV5?Ug2{X8DK1i5v(#JUm2PRzD!1 zS#zZ^&tv800M7C;B83b-hiQ54YR`MydfU~1fZLaHoV5=Q4UqwCghaOu66?gJg`G@F zj|hrdpZdYj)p1!%C~C6+QlChLasm-1diDv3`^!?3P9J@7Vb9Bdow_=OXqiwuWWw`2h^ym+j)a$RVz_hX=yk> zM&G+RoYo%)Y6qoO3;KP%y@qw#-ccA z&8x&EB;sRZg=}prSgx~EA>IMB1mIhp095@p0Id5Zs!-TRKh7^nn$>BC#l*~ec|^y= z6ali<$3n52kKr~$(g+A-&djI+`j@b!<)7y~wNmxJ-zP=zJ;}P$`@WI!@}}(UnEXU0 zg6ByH_)yLOz;HG27)n27nC#o&y2SVvp?AHbt{-LEKt#Jn|A@-_XlYxLIE zxA2Gvfbr+#=l8xk_w5%K(*mWRF9Lwv7#b0g2eAG8!a{tuOqw8A8^G9qGwDp#n97dM zUteAE0Gj&Z;v!J?@qDFaWbCzVz(7M&-gVloB;d3Z1Cq`PiF_)DL&rUlfLAgg`Yz{f z#EzO#eEJjz0ENeR$XcC4g3+h|0MOMX{1@Xv<~;jHjX}L!yRYqj?YKI=%d)Q76I@2tO7DpTskJ1r zd1=%BWx3exnB6GOr5b4@aM+L0&tSFYg<}O;}MKzX6#p{_|O* z=$~CUGRQGr#g6CI^Twy6Qci<=3OJDFrbi{V05Dt_nUbc1iHG$c)AA#kUvz#i!jXwl z0Xqjw(qWjX;d}d;Ir;_6yi$2F0Lbfm1pdikQDDSx~QFjB2mtfRx9zH6t$xiKp8KE!6r6_>r(py(>?)gwv9kXhC zuib0@_VW0jPLM5ux6f=U3Z3bz6zFDk#uvH)*2FARa@Gm+P*q?jZsS|N>jjW5^R3=6 zXffI#RHTFk%Fb`qZmTBpqJ7K(tGCfCy3*i)18IYf?aw&%^1}6A|Kh&`*iCwyB?uKd znbim!Xn)V69|!sUv>`W#cP!ISwQUuQUjQV_Hguqh;C=`C z8cF`tv+X92Vurs2ZpTo7|I&Vd#0T8JXwQ6mth3z2>C6eNpTEU)As%WDsz~U+incrL z(agEjpJtplJxyX&!t*9}Rd9YP|G>+j`=1@#8-}QRLQu@tTHRIFG+@aBfH|<*t?~av zAvwF$mQSeVGyyBswGj@SF~k6EaCJHfNdpd(zUP<##8pQ?jDO<0qYOe7f%&MzoHa+Z zdw=W_1x3?GfW5Tcoz_*J*ikOLJXRDa`+`K$ak~I!ZKVObs5n&{HV5OXUW9WSy z95NHc(m1X9uXcwmW{Ts$(BR2}E+he8(rowQ1=uZdr8`0UENWn_wjm6#DW*u&KvPbr zwZ4$LH?A~!Cqz0R`tA-VCB(;n6ABUmES#K*Dj2xn>Aiket)%3%p;w@a0kl*@BLCPP ze+{tlu3Sr?$Ot42;@T%0E&^Z;K&Q(M+|*KJL8#7i6?&hE-8R5t`q!2{n{ihCH1upF z+U7~oL56tt)hsj~!`L{CnnLGmDiYeTWFl$+HF+Gh^VxP-(W$J!Ndn2F+w&rHvZ`6YBtb@-L3a_wnrLZ)9C*54z>_l6n5-y zIt{j?A9U7$CKl)d77VDAd!DyxIJsw&FhFei`!W=u-$b*h&I|+lxO8dvzRJz=S9_OlEFqaI3birf=&}ID#+*I(PXUYIMKz1avQE3{{q5Oe z_RlZnOE|J1R?SlN@jRxm@=42=zbqz0ayXbJOzK=P&^7Z;bBAY4;ZGx+Zx z8z~=|n769FzO4&vF8207jCpqu9PvP2Zf5y zky=__f^#Gf4&sM*t9UN%*HJ45G(cESe^z5dB0|18Q(pKMqy) z#%FRE+cOGaDNGmG|LDa)6T;^`vA z>z4J`Xdpw>0{F1D2Tf!;^NZ)la5URIIGdW9%t9zQ^7HfUfx4qR;k}bUr;SX>WHYo` ze3c@wyrT}xkELp=s)>7z??7}P8X1}4WkV|lX7#rI{_KlL$P!hWfd&utM}!QzmWq<{V>Qkiw~_I= zZ4o;GRPvEcn_lmh7dw1AhS0)~%*N8C0fhG@+VhxfE*AcUcjXu&$Qc|o0%n;}b8Zt! z^XZdv|Es7RK)HZY6w3!k01O){J!+&(tM-Ew0Iv~n@^(*5RvSy!iULxD3oKa|5GlPL z>@$6yEC9t}-=`AbT{PV5UhL!i*NFS$S=_ub%3VNkdtQIf1YQDB<2~E=@`LLfmFUG` zG)eBSnD`I>l1V9Rs;l#7odsRMyEgj^GWR)-mLfY-EMiq+EjY$ z^u+Da?C=Sy2>DMXpd3Ar&g-Pvy1c(auqnz_@gfZdaSI!-NxEoX&X_zkEY+xW_FiWOc^J-0w z`RAgdBB$5ec>=Vgiyq)nT0rp}pxUOus}p|L>n9%y8X)P)W$?|;d#obG_kA-0-nb}S z^#%TIclpI71%Ok)oUcdN$3IlA`^%4tCz{!PE$=*aW;C7#_&Z-@`=CJJd_w~7RkODg8iu-;BoBNOn!T+P_y925E|NqamWoITc zrN~NFvUyusl@-~EkiAm4MMZW}Mj0V{mQ5}xQdVY0c2+jo_x_%z&+q&Gr}w)z_nz}Q zuh(-t#`8$I@LaqY4@LFWn>VSIVDsEtt{60}^%j5{^und)HTTU9>E0^0@$~U3tHz*F zD36pI-9X``GgH-gBpf6EH?giYD>pX`T^{sezMf4>JZVkrP+@lCgJYaVRb#(X{{!rn z?NynV$7l;6Zue9BH@))W9(&MjqdC4>+tJ`^sWc1s$WXbP#>`f(*H?8@#0NKg3BpN}}3_TWdL z3zQy(R*k7>EmESx=`-K`aA!O?&AFsuVC}xe{pE^6^D4bB_@y?d3URwH)KV@(I6$j0 zb0k9v=S{@#ZQO#+!^tz0X0R=e?}VIxX{$$3>Mc>Tsp*z20|u$3@tghl2kg~@>~)Zg z8LGy7QzCC9-vUSnmBK)`gLDRGqN*B?=`TqfH;(9G>w_q!dg|Hv-K}2zpB2umb$+Y= z^j1q~qyF-xdO(0IgrN+9Pc++CL3*Vxw@$)p_25DTt0+I9T3reUk$@tt!;WzWav8e5 z5P&YLmn%nh0eu5$Rk5d>h)Cxk;Yx49HBpe+?9fmdYS_du=y5z5Ao^FGf_5E(u*cVkgdBa)%&rapd%_>$Rn}yc|J0{&jAIQ(UpCB?N z>KiumH*dVRko`*hRvSIv)Nx4}?|FL2N+mybt%8rXAx^2Y2lL*1ajky+%gLL8+x;tc zkR)y4!5xC;iC=v{jOK*6npf^njNrp%?9=V&Zxp;~a6@EM)9Q+576d4I%0HJ-0$9)* z#=y6`SWtq@xkl*AZ!^)!Z^bHZS3Y*6hjQvhrOOHUTu;RolrK|t9Z{64+ zIotWp2BHV~{I_1hw_yKM3b=a~goYi(1c+N-{T=B!0X2giv))KJXk4)aHI8*hvgC)m zBLgjMp%mPlvfdLFgO&y5`F7CxpXq81(N^OU%MQS& z|16bDFknFy<5YZVGn3W&9Q|{j_o^aLc4Q+ld!DX3I+3mAk-!FaJdakfg5Lh7$7kkx zXi%|Uq+b9K?0_9`)&j3Gk5a>+9ZE!l&Da_$F1zW~AvyE=$)V?FsdO;@fvs)6tAg|U zpK{Ut6Tvs{nrl+lkRYbVP7nA#uj0mo0z*?J#H@X_C=_@t{ZytB32tVZ6GG? z_R1Zf#&g+;G9GV#*@SBc9jeD9EvZnrH<*mQdbRb2 z)Qbz9(VUmrF8d0R({Yi!J`-pko<`p^2qnir;SJTn;!eun2Ro|{&;tJX)i46rE($ax z6b6fBQ$j%F4%+Bbl@9k0JPw7=#^&vct#^$aj|2p`j&PCUC~)KJ*<1GZHFfM4frp+` zBnW&GR!KY!O$*Q>Ns*D%NHpNZ5VU{R-+TWxuHOn|2WQTo|2FLpwRFkJ4jR(p?#sos z$HE~~F%!$Je5-+7$@L#wveeynAPS=>bP>1ubutqRA7-F7kVwwUFB=bMMX%XhrHDVn z&%ZGhAu0~Z8S(V=OqBHzT&>@XM!yAudlodSM$vF`gI~T;TyfgeVLeWXl+x!`aQ_^k zy9c_5A8aRPKt*-&y+hZ#>S{JD{QPdL^CURU5cVc#5CPS=F(_O z?=c!<3Uad|&g8(;RZT6lwOp}oOeE!KzA!5*6v}6lypCzmG1tcIC_srZS`N@Z8~tr(d1(IeK~3F=qKHT|+Hd3^P%``m zlJK(?Vc%p&wGZyQt3BboZghT7&F^GqO`Srs2H<1%-V3eqnxwFK-`+-U5_^|G(eqxg z1Vn$wj~|Z=D^LyqQP?OW9w5TCZ?qP zx*chek+Y>YdGWwy5i1h;f1N)0gG(mP768=>CyCiSV#tux1OiQVXVi;sLZ=!6r|=kF zrSBq?b3SMH5LA-9Ts1Cr;qAWt;qLlM!wJDnyRTcs#g!Lwzt3Y5Y5iAn)0Lfnjzfrh zU~!w*X&vfFF~60YJBbsY=oEz*@u9gn5b&x&bbvU#!KS!S%&9A!@#j+^&p69C60?!3g@c(m-M8?8;jKn?fmtypCIhtqumhw%!@Cx=F5-s5|h z{j24N>8?(UAJEW3BlLIfK9JO?B*fDN_?y=Xfo5IZ>@R>$^8Czf;=b4?fU7C%BBqn$ zVaA6#@&Kd)OYP;x<9)d6QCvNBY)3DxIoP2qbrxkXjbU@XE8*-6K^`D~LF>Z#CJJ)``nZV54(b)OusAp~bohh1)gpYT6IOS+e{HvQs;(^NF;8+*%>_+AFsg zHdq`;J=}rGSqJ$(ad+iibNv2bV>?T`iiA5b98(}iOu0`v0=X?o+AX#9e({=K>k8qR z0IptXdgJjVCDvKa&W2~Oo1F|TlZk6?g=_%QR(<7=|IC?n2*}T&<@7XE2{VXIPHv|X ztvATNwZ<1CXX|M=sR|#|&O&M@q9hi86q7$EuE7q_dBH+IyjkAl54fNI?<5DrA$+_M zzg>dXR5Q5{(z2jUHj<(<10aDrXgA~Q)yL#Tm6}gUcusKpwbO)Vz!km9yiC*(Js^f# z0di=;_6~i}{=(Uy&6M$KLcQ(hV|lBhq1}CTer_*C2|f|~0GFqmd8RniVei!13vk$P)iRhtJ!s!#3KLq7o z_Wjenw6Wa@$Lu?NGG^{J586(DWuWA3ZkqZWvG8lG#$*HtjQp)*Vfi11c{mx7?lPKw zTT{q1i*(e3O95s#a!(_}XnlwV5CnpZKcwOCurM+7dSt?$J)6=G-jBbpfXg>37%H_1 zffeH~lG2>xif7Qyqm~ynO^TC8YHy2xLPVSnM-IF67NA-yii9r0A>G~K4;L<+;#I2# zGEg<)ECJ+zo}g-G_X=yC5Zi|5_ zrGVqK{Q3EQY#J{;>P`$NOzPitwYRrVLDP+y0DwoFJ3SemWs}|EczRlwVfKrz`}4b> za=EbPQPq{-iF1F#hH0+6JAwe!H4S{4)Frqg8DM7)<_C&SB5A?+OK30rmEmzTPb9&l zbkgOzPtJY5q8Cm?qggvXn2z#_%YG{oQ^qz9(C^7@_gzQ8q_df$cog2&mcAk+5Sr@% zZASqh7}MN@wqX1wcYNkCn*KV1a$VGque#cKUjnT9!nm+04`qmpzu_>%VG#uZ3r7b# zCp`*EHy{t(k36_i#?2ebCF}dA4f*KpPa==Zi;Ts|X^37c&MZRvZ{2cN_16=cljzRFoY-MiVLQ*y z|0E|hpk1EZ8fp@k;SXPDa=&Nv|2C9+P22gs#YxiTaYOOlLf5N;*=EFc+qIVV^0j_B z9(HqwMiII|fZ6Ovttf2HWivq!jCs9@L2D$)7`oAdyH45&^tOMB zvmCMCZr&{t+0wawd*OjR0ufu4jLw%(1BD#doJ0!=dKnzD-V|8y7P6fF){+`R%_>1Z$r z2v&Y!kCD@ItPRD~D2!COrQQE(1ri3xzcJ|1Wq1-q%x$U&10FCdLrw0)FyAv00SC6MD9X*U%zfdq^qUGL>QbJJ^Sk5^!mD6*^Q9Y+CPsVdC}4b)Z0ih}VI{+e80z z*>@*Y344E~rZrP4DA0R<>rRXvDzTjlaQ@^ic2ywZ`22rc^O$N(cZCc_2^5hH_qV~P z5g@75jn~L?;|kom3f%!M4*KOQqN0j$m?)k=%YbHE+}^Fjr;3M7GhvZA{R55_S_u5E zxYM0VPKS|`vDo9tpjzn9hh!ONAmk4&B;;WOi0oH+Uf%7lEjTCUcG#`^qxltHlZm?&&0nf1U{orJpi^Zn)yU zCa6F<0B`vM_ng^3&@vElAB-YSStTc{5eFyNGIIk1;d?-LI6 zW~P-cNnaUGWCoZ|-#u(BrwZ8NhhGnKXJ=5-#R3IeK(uRF0_~8px3_oEoDm^o?)UF& zhK9G)G~ew(Kf4Q1G_B0j|6J>qrQ-RHt5B?>FuUKIf6X1Zta@j{wu~$-SAGRFsOU}; zm?2az*o@*4AJ>Sb7qClhvEe=qcXS`T5z9z8&BVks&l!COlotg$?|`nj0JS{7#+gw1 zUy@FJZ5GM(;MaRh#aeq-bdVg(bzH$|x#z|MCY+OpxYEP5^M=!sCHpGKt*O)RJ3~dQ z28N>tvL?_e(eZ>CGDjg28lRtEII?1!Im|i_6;{!a<^meY-h3;JdDRI_3Gk!aM_Y6#Ps^Cepb}P_q!|41 zU}^sc6@42$B6F6y(rw(bH7uw>qOyZj{c8 z0tT%vqael$$yYow=}do2e`*w%bhsm#3-RN-s z>3ZL2oPK~->@VzIQtTQh!Npb(d=`%PBr{u?ndNK9yvwUkxIO#*2Iwc^ zKHKJPSQ^(ny~uH=Un2M0F=67T82(+a@-C><+n>BYEGc%8Iytsvz^iqhaWngob?$Jj z&w21_5v79^lA2wj4L$6q+`;(gaQu%1J1jdZsV z{GA50@?<4P%_y;rpC~f2_J{xoiv_yJ z2jh>lkT3h(SC$3ERfGF;xUc}Wtb>RH>1?0}B+X%|}q8q`5C+&>CqTZUGwT71eDyjZ>>jpten@oI>BbpVIvK#mK9xpC_qsPG}7^^71?6cT1 z-;?=ouWm^P9r_Pf-lf7NOF9qzBh>ap!M`|-DJqsnphg18nO00`{x=}VcV^YB?jzo5 zhva>CHmn{mQewwkrJWk>Rl&;9Zo%ukGFqda5YD7Ras8)@6d=Y_G7i0p0Os&(%qT{D zo?1^op?P#7q>`d?!Y*am**Ww6PUC0W3@_xT{&wMcj#dI4hYUvnf7btL0njT#9Knmo z$iG|hNEM!a`wM~Vn!38A6KRCQvtUkva+I);gm_$4~~;2 z%Y?=Jn7UBA9RgtSbHx_!AZTH$5K;qzT}4fe#OwEW%xjuC_$Y^Xz74Bw$ifQAB~#PW zW0Y~7>gTha?v4j8VCKmssN_=fiSF%_w{?6g*q93q4aF9-xf#snvP;X+w^+UDja@$h_Z#D%&B{z;cQ=b0-+)@>V&N|n{ZLV_D@ zwb!m)Bcc(=RoI{B1KSX#5-3uErRLWF)y0>H@Nk<^nYowZV0-mpRia}3`t_?3{-&9k zc2H2zn-bRfPwq5Mck6Vu5Xfqdy|q4X8Wln3HEp^b{K8-dXo0%MRB`)f;c*naYVJls zT?L1hY|xCd7fF3JLAwhlip!-WxQc_cE~Cc}vSod#9j8<~YrMExn*}g!ot?L#Vu!e= zsjn{$RevZ&Djb!bce*DL5Hnn{tl%9pc-Id@VX-72D(MFKtCGsbZEOL}PJSg9R$1Zo zbd^#qLHXb*ryeB^N@gt^8(t*-tp3Yph~8wVWE}!H0!&yJsG;wAs(tLOBS+FBE__0a zt*!5#?VC|Kvh_ITy~iC&pjVm|DFM_!i7lL7B{B092H72K#M|4R#`icm6D?p62L_oC zE)r*#PtI46C-ZC+NM2qZv>D{yG({vlH~BFuAoCP9uS8;#lC+@7{kQKQmB6V4?J+AB z$hCi6C`X)IwCmC-3kIYlVJG(Wqb@As*@Z@SSj!6qjv=o$lT*TLU zk_mw@NcZzC95@~XSEDk7fKA!s1v_^%35y1 z=jA%Qu$xtbQ9*x?Nc*CxU z)R15S$VTP;u+McNujU`t01|l7p^MDB1A38@Ml=J?=9brq(hqinBl`NV(tj?2Il1+M zd;s$!Ru<@ht zKGv(vwvB!)xL$>V!52j)Q$KA({wDoUqgU!!aR~&*bi1{8Eh-qie_IhDA4rLo3I=O) zX@f5n34KeKPw?4>hA95c8yXxajP0kPAjR#?n3pjwLI<%2w69Kdt}jHq;vXvyyQg_? zs5)oA`2D!y3{tC@Y9_>@8i2Oqj-YwM4N98L77HgGfh4Oj|1gz}_7ehyG1szQx+*g9 zKvT+5rS5jhiZG@-kO)nR#Fhjr1A~dO(PkXcv07C7xHMQoo(^6C@1=o`e`&)zD<`L} zu79w|d~QXU#=ie42DY%itE;QhppK?yIuKGAi%(P?Qe)<@n)|`>srZUo(`K7P0uZ)P zgp$O54F(n5o6oi$jnXVEEVVn@l=fzy5Hqj7L;G$ytWHq~7YaBL&FAfmZSP*;ln>~e zHkFAaxQ$l#9BqT6#mV+GENU_o(zE#5jr+HAe>mO$FnlifgaloBj#CyQzDD?R=)MIhm4{B&$D<;i?U-bP zxv-kA@7`yIWF*?K%E8IWxu(_t7MmEe9tc0YR#$={TfO$CvAA{H>2EVcmJlHMM_1z@ z8vh36$8R#j2=F}AR7n)OZw*}lhbK|3D~LLvlSLOMrc(YKrBcd35pim+AD|g%vBSM&hWE3g4U(_WU`vQBEcmVJ#=0H z@K+M!o%S&HZCP-+A{;vzip^k-)rxHj<2tHs$pa1Ydioituu~J zEUc_^7f!5!%6VpXmekuqo(o7yBW)uAaf1eO9^KW;!^^(UpFbz6{nGW6?mh?Ac202a z@R6ebnl&RI)P8FQdkx|oPcZpi#8}*Y4E$v2h`jOgLWcH9D|t+J!-1lJ0A)eNJ6&?; z9LbXs9LKTkjrHPq*zXk(?N88dBOiv}Dw&9x77bvzUpM6b_;NB8A(4G~6~>Iv(P|{v z`PRL$Z1AQtGJ$;d047Ob-ygc=(t%V^?Hs7ZJxu(^fG}!ZEHUT>>JhZl`5Xrxgdo4| z!CG-gw)8I~N;}NRL;M+9E?G6yB8}SA`S|(y)0f!q0;Pz8#Q&}apX=ZCy|eQ-#Cpj~ z$;tnzsrhfM!P>l6#91OC{6xlgAnQW;W_I+SJV`S0=V#sE^w58-7EIleA<6>;h(Ke8 zL0!~OZLnaC@aO1tsyk$upSdUc!{V;IK?QmG8TujLKz5?9w%XcPJPeocG0?w8kX1~* z8UV?HH4ceK3+c71d*QMi{6v3O$Hy~G_Hp66p?A0hxWux*SHU|NmKSS_==t5;HNtTkFrGbo_LKXz8eFen#!PDDiN(%WPZeFJ+R zE7%GbvFAa+%UWIJ<$YLPU9F_r`{UzOL_4JtdBf^)N3!>R;|ei$KuFWgCpVS)EExl& zf?2?`Lam?czxuta%K_GoU*r1aA{%T&#wF?r*CiTV#W0+JE1XDAw9V&UZMfa69? z^Ub{+53*Py#^`M%f5)GDcj4^LCu<9m+VE7?WJ;y`4XZyOtqkjLOp!nRWOw4f+qd7f zdPW$0fN==8n!FHWC=NpDC6~q<8xNM;KJI;K(R^T6HF84M+cCioS|yAwnS|q>|G_g+ z>Sc`MaU~*yo-kt;+A#tG2nO*)p)=>nlg^$Jup&VabVon6F|X!j=sB}lw|2hq`Dn>Q z*CR=xN2g@*{#9mcw8z#^nP4kabu29J7pSPH#!j-LL1@Mi>hT9g^-os@GfMTu(1T~U zGjcsg&m%Y5oP>OX-Xi2Lvz004#Wi2*A(GtUpAiGS1mH5G@}mk1VCGFvLr4OQDWbUQ z$Gn;W&yVAW%`5p#pd5iYk&AY&xbsmgmpr|wpu=wm`9S6p@QYVgHW_TYjg6v&!+SA5 z32+Ed`wnw*hM=F3&wTnp?lbyY0Z{hui5I-JDLACB(6=)(J;#3Wc4X^KNmzgI08H;x zK-IO_7d_BS_JJtZKWm^NJKy&En;7zN405d)0X*^rc0J2Kvr-vYke8piPOt52tZQc$F3<~Rx$ z?UaEV2DKng$O=(GPPhQ2VgE%n_sTuR6EBfI`@=?PvftGC-s4CETAPcP^uJjlBbZ3z z0=hE@KyfK4SM>DsqNd*gvw0*BYnA-j_>b>p=+sx)!xqLYV>}Y`8jJ5((1-4|P)D`#_xYq_#%ZB|eMCCw@N@e?NXSsm5>R#m=VO zfza!unmIN8o%)>@J2DqZt*@k+kEJVz)c?*4nU=v{83vti$sOr+%YX(hAj%KF#$zRg z??9{BQ);8Cb?+h(5fMEHhtPgvIZly|+?N8Ff&qMex=(hdifEV!d)ueJM<7~VnDvC}uk9sYd*~Y89tg@C z1qCU9>J-zxrg+uZ-u_InRbw=KJTjms2awa`>FCZ zW6p_+YJjc^$WahrnK&cLVFl0@Ml|C0BM2X*o%%GF`L)ndEntQ@1tKd^puuo}|1Wgs zR;rj|Qi!DeFfDC?J{s&D9vpwUWq8hUOSvSPjF~#()6R9cNb#LLOa4m4LIrF;66`dP zNxDHx0Tz1GfzHNv>FGT1uWV480cr9`JyRLRkFeQ+r744xREbRHT44qCk_ZC6>jOTifsgmWaM4_| zId{fNHDg<<46DM2z;8X@5%J`BN=#07tX(6TW5H)Lf(Ze0H;i85bTKfX2glAsII%|Y zc6TbwV4N8`t>#dr2rM5|EE~tCo-OWNGtnRPs+yRvmIG1aqYW50qRn*y!r?UQpY}Fc zqHe%W#gKCTLOL3ng!;D0!?fVH>80JpLh!TzK#6^?<$6^faU83y2%zCr$WBj3l9H0d zQaT*F(=qVnlUJYGl9H37K2r2=0FDRR^AYf86)FEc2$haOkbxGZ%8N8EXsY}>dPys7 z&{0DBG_lhVd~Y{$PK+SBjc`PKzP8lccy??etGo#9iPma+sHX18M1KMmQmna;h&mia z2;}ctda>VNQ+ET$5%k&9)l~#&xxHJep)v*F1v(U~l_o>XidX;-jUd zjjQ0B2tPj=%!%uElz^;jeCi?Px@zTBEV#k$&D!>YOb2EhH5KdR^lB;ar9Tv>dr_7j zg}hkW9;$OoOF#VSkhYzlK#&4&-63oIZ$fwhWZtW$rWEiEP_La$avMh2kal*p1MxB`>fg-`t|+?Ve^sYlAx``$qx zjEBPsC!*A|mVa5SI(<iP#z?5kVWyVu7Gjk^(-*HQMH_*6&AMi7nop7 ztC|CPqsj`l)7IRoW3HI-G8yoEg;IXFPuV5s22ljZs(Sb0HEg zLk6E;(!2Q_?fbA%laY{;@+v6&a_D>x`ii+tlA9%QD=G8>`Qz6cd`NJ=!Q{%k6$hb6 zCg6{0QQCSj1J>*<^BcXh$s0THv)?t^ z7XHZSaWnwTr@^ws*DH*5JzD_51$*o-f z{%BrdtY3}O;8F%v!ECW5b3f}l14M}%8!#0dev{`|5)0aX>1(Ey3_>#miCLy)0@)*C3Psb_*$o!?>3 zW=YxD*c=wKSsg=~KYdzS^aJ1Tk7)Dgg5>^uU5R>w9_nG;tO-qnKKPlqZ>1qm$ z5|*!MeIlp{Mo;gqMkz+I{|qvIqo?tdltBxYxskr}6}*qpas1;yN?v)7`>fuCXMijs zdJ;oHO|ACdf27x>?;fv5?Kt%yob@!xlMSwqV;r2{4oK{{?O0(}B1dSx(bUugY4Xu$ zTjhKAYKA*_E#C%A%sZpQ@kWCVmLF{ZmINUE&Ai7O?U9J11bde2@adtF6R`CGrP`ZO zIm?dWi7prB*lt~oTz2^TyU?|z!Dak}6*cm~O!yZ}g;4&|=-I#p>zAN??A>bB8-T>bkoPNXW>VZ;5BTeXFwkn_hI{ z+jT?=Bm(L&T=FEd5P`2w$szYN5Xcc~7g;3TesM6K)!RxM{VfRs0>Ji=wXU2?Q^0ci zg^}H@{wH#W=W4CDW_}p-+D6z?$glG zwE}rnzi-;RZ@{87b#8>_J8QYM?6<$~4;DLKw|#rnNt}BHJ{aZOd+u&Ph2ptFLGkho z0ui2qj*eCCE9^#V5LG+&ynS3?C55{A68_+4I^l9IZ&DR+5ejIc5PFT>Y0V`VYWU<|6;feVG@n}+LM=jy zRQTXgQ;FsMWl0nE-$wbtCj#%eK5Kibj+}!)l^5i;ol{|qPRB!s(J9|EFo-R9Xkd>Z zAs5rA;r==-UnVAo0kCz@AFu1^c#epu@Vx*N61(rtp}~h#@4ZjyxE;hw!&^}{X0EEL zdL-yhOF@AHPALW^Wl&mD9XsY}|FFS}54{dyvky3kLq~$L#ID65h~qIVeO`VV@kEI^ zZ@4%9weuMvA!;buYUckcv8oesaAR_dHuW_%alm%cb8;^0sMe=0b7R#J%|JLyG{K+t zXXs2dh~PH1;mZT>UAbog4n9!STctxy^JwrHkkdONBUQmb0G!HC5 zqE0Y>%Qe!a$A@Go;1fwSkCiD5Jw$L73<&$m$GrV^!~Ip2MZ3$CCHwJFig^lI=Y1cY zGyPm|PN3Za=lWB4=aBxJz{hJE0G;(OY=gi<_Vw!1tduA%<972C~ zU{EI3us|HaX8qC@LejnJ-QEfyaEx-}6v-m-A9GSHaA<9l8InJg5}B66-3AoX(D9iN}yi{)pZR&MqLcO1|YV|1^o~nnylRy zHEBx>Z``1a{~C(JDTO|MoHxcXMe2A=>2(Ah-QIHz1UZH*sz9PVQMsxMg4T9n5AKmJ z!A~CVTJ#MYbAIIZ=t>eJy~ME}lJ$jZOOHO$ABZ{x1k^&sZ>dqxe+p_FB=*&-x$ETG zNgcPL5hp6;ve$k}pw}==yOxbi@RxlYe2An+UNB}b*k;v=S(hL(s9LnrgSYW;FrPdb z0ZAcIhaZfFyDcX$9IY@pf}B5|5-QZKEqxB-BTIDZXa3Ofu2WJ+D@uqvG2(*3X0`gm z<5!2&^cb!lc$AEOC*TJk0!CgicKX%q+#HxEiJ;ntFr)yD)x zrA8b{l*lTf!Ghp@sWSRnW>5Nu4@^+-IZ1!L17HNqbbJUO4G+a}K1~J+3lEWEOzBBX zHUBIl6VfLP2OWwCG_H0+y9Bib5wf)UO8WN*^saMr=fLr+E)X2v>$39$c)4_FK+xr^ zWelN*$;W(3nC6mgDIhCJi%#r&&A3 zpm>3&sB}$})1rfP&^kV29 z^0C_O=Zz1v*tR?7AYvVvgxrkV(u$jGg~lY0 z`Jf)88XFF;dnu5(_~nJ#fZ+-FdqAaXwhcreQ#^Hw2s&8`TH2RO z8mC(H0P_fbLefDPVO;X!OeC6^d*>XD^hHd|Kw_wSk;;S&Ee)0N!5Wf9PrHK=Mh=GJ zI!VKexgmEzD&>G$9$I2_a;pwMBOq$fW<0`T5eVZD;8h@Kh>3NtbYUfPrIU0H2_yKN z!KGzaK{&5aG=b+i>t4{?YG{TwL2R;8XXFw-mv?E=b?Ma^?W&`U-xS!>pkspF^6i@{ zL{WJf!-ZcBm+_lv1Ox&3tOf?TdehXDt+~0m8_EE%f1xKEbgg1+)FSrBsUg$?$O&bB zUhi4g3ed~oyMT$hUUnw+@wALGGBGh=-NS(7R1v|!fw&2RtKm5HjyJUB|EC4mErbbn zFu0clT5-^9o77!u=?Z=Fdnr}Mv%KaJVww-H>;JXFzDqg zEg=-VS-$-m+IM!Xa(`1GtsZ)-2y&ARgM`Lu0I~xtAMf^b(8CQ3+@%C$7rm0fx&Sh4 z76bAXgA@_xj>FYGf#F7I7p9_lS0;LTH4bL{=k#qzihUvB`$PMkKzy7S+lUxy*RaFS zr>SR7^8JK}cI)=-|1Gv0;GI)d&;6DLqJ9&c-95;a&J+gLaVjG?wu?kEe6!Cah*-nkZ-aF;dvFB1p(hMf07kBHbFd+lyzw=ah;>X~0la%~V{`MWfdLQPEH5NbX#B{m zb*UcU5AP+IgA^up8f4%P_ThIAHukQEC0LfQW+A@rc&iWkCBn$i`R#n$C>bB^A9^Z{ z8z9_V4+e~_;+Zh)?5=A^sisGkTIk6L_80N=phevq6?%So2@1MxnkWd(<_>)X!{;7J(w{h}ahy zO%75h;qR!ZsEC1T4Z%TdE%PgxQ3mbs`VFv?9^T1=$f^qMRJ-tooGk`Rd>yIqm8yWl zvX`+a6U``bT3((L7=|Cozcupd?)KO!sZf+Pvi?|WG_beNwjN9T>B6Ez+1HeZ;1(WZ z5%>KMGa;l$>Y(BKpU6d66zDI(D$wxu!AR;z7|?(z<=0*6&Im!jFc`m=lOB^`2LZqj zaX*gD;?i~zc{G5bxFf+H$##JVF@VY_>ZJ6)op7}a6xzG^X>f79ol!j1@~#ikig)hx zgETW@Y22(n{yUrgM_He>E@)tij8;$=v2KlaKrX))UXiP*EnuyCZE}`r7>@R+>1Zq#P zrIns%Tyj`4a2ppkN02Z&U5-nhYKyH$+JIOBy+(xqsSU{@8_?HK`q_o;0GQc?CM9D~YSOe>rc{`V8=Uv|$dFLBdS=f#({5joJ!qH+??-{! zIDxRy_2%*`T8dMlyAqi_VPM6;V7Gba6HF|x!np{amI2|srU8`TrFr?Q#qlo~5ZvQC zSl|Gg6x3}Kpw)>Xf|}{EA_K(g2UkI70qP1F9OJHH@WFD`3$`%&sq4T~ps!HCuY&2_q)akZ zH>WrJ9U;N%AT8<-oQq5(8vJW@YeRN17^E{*J_4p<{SE}t!c4Gl{}Mp~FD5n4>_i~gqr7?~9iTmB~KWP-@Vs>y@n$pXjudMOK*UZtK{{^*K>7@OKt0%sy&9LMJ6m^ubk8Dh%29VN-f z`u=Am+@K!W$Z>(ycw|{pb>7Q; z*UEF;Wm*SWyNvY|aAP`In=b6?Q*h~+LEx$oZ>WF7B446g{&c;=&{NI2X|HW^uCp+U~@q^rTkh(S(DyUy%%9ajmHMyCwGG{j^7 zuwNJlk_iDM1#+1S0lr`H@df^crg~Wibp&C3hk=*}_Ov&J1B$TM*M4FyMSlYBMnDwd zZ8`7G@f0;62bTo>qGa$}n@|SYqE0;fDFHJ_j5S1_vz+Xfzyp|Y^J9soe z8*}-3#W=vyE#T4qs?iA}4ARxKL+N9TA>F_X3u>&-=}oZ5sVQOKcO~JWY0!xk9B-N= zR776T8rgLAoVEJ0a0fwP#$g?m(ZN&r-bqv!i|~kw(xF4Rja(U^)^Y`o3KSq@$OKFZ zc~=;G9O_$**oCg9QGy-~fw-6yNx^6i_lf@f1f%0%aU_~R>gt>2RZS?Z{gAXSO z{YHUh*KfXgedF|Ylr0r|%PH?@J85HPe`O|~~_5MLteYroF@Rb3vgh+wJIGVr?4;gA;i1bRYf$tieokfGOL zSwMqmCX9|R9>Jf^1#0c3aC6Unaw2R*>E9+jF9B#}Zy?`aZCFN6lWejBL-~Qt;4O4L z(-5aI2o%@0u*Uy_AU5fu!-hkBJ&Z&`=Z!!(@EfXf;|7`Aa(m13xqcf3yYJbLy*>YQ znIcL*Y(Cq@b--|3y$H-1&=bL|&S?w+ROal{QAolxkb#@vV2~kz2-J+l{mya~p(UhP zFWd0P>)#OgKRAnv8}$ zcj(k=+?zL15M)OZ!lRxK+6dbT4fgxCC1lv7_DTP+1sN%)EEAMx#MWcJFicS#UFdZU zpx0Yq4hbnP;MpCR^a*9=4!jg5KK*;s=iuiDqqS|!fDpwB%tqNN&cMQyfu^bHYM7cP z@B)D50+|BCn35$U$_0pCP>476!G_iYaJs>ortux{9CZp;jXnY^J|kiP^D1+Gfoj@s z7ks%<8=gy(UN8e(33UJeVses>%!6GqFw}=bmY#qi5e$E(j(bW5fSwXaT1s`^Pj0{;!WMZPC%L^ z%HNj)BLN2SCmikcdt7vM5wHIx0K+6m*hB8zK zfC!xq`~uIc@#2>(3sa&R?t(L-I^7H2(564HM1IfAOh66L3bQ++Kt8}LD%zE;zW)p= zej6A|ffSzAj)Iq=^r)VO-FdvhG6o$VZB-!YF{KuyT;7NZLLQM)t-(2+0P)JpzCAAv z@{lG}XsJ=z{H=VqOTAM7!WF`EQb{GyO(IE0EJ+8jP^jV2LXw_|$#72PIn*{Vw!#K{ z4UkAKL!kY=qji>FKQ)q=oOS|=FB$MyDI9HGe{i_o>LeXOKV=7V&pS)@S7CfMs*p-B z&r%#1EHwUPIcf=&x6Nj@TCVhC&jV6Te?%48Cly4bCt%pQu6CM2_GUVEyp zVx=PO#-E$y}3h)lx7xD@N#-UR~y8sJ$4n5d^J1hT`x?50Niw&)@F#5)a_wo!!% z#D$lH1DM74^t+B$oj4_LmL7DQ%^*C*n9d!+g-3uzEPqtcN9>E(ogb&`fuh>>#RKsV z@Y*>cAvFLu0K~IcIP^h+y#Icx03)(>B(w6=9^zBh5d-iQK#m`N-F*nrwFSs&biNge zNcJx_=s~NvSM(4>L+HEPipY6FtFxf?2JPUxv6qb+T=&#wjccqx34$Irm}Nx_61Aeu z2IxTkr!&gU&5b?Ze^j6U(a2bPxhREr$(Qs7Ta-G0bZrWmd@U->o7fh%Zw6D%+P4SyuH{j2%lOmp z_%4RNvUI@8-3) zVUJFpA{@Z1t{6yOc|)gmF2UPXe)&(+pqo_o4ZPDF0KieNoiYD~$E@yzz@16Z;Al%} zmAxNlrb5{4G>|L-kGpU5o`yW7<%MWW=d=8bH7%IS@9=1~;v)fujKFl9Q+SA|>s~iL z!icaSHW>YlEYT0Zo;X(_4q*TeI2r~TO<<36H3V#5t1)UX$j!yUe8dajEV^~85048R zDXN-!3~$N;r?Cd0grF8SbWZ09d1Dlqcj`rFNrCB1xx=buQ0f_gL}TRl&!yh~d*cI4 zdLQTlb_A6{%4E5G_|2dIrrAUAKq1x^JTOH?=U;9jBf#}}0LX>F^aD9->EjaxXmJbO z6*CCdD>^q(kw;e~M|cn*9KD4Q)`#Bvl|0wIUPwp!f)0^F3~squ-n(}RG;7u-EGHR5 zl=bBv!doIviHPWJdBL#pL~;9L3WUSWfX$2d-^1gCwM`?u#lzdkhCmzLUIevwIm}HK zx=~Jopfu{{CLVS=2pPYiEG>96dUjgAv{<*LE3--63QM>889ae~p4mRf>ot{@%tV9a z>j_;Gdi1j@SP@=)NHQyI{sGskFaMZptZs0Bb_@nsgVz5sWSDdRucqsc$FdFEw-rhv zGf8F{CCbXIkf@|&WM`C>lAZM!r4W$@ib5%yGBQHRDwTw+kVMGHmhm0;`+eX0*Zb>N z&-2{(ecjh}p2vBNR^?WB?fih4rhiQpn=bqT55MDNJ*3kIpWctWja) zJO1jQ%kp%``DS=FH_u}eut6n#U&$-yRHnQ^du3oCsqG-LhUm!mD^B=2i}er~f!+{6 zEv9!s`taCm;=6dU&K7V()Yg{wJv|mr^3Iy)5iZjA>U`3{A>WDY+0Ui^|K_KM1V#Bb zRpsiKcORa@%VOW@28-FpH)V_{aSTSG(OKX;kh7Ufj+^OQyy4op5T%K7wohx*uzM@Y z9v;Q%{|=%#*Pqv|H%JdOoD=#4f2lY`tSr8x-* zLkopM1IB&7`!CLuGL+_?;*H7oq_a%8I$ihn3DV|@1(Kka?=<X1qI#WOcuE!xMsza9p?wW`Zo5~@0Y?CgD^lIo3Yv9qit38M# zlx0($E3fK8AB}TY(MAF+*YjQ{COMD@#Vzk*mhEHdQu#+tS>>`Yc-_L5)43bCF7^M= ze3c;jt9ShVzhc*UjZdG5FLz28YL6%K@|3na7J9!l+M_%-oSM=_2Q}F>;8oMw(tes4 z3+Kb^1mrgsA`eEmelWijFAit#uPrx^+ z+6g$PH;7mHmK`feE?)RQ8(7IL@2SETu|Ufo%F;W7Mv|=U=m`+pNKrWon~KKl*mjWh zq_LMYFRo&nIa_o4M9N!pul;^K;J1ob_&Q!O*#2A2ao4OF?SXvhxQ7l7x_0NnZ{Dch zC!`fVz8PiX0`f-l&%Rx^KVeuJV&nfJQZ1*Jpg|Utl{FYNWIYszXocV{`?5Y+f^BnO z{vscS4;hy;e-_%k=R|X&>F(rhZ7rDOzvNKU9xGBLi3%mwGx1d)b=H2j?#4f4Q%P%; zaH_o>EY8<9Vfx7%nVD-Tb=$S-n77g9y7GqMC?G>xRb?$z0Tq)f79vY+0IR{z<% zcary(fOU-2fwbTFT5_8sy*9r+S%5da&y30%}=yc zm{7t>eQ0PM41OlzYeZTtix)?-{J4%&ce!_MWqaV-R+tf!@FAFPXoP%#;y@W-14GE* zc8nyY{D$>jUTCR(qKJ{bIiL1js|R0puC{8nhJK37r_r0NNk!MOEcsT=3b6@N2z6=R zbq0Q_@NwMkw}XL!k+B;5tzg_{DvHPPD$|PyzxVF_`^nSu1+E->0@>=38KOj+y)Q^`_xGKT`m`Jwy1)}PKpIpA zWNs(O!+>OUo!B=10!GQZ%u7$}@$vA4lQoQ@V&|YDreYNR^b=)%4;ABR?x)$(oqD#K zZ53%wH~H#R`;Y>&*l2rd!I#=3tcYh1v$#jK18{W~L62kz{lvK9B30wUv_-RS!#17Hz(`h$uR+zx;2 zF}H?bvi`y2oZdon4<`*=>pqJGhk8RPu%0|n5zIhq^@j=e>3#a9E5zuVQM9g%jUgc+ z(zcUUHL?zZCsewM#Qa&z)=@fi4EgV9(W3uTp#+MZseAl3%ueasPBd%k^qUS}uOFw7 zxET_qN_Ne9hog$H8Em|>e5f8l9OMCyMwwiAYa~EN)*7UVwAFEse|XatPseVry5hG; zIv9~8KbC7uJfTmgrV75giAWs%of<&ZXKCP{G@>j>Jd35ZDn7-9sjKk|mxs>(_7D8{ zAqBx-_1VpM-+=;7zS5_K<82g{_i9ZZ`d+J_^)V#@E2WLQg=*9g*ZKp4q#w~UHzOk6 zB6_76qKrGHJ8~hlA)Dgml*3ygmLRKGGzAT(qC1>xO}6~IZZfuRGBK7z;f)Qj6>fSf zW#Ziq3n-WKoQnOV55IVNe5$4@D40$TwJV7Lg5Krq;S-Efntb2vTQfL_KJ1^Q&rnSK z^KWAt1vF}&9KA<+WG|yrAt-VeI{9T~3)=>oDhyCglf@q@p=zh-`Oz@Wro{J#?c*xG z;4JOzn$@_J=kjm*{++LUYy?5rjB#gat&=#{KHgKXDpc&;OdYMfocCy%>^@ZeOZgpV zJuh^L#EoVBKNp~=u&fzFR%=*l#mU}cktc<^Br;@H;b^Yj2188%nM>Uh%1D3=< z)u7Gwm}uL0!K{18@?rO;u)>8K(!Wklzvbf~PRBDn(s&+`cx;Dowuy*SouARaxssvr zGP*(F&6CeH4$47?L|TLg#(o1>NIFnEpPI{ZKD11_E{zrZn;mYZ8EwlRNdM*6fcE~n zx?o*dapkn`@<5WWZKl=@)q@(06fqscKBj20<9bDW*Dr{|qjG+3A|rHfyr=YW;SpMJ zpDQEIW&ZVq?;DK0W6j&Da4wV8cY*UO;m~edDQ+nk{((q)?SwAr;<3x}wVBMp_~I_4 zz60x^8{F-<#nt28uid5(RFywcO&HEz;CnYfO%Yc+R81E|TyblZbtk>r6k|Kjn(w9zYqan>q^%EM9;O#Es%5*zzL?C(X~=jAlmLH^Hn- z1Kbb7*y|8!v`iK^4muPTdN84_pz1}T$h&syGEg@%_lHb@Z_L*Jh{rBkIy^BIu=2UY z)#l8oNrh*&(&hMLxg+nDW9!xt2Ir_0p4ie2tu3>KWzID>iUF8_2+w_N*emqp$dKIt+*B4MRDZU-n)tJ8p{lvx8U&I`fZpXp{f!Tt;}^h zA26D4#=K2+EXtunKX2|V-}_V$OpHY+C-tP{2?E^oP!#lMa(ynQ>)LmuTz%vR`>GPp zKM7eLKCx(LVcowC?q0BLW~U_TQ&+C7mNjMz)x5|yFXJSQwIN*GL_jH34Z}@oEJBdv z@0g}Pz-N9)+WjG_E6YJ&`O?}-L3^RY^tm&+VsEIe*lj)-PbeAuY=#a&s+O7ReyZ&@ z=*+Y;4I8f1lS{By)t}bQ5TGvL-}q01^v|Bdn&le|_QxycEr>R;AV3NmFboxVD0JY+ zM*KaT%ix!@EeNcUoED7#hg&o6;ojeUXI%}(Gu@3AV7AS<7cI}UD}u;RzRSiok0|>M z{O@T^FA$F!PaAL2)B6DNlC6?d{ZlM!?_;*F#}Od`N3DF^i4@#rYv6dKmC!-~pl%M5 zUGN{{Qm7^bAR1meSg;50Nkp;>AZ;Pj1k)2mmj`toD7YTd`<{9J1jLF*+DeODx_(8m zeseeew<~&x1GVch`aanwqhxna(j-P@yNVn_qP8hAG#X_YQ`O!lzZ#(8u|&CzB=FBQ z^+3g!6I*@_Hg*G-Z2}{t+aiGbn)I2QH*adf^dB4Rj~4Y+IRHV`DVhG$St#IrI?6XG( zy$ZstQZb|xFaGQgDwq1Eb zIoDkU@}4@!_?CHieD{6NQ2E#dp5(O4C0@FV0<#ViFSA&zAX}RK7n#`X468YUFHQ z>mS+3=be2ESE}s`26`HProb?fnh^p#BieGA2VxTv4um&_CiqaT7apxAA!C-m&rQ`F*eY)6YOl(;VzIJdVr7LrY8@Lvcb1~9BB zXdT#1*2{K{?4$|x_>L04#mnT~$Bmgul-*o24=y53*Z;7|B1ff2KA)egV?AYD6BYAG zSAEjEff?V$b`uOVu>r)Shhxf0WuFlDKj6iXH7{1-(-jvTY-cK`5 z{8hBr@?X`#+nv{!l9k2u9?4!FK_<~IJ+v{%{5HyWY!&YqnUn+JR{a`NHLAcVeERgx z04U#>$X64mRd-BrBFjBcInToL$QvXESCWCyM)M-+%7_@evIvsh`0DD22`UH4c5Z{# zb?X{SM|z#*Y!(~uh)TG<*DYs^%%2{Ac7)MlD{*>}iX!Fn@|5>A8*}Rfc@S;7^YA|Om{UYx(`!O z0QbYpkL|(ck&B>3!g5kv6#M$W#oHQ#w+aGO@IB&Pvm<%TZK@wl;$7M5L#IfT`5@ztq%O)i9-?jw;rA}hQ&dA*677V#l;IGoIti+b^WAL(3q<johGMXp z*~5ECqX#0e1(a;ko@2()BH+)W;k7G#|9d0~@?Kk$g?lmazjKZS5|h0dA6{B~+KD=B zf<__5T?9jrqxbgI-Q4>3r|+WXk~9d6ni&OZ%+clNJKVmM{eahPEwR|S8bf)r z*HIdogkOJ7V|T+&knSqt_fTItdhKb&zqzx$t1FV`LW+teQtPc`cov1!@fnFQPG!7O z;a@Z-mu)HpW2Yyh<6V{8edqtU{pMj-*wiO-v3J69Ycdmgx*Aeji4yPhM}b8hPm~|1 zZ%&moA4)2l;EY4{TH@p(ArM**-Aa~unW0`lalOh%*05;a>ZeVKJ%v3d=&cxRvc7J+ z^St^z4M9=c(8_}oCD&+3!O-&oz;HkDNO2ct?su!?QZa{WD{n9tyY zw=qWsoUv{l=iW+*6KmK*+|H+LCl-RGe@&;qSo9|yb?9Qn zAg7G|=c*i7L%J;h*BZ3v69^R*7ZRd@F!hDR21e%E-iwtz&qvKmyqnFn{&hNsBznd^ zZ`wnS^BJpdUusD?0H!|*0e%&sxBZ{i!Rr8UBV*$`K}XQ3WKiL<#q}Vg2ea7A3nmD` zFn(=)RjK{pL;6WugXI3{WkFmKc*T@Ds**v19+WweqxS^g->?yzC>@nNXqXSPBar$v za>$!B2J|~m)7EsRXPc6uUpA<@yUr9b9Zo$N^;A2C{!yTTWk1*Q4)O!Pi4ZhYB_elH ztF5YjSO#jk3)dESlNVR=@?_4dKYo&mN%L<#{)3 z21#gtq7j!0B`7lg{dmS_wgrR#_LUGKiLUQ%t1v3q4V=3#D=?HyM=8LQ2YG;gce+AYkoOBbBU-NZ2#{g8?Ab_ z^cA@!9pAxbC@i9_vvrr;deZQW&IBxly)#zRrPq#s4}o$KsNo#o{hmJ5a2NucKT^`6@`d=?o>muEy{jdDHD zUsJ2P5rzFHZn@TtPo61apblMB!=m$E~u*)rH0B! z*nTQ-zzpiq7&=Y80&?LrU@%O3V(LQIO9-Y|{nxM&cKf8|-ehjuxyCl0^|j?Bp+{pg zMo_3O=@%WS;-MYuDC3fFir?UbN%EttU%^{pmlN`>;>cK%o$0@q7`}RWt#ag@TT~kU zs8c~jM+kD;C{Z!d^tIVNCpX&Qs~f;Kb}>r&oE2}i=MN?wJu64S9;ddZI?&X*Mz-8} zmjuvQ4&LlNs$W@TAOKy)ri6})Jt!d1 zPPmik==4nr`IqlK;eHC2ZrIS|%~a39f#S zbkX{%i1D0az|hkHON{aH@?JZ>$lzJET+i0b2*_=$|4>t&9B|5}c`tq6yNs6;Y2-f( zkuKt{viE8?#W6`2!P)=ycMCzmoQUze8(5uQV3Qp3w%#O=ok30FrR1Uy7CSD#rHT8W z!OidrMml1%RP8Tn@4B8@5ZsoF968{`b913YA(WQBt6~*+3Rv8St~)xeBY@n(M4~DO z$aoiOPu)qIeKFE=Av_$uTh|l9){#xu)*pl<;alm2t!+7`VZU~pe5)`tF>#bX4leF^ zY;y7*gm2x)n zRhd{QOE8ujW8>w^Zm!237HacS+MiE*G0_ps841kZR4(69UCC>3e!0G~8C%AensF6P zO_!r-CJ(n%P0Nf;D6A(Q=oLy`qV0aL^MJEz_AgFe&>HFUi7IE$fBjbu6GHaY$!?;= zrBkh()dw%R)m9~l$vZ$|JpWj;SiY4BGz&K`LXWDCv2$cdc|BpKcgN~Y_IdiR%XDA{ z!3QC~EW_xbVJ1hDw1wfX`JKL-5l!OCzS=L{ z29I-7hy&{k=owU~N6)l`Z#JdxJAq9?hGYM^IBFtA28I%f)GTalsfV1tipb3lKUG<4 zr&2yf|F1rTnutHWO{ANKlCpJr#h;dVL{Ofk7ERn&iz2S?R`q<#a9{^z+&wMVPn5XD zYBR=5p(jM|rW%di+ohyr`g}zB)C(SZAu0$)23zO0P1mtfGL3TAH?lJmQPd^L(w-I# zI?EgBh`lzE<{=)!Ru!i_zIHR}t^7O?ctD8I*eFANNx#XLxz1H*{MHew&mq!xQ%}>a zhEo%CQnl{HI+}&UH%24qh}D-W+Peshx2~D^)ZIu%{m2$a8omJ35Px~tT=v9#rq7Ak z<~4%pY-F?Cb~-)c5erGCGbY&h-A4KnDxI-qVC;I?u)n#6ny6ZPdg!|Ejg7u_wYA|c zM`!IYy~hyU({4R2!An7xl5a47Dh2u|_8RU1ZkshaDJF_V&S>~b!D5Td0krR$@4fzX z4*t5!5(rN9moK4ZAHiiz!OaC|Cd};`=R)SswI&apVU zt8*@$0M(uav^b8q3G|f#mY6(ahYhvl(FfbTXHmb1zr41fnBV*a@rQ^lJAAe6S?0O*RtN49 zR$D2OkqUb^;JWd1zC z6b8Lh*!7hHRFg=r0x)7Ib7)=`v_BH_dgO=cvJ_9x6`g%ku3+`C?hYJ&9QL3zNuG}n z1oi#oLg_M;jVZO8i;JUtm&caleH$@gWDrZ`(8e$Q(UkC&M#^s?P>dHjtEV_K$9` zy}X0G$*(hf`A=eh6wlPz?zf!?Gpy)j-oZNhbK^Q160!hTvp93I8bTn}ZMqLte2Zdl zXkXvH|56_@H{Ju#1d+iY%58g{B(Jh!S?muL9mtGSVfUXbdeFuRC z8VVZd2E|{7F9hTMTFneM2mi(FkOK-r4@YTBP^?XgoW-=J*)jbKf>RAOG&Fv^oZAWa1BAgZM9vOljXjZR#1Q;+LN|sjJS%NJAzSHrhtsHx5#80WTMrG zt0WVK%KqZ<0yju6c4A#iYxzA1Z`y;o#cHqBG3mt61zKLurA`cf_}IMNc*B4iTVrw5 zH?XQXv^&eGr?<40jy_}FpZ9S#(A3!Yi0QI2%v$(zkh}ta3iOpql&-XZkIr&$?PZ|5 z4gY8`GJ7TM$&-G>QI|l(!otb9!zQz50^*xmNOgpbS$t4_bc4*P$~w$4h)j5rKMtbn z%f7-oK3^udqg-COtQV&S@2&NIub|g57-ZyKn=6|hW>E~C)MK;|;?EP**ej-2 zmDeX49X=c!amxDAgU&7O2?gK8c00OnshyQ(Dm?YVKy|=o@MNi`_8SHU)dNmJRP3yr zwtGgHKEx7?pS9D=TKp$gn|q`Wl(yuimEG=5&&b?*`QMz_m+tAZq2-Sg%SjlGSkBHP zIt`CfL^jaU*ti~ApI8TrFYe|;*mr-%pHI3`lB4F=J~4Y`K*fLSBzK;fL2H|EqWG1A zo)&-pNo$_0B}OTXQ{|uRWn%B$+r#l7jscDC%h#{&t)JL6 z&*ETH;Ej@bdCV3Zjs*&yL)QD`-DV|u?>VTZM0f8#?)2ZJYIUJbtpL_#*Xz8M`8qp0 zH^+~zZC=naFo+guIow=kOUwUWMqWPIP4VGHYB~O2+4XN)X=s8D)O3@{$7^@UZ_1NPa700M4yS{dJ z^V++(tk(Z_573o5DD|tW^8i1K#}i76+)qOhCh}FIvjxZnftErY za3a8W-IJNVBsCKgxl%_10_I!vd0l_t2z=haO6baAb#)ptZKK!UYgY0lQi90{SP^|| z{KN59jV@4n^D&F_PL*n_2D1Jbkk>N2vP244*&y)SiOj!`60Q2Zw& zv|{(fp9M$`TEYYm2)e6I9wrE=RNy8h_e=B)Ylois48>;0p8 zfSRJJaWc-&N@P;Ob$r@tZ#*0`Zzc%azvv*N&(Gvp9W-QbcW`!2%g7M_Q9hKWecKz> zTTu9q58l1uPG%@zI;T;ye*yx{Y2?AA{d_^fX*s;ynR9cV*f(py@AEZS3I4bopq8DT z&3bQD^D*nLk?E}slM_n9#Bd0^W;|2*y2$AH3f#Qz?(SzdE@P|t5k${NiZ-@XzG}cI zI9|oqvnJvPJk)$(6o&Xp=RL*8(n6j(K=+VXqN5NfM!apuW)X-}GJ(bsSDNzz(u?o#HMuTi)<2-kw}~%$ zXH0*+;V}&TABtOr%q8uY1F?K87$SLMj zcnWur7KMva(!LLZDX=w4&E&pyfPC!@3eKy=UnQKvGYRPW@)6hjjPcaEkf4zfN0d$< zp_K5=_YiD-V=$2ft+M2c<+lI;p(4oDkDYAqz;qz-%acIdoRp%XyQx~KJHOLYQ<1-- zY>vu|dX>)Gz@Rl$kUmBQ3q^}vQ;f=xN>+HXELud3AP0dU8O5DUwfQ z0dW@WvkDRK-e79Ih%ia`{h!@asGHV^$O)ghj`NGiBS__g?M4lBGhl)q(^2bnDR#q} zdTOgN1~V@5cEEh=S)D_|VN+96!FPWA#-E2gtgf=p{8q!S2*YwcB9$sX?m)$mvkq=0 zH^f+s5&i>}PkqUAvV@()wB9R`-9S%|)S-~5J!+hf3u$$$V_>e3611=F?b8rZc=;}a zAidBt5zsDl)RaS0+p(80ZzltBzF~lW!fTl*3#!AS;M;veb?1wm#*}u^aBE^*$hdaj zc=lhWb?RFDpUsCX;GvBHEa>4nhwt>OU>pID&xtu|)OuA!Mn(q7l*2hKv}aFln5k%K zYKA!Ssz_&NUXazEYRE^tJLKU(?jR}!4`kzO)Q-1+HN1!X1z-I*7}hcNN2vwTs!_Hx z>{wr!o8fq9Crih1YD$3a$vECV#y)L+`S0^}rPhSi!eoCpMu8t5?B8dze$xFrTSZw~ z#z#2lVxlkz=ScVs|11b=`8_6Qd8j5QJNssB?O`4s9z{NEt3O_RQdKu-z5mHZikswj z;nzTJl%~}=;;#4#mGnSB@~0u}q}xau^#fIZ#gTmNb8|E$L4h=enHfB<>?y<3!UPK; z8orm;o7tN`WiYZS?M$UN|^E+qnV*`p?4NFu;a-K@nN+ZZ0<3-l9` zUisyxHkZv_t)NkUp5Ztnsy?$}GjaXBX!u{Y;6*Bq8|A&Q87S_uSx*aW6$1cfl-)q% zg=3{~I-|Jq|sRJqN zEiF~V$f^C0mpGmJ3b96`ym9&7u2D9lSmJ<2nrJwqF|9IQuPO*yt`Ov#-vo*`-|4vVb^}7Ig)S)w zPSpEjiU}2MBMLx47v-;K6f%2BXs`o zMtbUe;d<;&WHubSy|%TKU|R&f16D|v52be+1dudm?N%DLIw|N{CBw-2;Buay4R35if0X_>@y78%e;o z@SipKkELiaVX*CW&gjBQKxbE%s{$_*(@nFNMU77#8lXvo*;wBt1qOQ_FfLHMd2Kx) z9{xsUz8h7ELv-P8m>)w!XeRsR^OrAg5NUnL-{1f1NXWy&;$kn_+u916dG$uw85!D| zEGcWZhyyjpPqHgb?&}ld?;lga@T2KmgxFb@;8bcjft@xmfVV>Pz?L~o`yXQ`K7rP& zpz`9yiS# z{bzpA(b}dSUbuMiJch#<(A)-yU+Z4HU3Y9${86Mn&E&4h@QjQkTV3I$?Tm!R8+OeG zy44$2(lMdA1^voYWj%b;ON)3QWEL29uT!c&eW!kCw&hxW!oW|+;=@XSnnmtC-m-_# zAFSKNcPyrb+~N-lOV4R0JSE59ALV69cpD(FdSV^htQWj^;=$}ks;1FbpCw~FbR>c3 zLN=#+FqN2vrMOtUbmXZAW`ZgP)3W#Kc~sk1Ck% z>fxPkk}o>CrNvn?!7C(l%J3^=dFEO@9%3Fdh2uqQ+v`n6RvR{Td0Hgc?TyFWH0{~5 z>w@XG1=HEipJerU<=SpM(r(h@lJGHk$V{K@`0?YII3$6w>+Vy``(8A*>0D}QX#$}2 z9qhY)4GobY(AX$R5?BYgNtl`5TwLidTQNRNU+T(aym2|bdn&?Ko8UjSk1O=h}FTaInz;W2)3?s&0XP?>m5iUUv30sax5KM)8# z(A^1ML0VNm5=-^^F5Q~AWHk|V`DI7d!0eYFmt7kM-*8+(#K_a<&&9@hnEFqqjZ+7~ zrWN$qV=$09HdNU42P>I*yXuGZG#c7g%vzFkrqx%q-cqT zpVF0LDcN)+Lox@iiDRL4p~*n0FSs?__?h6&>;;Y>na<^Io}QBv)o$UtF?#3Ujd$8d zpJZq6cHD`!BA`-jJffoMoDkju>abLy-@AGFVLw;&?%HOQV#v?J&%%(F<$bH!eylzwFYK`9*#7T^h6@WNvy z3;euet)*$0bdP!Ze!W5x;eUdqLmK(zw!a5)bN}U^3=pJ5^DucnaZ67Q?)BX;DLy%o zk+FJftReKe1~t(vfol;ix!jkmZOwSrcu1hvJK{BnYh?e24-m?E)h2VZt*tF>{D-^w z#C@LnIGx~remGKi(9%3im-^D-Fi-oUgSU|3PKWbTFf?o$ERc>!E}Wi{Ppv*)znXHX2i(rlC3I z69Ac0gRPDo^}YJN{Tg2m@PB5b>eIAho0OY;o{{lagl&r!H4!t#u9;62xM>&dFPer{ zcaD_vB@E0{7im>b8OY9FWez^1-5px`e z))|SHTbg^S)IyWozH|vTpLj`S%HX*a7~ABnQG`==hA}+lCmS#8efkg74}M>W8MaBF z{HZ$kNY|kCThSVuU!%~P#vw27? z{M4~ar~A^YoUQb(me~@c6LoyLXGNaD4&`@gZT!{T1Tom!jed)@ij2;cv7r=C@q?n zIOM*$Gs|9C>dy9%V5cvgqA}0(m%nucQt{qx@(f*wA^(E<$+%I5b=3MnI##=^ZZ7R; z?((Z*?W<(;Sirj>QgM8<;0s)o#sl12!mg_KD&K(mr}if=%vb6yDY@#=Zyyh_Wn|2a z$weKSk={%�Z9`uu~5#NJ}x$)5q%Hy3Z*&@w0N>>yrkvhfGXGG`0&+QCL(&UyfLb z>aCAtQqfUTv82EMrKR-c2A1-~HNJ(M7Pp1jHEqM!EGl@W0$)Vq+!Y>VhJ*+lV69G| z)3ohPqR+1K33eL&M038R^tRe=ZJ+JB~c02|j34&P>l}SjAblk8;myvw7Ah nBhT@n9B+RMxp%CB(<^H4WYwg^Oz26TJE5(qtC4faD)@f@)f2{G diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.svg deleted file mode 100644 index 67672e14..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/ToggleKnob.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/VCF.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/VCF.afdesign deleted file mode 100644 index 527f4a01a68e5873f395215d5add797793192a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129595 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

    ?N|yWQn-`Gh@cLq@Qc6TS&9y# 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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.svg deleted file mode 100644 index 0041548f..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanel.svg +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.afdesign deleted file mode 100644 index 636bad40ee2174ba9d6f1e80681b4ea9c91caa02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5627 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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.svg deleted file mode 100644 index f1568a37..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/BlankPanelM1.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/CogBig.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/CogBig.afdesign deleted file mode 100644 index 3d5b8aab4204d22ee57a8175ba7bc0b7738d38cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28876 zcmZ^~byQa0^9K6T3J8+YEz(FxcY_Fmv~(*VDbk=cNQqLSbV`?WihxKeN=Yh`(k*c3 z`1$_UUH6acTF4vc?6ddm*)z}c%z(PMEsKjnp&q%r-DOsNWP3pdZ{Xhp^8bF9|L^^O z?@%Z&hGHY+HTwU4?z%a9V8Cl;r3a2)XdCwfJ&bkVw9S53vqxE=$(n>*b+8~F^>~pq zI?C^CJEJZp^hMo{RTVF9rT_D7evbgY-BDIUa@@j-G09cevEa-S>AOVacl15S6tQAC z%Wy`>CQRZQBQAAT@zm4(jclA9^4}b2Zcu&T&i1!@+MR!MX6Vp2(68;#x9xCd)0Zf4 zGHpbm#Wqic>zW+qmxd_WbRx^wucw3zDHSF@>DO(`J8&vHOxzQF&reovBfDMDeyLqo zAi?M(A#aiynJR5+k+}YQ{I3M0tD!_j2?ForiXPkwpF1WY%06Q3p%7~3`LQCrD^l{vS?4; zxQO!~F>9%mS%;k;h3zNwhMq|}1fN|yD2Z_#A9mMbq1xojo>#f>$#HhFcKUgd*eY1) zY{vcR8w=(;hY)&gXXTub-P^U1wC^Qc58tfS+>p1ww36|DHBRbuV!frRU7F5+p^o0z zWvz$!kk0D%{f{OJxQVZ$2ThIHFyK>JLZW=-AD1%HR^()(Mh& z?)v|32)?%Pv!7LzKD|~T_$$Gn@ec}2JD1^w&zFN(60-2rrvx=HJ0Ii`-1zcH^G>W- zyL*4lF8?<~g+yb1W;?#ny&0F9}4QPid|_p<9BxTd`rL5l*tvuWR@&mO;hTQKsSFt9(-Tg!A)*+-<`ttcXM zbSNP3l-Kk3zMXXUSlMS6ZZgI!re}XX_Wl`Kx%)}~?H%|3J|U=h(BiDAanb!Gak0R| zJOtJgJo1D*u)+-6N;99_mG+w5a%$^trF1WxUiD4xywU9CmyK zZo~**AFE%xl5r6;F-&-wjOasBIr ztLRc>Mwe^zx377E6=DV7@O<~ev(yaoJ?G9OiiXx7j0?axdl~Y9XB|7ebhBz&$Vkhi z;~$cH{N8E*H>=LG?t|s4<)79}>|xGSonewe4MB!{0N zlk%9|{k`dPsOc$Qn`?LP-*A|vr(pu0f1Ip;dH1a6Hg7TbNQnM*uGJQ+6J`P9m@|QL zH7wU#fn6z!*XPDoW~BzJeFjnl0_E~rsk5z-jnO6jZ$cS#q@speV<(gC7wK|CPEKPb1!E_O#)F6_eVKm6^kltlV&K2Q zI{B>V%hhJgr1$sNdg@_jcZpV#n8pK2Ts|8CEa{2;L>U3SBplRo&7 z7jZ2M;VJzLrf=Y0=cACZ&| zq@2T`$oe;IdE6I9b8n2w)KrR17XNI% z4M6-=vuY$DR+FGix9qa#@dbnT!XmrwUd;%kQ?NWmy!nXmD5liA=XU#Q zx{+U1(`FGKbouo%w028>psY!h3B_zG{^HV%&*nrF~ugJ+_&NE^h6`_vCPUOJ=>@^YlNA z&rEULMf)XJb7%+T)BIJHha^Uy^U*aD7SKFW-l-rRXqCV`9MMfUX)S!u>04l@Dg4%K zh2#03#F4r(Mqz`IOXZXw6&+5x96BY#EEIgdeO$P9pzzG$#P`Hfsad+dOqy=p>_(F3 zh#A?u{o9uT9dTLW@mV-k=0>mHM=j#jlQN`yA`@UK-{rq?G$<`f^g}kqNvg;_HtV?2 z~}`R%n{6uYTK!#=oBW^6PCDH)J{D2)Gse_=7%X}4iYjFjEUl69b`w|z;dUg>tM&f z^wVopuuS^Kt*?)+6(nXdc(F7VI0`%_|4m=dBajmDu`V>R5~plYPEdlPAHQcYl9tf8 z=ckM)9|?)wWP^wNz;A))ZO3A3Q5iJsk>6OEsh-J(uX3RrLo+C@9-0;h+vL4*<7e|? zze|C(?81n7XlWe2>iH1!R?OFPq9kucAxRebKF;6#B>Y`0wD?}wpLKY6&^=kZ`I0i< z4E6{vvm4a#Yn=#e8Km1p+^Dv`A;YZDfpv|Arly>New5*ppRM2It7;(!f=`}anbXZ_ z&!(7563m@EZ?5ho6}^5ScE!pvpW1W2p92LHhYca8EVOHc( zW|Ip9N$YYU8a-Fl5)7Mrh8x$lxnswMg^air%|o5;Ppj)!8L2QGObTgf^tMy+8)AR( zb79SpS(?mz(Eq?Zg4perF?DW9I#HM);i$1ndg{lkB84j#;sPBEY4SUI@>4TD{5}L2 zCKI@w?T!w$54{ccCSL8a4Qws2j_A#rsdf!ctbiHl;3;cQ`&cO(^LnX_u}r%Y_(ax8I}2D(Umh9{dZ}Xf zJD*tgdY|96FD3DP+&}w7|2$5f_)nk&3-3D;%`lhZmX-Vhc@bghqq)E)zdMqB@4BX^ zV6hL)SzEK}1)sp#RUp^yX zpozGD|EqZG-yioc&Iz-srMJ7*CmFLY+JixchB>p}2FedKuhWD4r1sQc-a&_;d_`L{|JJDt8rCh=(GEDu0RRbzI zRe=j0N9APWskh89c=rA(rAuCjE+@PvpXRMGpI%VMVGcP=8Eooz*K%z3I6D^bm7mGj z-O7pxs(TJ!k^0OfQ(5g0}p759GyV1eA$c(eY4Vw4H@W z*{Tj?%Q078uBZ8xRim~=H(HTW=MufRCP6-%#XUJxisW$bXoK64!AOxxCCvaw|*0mZF)b7;rIbTc%S}2p^U^jCg&SpnD-K%uA<&hL$p)p^(3a z`27uS8fCc!Jceudl=m&FkBT!(Oy~mc=u0^Dx(Arwe9pVAwr&3seT40hCgP)mpBdLK z0mDWP=^aJ3n|BBCqs?1|+VvwBJbXeh@V;O$lNP3`p4+4+9I1PTbSdhV&GeX%l(~K) zE29@Fb7@a@F%%a}b&-1-JF>X;hO0C*i1Mew&toR5t&|#qn-pHJhku$}jh3+d#@&El z*^Y6_d5@;QGP?N%FJ_aC$UXd!Xd2-Ke72eyM!N;$I2l{v0lE{L$6uWG{rJw4ms5B; z%Pm4IoU2ajDh(Yt+YcVJx-)hyEI$+4N^EDNyy-55JuFmrQw9&WtD75t+=?vh4mbYY z;?9bOP&Dxuoi3_)7(CB$G14F3!&NWn%zS^-JWz|GlN&#xl?^|E9D6-p3VX(%ZL-s) zQx4le#XbH;9e)tHgN4WgM)`C`3l{R!vAT~X#C4?T_pFrsKX7v^e9n)H*vK&?5m;ev ztqqMZ+#|}fp-ff8{`P~0f{7h7|6@A~(e6h2M-{rdm@LJ#%h{A061HR^F%j)!_B~k( zKUpsQDN_v%At198lD*V?(bSJbI{{c_P<1L5xn%H&G&i6G;YRZZPjTeKdzsZ&JzS(TN#xHrK zZdIH`Pw!e2T1bI<_IMyI3XOr|I|~Q4%L6>3#_fG?Lp-A5ZK5Z&S1UdIKlC?T60W;z zYO}qORC?1&-j*K2-ijMP{=UWdmrm3K8FqCj+72iFA~*i<)6RGYiy%5be3y^Mw0f0`GQIUkmp`C=EJZtJG_01-Rx|%uhPw5@}Jlc>Dbk?-{A6ywpqga z)fYRL{lz@Ejgjr!^*iFjT9=p{CBfsiAAD+h`PLa$qfueLxKvlsJLN#tw0c}8 zVRGzd+mB_spAw^a@X`ZbKa7t)c!=YJ^|hkLX5^*9@GWlsx6|>Ji;Dj3Xv+L;;f>#( z#;T1UR`~oJ^*Z*Gxu>*pnVjf(oaz{30KKT$t^S>QlFxIm%%;>^(`Dv7q*eny6IHC~ z8DZ90y8$do)Cw-MG7L@l-1o%ghZ0A_B8%sZ*Kz{70`I?9iGM8Zlk;}}U45}PHW(`x z;Qo8L@n@R#t%rBW>OPN^e4egzeDuiqk$kIwhw5p5YK%bM!@jD4*i`LG<5`jFhA*G> zKbFR%<4jLYFdDA6ycU1La*uXIZD7^lz0Z%;TW^xLZV$!Ysr~!mV-3-hckU0|f4_9n z7d|-nGusxpe||ppYSP--r7P@8i^GY}>4{HDPJz_@x`EWUZf64;%%FhJ_NAAe$OxU2fA#uA5XYNS`{%Vf%JeyfqJ!k>{% z7s9i&MLXed3+bpou~>iHN?Eh{{e_M3oNxraY2^a`F)QitgL?b#-~UOw|9{di+W)TO z{qOg`w<`bp%tGeB7yl<04=+V=qG7^kI4EmpD;{eL59Db&_D+__ZTCPzrv2{*loGr~ zi@d9$d%qRY6wA zD}DWkx5pj*3+b)H0qZD=D0{Mm4_EK8WNF?GiOQY=x9#4a9~sq$ zqQ2DXtcjNua@E={&c&rpmYGNRxT?%M(D#-{P#h!I9EG{Z4 zGh`Q-qsio27HGU7rtPq-OMjz6Xn?v}l)`PMIOXQaB#C^h{k_bj>lLTILQlo`*gJjK z{Z-u&zKG?^$b~P-%QBsg>9Cnft&l5?4CL+Lw<#AYLPrfRxPUwWhpE)^-!~KzwOis> zACTdpn8^64Vnm+&NnfVWyREJsGGb3k8yrCwjD>p8S$hAy%h8s_2p>z%tEcxkL)D)$ zE5|Yj2;74Os8*mDUX#<)#|=rH;M(}Z2=xfTSr;3I{Zzbo~ z)}l3~&vfnuD(7l)p?a4nVw4=mE6_|DJ!GfqoGLB5ai<&Hag=h1G6GK6cXoFbm21+- z>Cm_`Lub3K`7OX;y?uQhKboFw_w%+fu(4fwBlfuSWPdFoF_Bq}DPh6@6+ck#u|k}$ znGu_R=k-Dtq4b9YW@WnL)a7M+F2gDX8LlW)=c6D{lwlY}X`PFYfR!sJ2w)O0DMs0Pq{A(enn=W%QnAq5zgR$QY zkX=xD^=PI!(k$?dtUsAoSxqf!qTCto(JMFQ_P>c`+~j#BhFX}MR$jX&mR9~1hc0Y! zZ~IdWB09Q92Wt<%l|;Uu@xk*yJx~nAC9_shvZhTc$mQsXqwndV55zY!GgD6!?91+; zM=>!oS9)$3J?LUrh!#$sSlz67@P#!RI}laxGLN3Go{A3FKBwSA9~l`TE?}-Az(W!9 zaB||cogGk{`tR#DpRB$++IT-3|LT>^<0cYT_4Zna?<^{XT=!|YGCq?t zXk~);X}B`FVW7(-taGrDFY3G(K3slIbqn`SnqWuBWs>;xbgl=d3QKd6sNBNlW{LI5 zTD;rIJl(DSre&c8-i_dAzi1bpK6&j)Ac~Bz?g)xry9#es;PzAUs<$ zLCxA%=W;p7`Z1grd|ENmfPjD$KC7^WU}={NzOwSx6SeIC?yOhbLG-qQRIUf>h9i7Y zHYa;4QH1C1XMqI*c7qDlwgX!oIP`PFS@KbK4E`2qGB29ofl0h(v2{*U*$&^!#%mrV zZpk_w@B9*S)eHKTe@<_WM~$witi1R;Bal3;!(PyGcWGdGrbQf?CCu-d10gz-dnJmY zkA;QB{O{5B*8YC?c%_wYE!KMQ{f6SyBs|ouGhZ*7oRJ8v9HpX%oGZ@`U&h77th9Va{cW%s4eM6`=VHO8nye{A!PXIRB1`Ccx18!^H& z?H^;PLx+kJHWu#$Sto#-TXjc~8Pq-`D>H6j64R&@6%(^OJ=oaV*&(L=RasMmwbjL; zR}ztULo+IN+u-u$%l6;P-rTuT3;|AQw$*?8+kNLOquPhri}6<=aCO`Ar(Pu^3(dQo zZ25ceP4{H7Sxj?FOC?NjOw#Q!ghDT0-{@GzcjMy*^^J{Dv04fN0aA?~E0)#b`x8@B zIZjh`6oU3wVMMIp4hAveiAy|a!vZ$8whQ6(0WvZ&D4)YWF&Af>fkNU(7>Dnv&*#JG z6?(iv=)OG}tN&1G-ADYI_V3eEUx)SS29mRrefel|?ya-KS!QNtc@M5CG%nO~(ZTuz z20cB!ddf{SI0V^?Dz;0XQ{m)2Tc%Jf^p7#deaPu{etzn#o*`x8f!~*#n`=IrtGczl z-4RPGuF%8y3SzgWZmXa7bkh?}xBx;BAw3min=l=X?%C=HL&h4-M z=f9f;lF{bGPhu;J7CyLazA;%F@%%X{tvopa0YRF$ zc3N%^deGZXeSMc>sBRI{$_tU)(9r3=hYx``GBPsTs+WhIU6st2&$ums*22O9KFBw1 z@nO>~ez{DM>jo=L_4D&nP>#Q&q!h-Xf&X=tyq&OrU_iIK`XDPSOGQ)j8jJ~vA)7h= z3M8(f+me?6oqQ9cU_E6O=T|$ zl$=Hx$o$;&0q=WGE3Rj7p*GUxn^b~Ky~uVTtxAI6BAJfzTjH}e=aUWgda`I7#XEy`!D_cX%4Ar zxNGpYk5~B%K?Bs?%H?13*RNm4f`hDGqbX@}cI~cDpA{sm1%Cv;c@-#d=e3>GucVM9V zMuy+B>1kudlY3wOc&TX>FZcEL-`m^N7L=T>xIGHNqC3BUGa3$(x=him z_x3_}M0E7MT;5xAd(x?p)X84YNEw6SLU(@;^-qSI)}aCn+}x_x@1qxhBZ8+^9b^gl zaE$i(aG?sv_uQDxpRTVvPHfVA@BeRq73JifmH0oW6u>q#H2ill=V%{nT;X_gbF;^j z_TDV{@GVHxz292toKaj1zxmr&$KDZZn**p%7#)EiElPaTIU( zZK529O4nS^+JcPRe2t8#ST)kwZcjb@R$(D8A}SjB-{q-_&iyD9xJ9Jv;>W&GAw1Md z4864Jasxs3@^*{rH?V>2$XfX4gN-R9BJ@q!pfQxfiMIfh@#4J$-rmU!OFzWI>g8j3 zTZo0dy}j`zE${Tp7ba^RUeww-jDGo&ke0?_=$o3FN+BK4Y`rl-HG@)F;!oMD5EWAW z^!>a3DB+{~qfJkoKfe+GzWzN`ot5Rr4Q3u50@y1N*9A{?ed~$O5hYue*JEUN~1)3Qj--tg^ z=&3P$?>zf)zAN1IXluT6^A(TDNkVoeB+QEU@0IoR$feHq?mdm{Ufh#5e1?Tey|YO# zbdATj{k3x|WXXsx1)7U9Exy^z4`v`tx&G`Wq7ik=-SW*-dnE_qasKDeke4q>UFUUV zh7OnFf7N5k*f#kd@~nOwO-4YiU|Cd8#a~%*P2M2FR5BRT)Uf)}vAUQidR5mb3Sr%#RK$k&-dkvbs_<~Nw zlWLu&$RRzGrGN5C_hBKvjd$DC;aiC;L^hYLIayTuLU*(wCR+$r&}TZDzj)TRww6D8 z6TCKC4qX;MUXkr9DF`K`XS#3Ozu7@8{AjM_a7JE5 z6}T*k8n7vMbCj+i2I(6cBjat}f|O+20Q>RrIb|>!2KL;iSDZtCy~)vbEYTQ(7YNP? zjT+ppKYRAfWp7z4Rl6^^8l_-4KIzK~*jZLq)}X;H&#>Hzh=HCQMOm-!T_bxo7T}LV`@rA&SM+_ zxsQpFQ8wFp2aYjI824vXx}+~Tt+?lhXIOY8QWDP1Z=$>n@F8{P$!0ivG$Y^x-kMs~v{F7(`PbQyGQ!gH*u>S{jM1qHb2 zCwL|tr3mDv$7|mdQ~7Nm&zA&VoLvJPsAOP30oPu4&QJ{UFhCiomcdi8UgJRe()bp@ zWrKGwLBS~dTi$!PHS5l6p@^uc7q#@{Xrtz6=2+LUFVK+y!e@y&6L{gDTTs9`YUeuf zX+TB6D60;gK~j=77>Dp<1Q9cYvLclXE_BFd?Q&{h?vuqh>8lhJ5pb3`XATn!H@YHJ z*1ig^)!7Zv0fxuE|NfC~vokr`H@=jwe&MNVkyL-_^;}$(Rz~v_m1TpmujmL1$mS{z z4i1XAFX6ARe=u$P(c*gz68ncJGR}}CR8U7SPW9CalpX4GZc+#RQQJUpc216>@;nzR zK`u@30h8ZWTx6uIi%SIuc3_YI8XPEd>|0mPv9z_dw?0xko5LQ;2@`66dC8KH6zNw^ z8KdNPw*P&3G!JhuLz{T#?x3{-Jg*lp-=Xyl7-4JeHJ0*(A zCc>v2Vh;gA4-yRD9FGC+k&uWie2VZxpL{m>5c zyEU3jlG=?ZIK)TWJ@g}GCgLBuyV)n-UpK%c&G4tV(3E^tihqu^v$Iq2WYd&J%8!EE zs3s^nI(psT*2ZRjt-MW1UH$pGKhcT_a2HeWUu24&bIpFo{4@TCCS3RH)NA$6;z(#| zW5Ci`u({beg;W{nUby$E|I#llEIebsm!GK|M_0A)3MV2YB!od!)UZw}qOdUSmV@P= z=?1UkU&%IWi-)s;J%Gr|#@)}{=Dwh5_Mp#QcJ$v0ybHu`8|Y__Tqy2~+SE61VkiY{ z&B0rHhlY|%Oqe+6f;)nq%y{Eu1fGkkz2dlT*d**c^8o;RrT4CF-y~_IVtZmG$_t+x zwxn36=-EWI9fE1~-jk7#1jol;1*)PJ|2(2Z>zy9==hwo718KLa8%x2X7r?WW0JmWF zeGOJ@UxYCt$Z;-kTK2!)Pq}IFOz}0&FTgX9{*TU2H=Q0z#;dHYudi>x8>{v4N;a+R zkcslPC!2Jvns1*2`c|XY0Fz5ZVYOq_NF7~sad+?P48 zQYV*yo?eSrml(vHE;yw`NfMr;Tz-8bD=}@Mg2nPof9`?s1vm~?#`2HIFcBFd#PtaF zGU3e|6A@~2{?sktTZ_O2df*lXWzsMKw8Ir2Y?;mAi>|+CXM7&Zch%pBkwM}mrwxx_ z(JnWY1QKltn?L^EIb&I*IO{MK^@AKm^EWa=Wk@lIX9#_6PE$c4sC9^7*aWS;BO@Y$ zF84c=j6N0$Cyzv`d#RUH$iQ zF)(IOCtd-R92vkzp>p%{nQq>^N=ZqXopY5aA*#NIj} z1BA2D0p`HCoc`-U=!buP$TxXz#J_yWB8E#u#NPYk2krd){699r*17Bn${(DU&``W< zogE#r9;8f6+7ZFQ7?4>C*E;Bjy+KDrw1wUTX2l*@YA7OqNJ&X$TU{zxgW($*8kVOU z1Rx2qBE$FfPEAqYuXCLL%xi!mRZ~-wb8)#@RaK>+%*ez<`I5_!Sp3PKkb;7OWwzqX zQ@Edwj_zn7npXiCI~BIoZ7UFBEFE~oaJiYZf|Alda}YnAsJb3-wy*!^Vh2TzB2>M7 zTYl|Zskb>;QfYZRGh<QHXM3+~5Ymir5bIHWOZ^2s_g`Q!p}BX@Plv&0Uakq24kvFa+UX6A?`? zw9xO}qcKMJ3M(n$!o0Pi4F%84QB7nWZ}t|jbBvC}3Zi_Gm`FrJ^W69FPbA_9 zglvXYES+6luw{&5Q3G?tL6p-!eh^Vnafrc;Bv}LnUk10OieQ+tCiaC0&-#(TjsM1V zxk%UmmD7EeT%ZzF0nCdElnvM2r8|Hf0oTD&BO)SX!0Q#2D@BdbD^P^^u=U{&zT~@Z zy}ycw!g~x3>fF2?woIX*(AYg>vF38Q9TyxQ0a83>tz59(31wTE^lPrz?YPJiRlKo- z(LhC6oO8ZTj?zQ6Y$o8;3E2)0D{#*L&XG{uZ4`0ur%!T-Q>LV_A;aW*dwH3IEHS-i zhMtZVFVpwpdZo*}+#_jK1r}zyJ!WozN!tepN-8Q5$ZXPXx&2fTd@!oufsYs@#LeA( z8_pI3E2|RXzjx+krAMvM7%G9NF|)BnAX}#zf^*gz3{QTi`;NTzXaNtImEdADZ|mF~ zFUBCM_a|sk3JMA#$oN7ra53yCzxT!2A&ARNRo?Pp`15nTByeH7yZq1wSxp1 z!3&aKWS}Wf0s#13Lqmk1O@Qhm3$XZQl-(<j?r8 zNy!$M3f?1UC8duffl`8kq@c3g-q5cmMbC3X6zZP|Jo~EQwfB=*-rUaSVb*>$4e1g4N ztlR(%QMo{EG5ismlfz6UXpce$Pem6N7GA?JvVeP!HUlp>1u=*cO!29O@Ii2q6EJS} zs@(b{#mb6}U?)${y0MKigGzM32d^0BtJ(EX&4)9-<8@B2xt#P%42Zzkp#oU&KbwA8 zI+wpB7u*P%{QOsGq69f)^{$IbN5{wPqq9gE08juhN3bcB9}@G*fopP^wHhbY(dVn6 z#iyl3C7b%FRyHkO!N!1tjTemuI)<0Gw`xF?4gf9S*WnO|R3~}hu)hfp#{o-(5?@zS znS2EBpO}~!w_w}K$|@lxCF1X2Kh;xjVxVC(Vjh>^=qI=EDh}$xLC?#M`-l+k>(?1U zg9N&T<#Hid1m-65Ud;qWPj6qqeMz0*9MTS4V*#8-v!$|GMEl-7yz+G`OUtX*uHD$< z+lL2~fK>otHLUyhNnymlejN>Z2qQQ5oxw+33#+R}))Sc!%-HVbt5=#*0~X{lX=KwQ zBPP<)^7Ql^uXklm6LK;t$w1&xEa(qE`I^6e)k(dVw%PFetvmuRr|A1lQ6ME_!Ffxl z#_JoOn8*S)r}$Q^@Ls_n^Al@ZJ3Bbiz3VrqAl|^#$2vjH)2g!WW11CCRaa40=W=_T z5g%_ZKwaw(p?LXQ>FW~zUQ-lE2N*bnbT6y%3`NDop$O5mWr_}3qaU1b1h^?GGcz$w zOZz|m5J9AfeY)5a$BYzf1fy>`O_GB6o>WU{h!+Gqkp&8v+buvBxrX4O2vxUnF#Glc z8%iD=cDoQk(ykv;a7^L10~48FTnq*{+&3aY1ThW-0xAG=Z1?L*xHkHQFe(Dhd=Q%} zkT?1sKAO*2cZ)AY8PqwZ8s8xyB3gNtZdJsE)eZ;U@okRW;nV z(b`{MKm^Za{LU5hQy9$@v_?3Vz#g?h!_;&0@K69|b~j(0QUumJF+mCE{mGx{j*Y4J zuBQi1P&ewa6;fjy#lykD0p$U+tgLLbj`M*73Xnv1M}~?le6Y2(#rC%t0w#w};a0D? z+4Sz0>gwufQcMs&lze=A=8vhc%)XbKB_9hjGtHeRogk$FspFp{s#C8ZEJ;h#L*(E; zKmJW$l*R(qov#A#ExiAp2hi=@%F1PsDC(P<`VS(8tF5iA8Tj}rRkW@`7=pNs*C(HA z1E%hVn$Pu>qPiF4D9C^mA}*Oa14JuErAD=Lo11au+(wx|dc6KL{8murNCIa<)LSr+ zh|3&`_fiDQ4uJQC+V7@`C6cOmK}dQeA|lehrJTzNiI0+I}ItM;MpNCJ!Nd?yx- zhzm+fOH0ISi{T$uB~G}rb9mST428u(vkH9IjZZdXmj+&U4QhOIuXogV^oR#3M*WTLqp;b>7b`(NLp-Awq>*|B29p*A{2yXsgHl}&)34!=?hBQ4`5in|z5`_Co z_um@trYajzpr%6Jq%9$kvql)waM8UR2$nQ8HO*eMSM%@?B0xVk zx4QVsyK77ho6;+9AeaM#4hA7Nrpd+(o7>Vo)%AHaBNJqP2_$RI4XfHPHpBIcr6b-mA8~LnGmJ6+5^i z`}=(fjEcaE0D|*e>e$#=gmFO$6(^8v6{=AOo3nB6X9K7Y4i2&xud*+I3+g$wIlCgK zUxgPP9sMd1(Nj>WGC`-yUK}O?K4K0z4ssQ>pTECi52JR-Eny6!8cameZ{8cd4OzOn z-ioRAolz}EXJ_YdgS*{`RxeU;M-Ff6$tve`v-dr4y$OiD^T2C907kMuci>)e>245j z%=*7xfG9GWzp7tM1J53>|7c1MZj0fkz()i@sG!boZt{Y49HAgx>38fFZR&7xZXnRXkYGk!BUlcn-G>+70F;RH z2|AA7^&owr3dj`d!LdO>DA)lOyS{NpJ+%1v_#o+vzhBlhBEA-bpQK3ni?v>y`$Ei& zj+N(sr&B}>@h}t&yyYr8`Z7m3ZUHI|wk;n^&}E`p!Xv+C!`DX;WNw}r{kmq0n zJ0NX0u*jrY{^63TbVhH6S|n6_Tp;e=b|Wf^g37sGiNRASd`HL1p`V>@wk=P+=LPh4 zLku@zOf8uw1`gOu?)!BH(q^#ykPu8L{6_~96)7TBf7<~ng7Xk0dVu6vb7G*&bPK8+ zitvESz}9iBAczo9Nb3p~?#yZ^e?T-)Q=gSQ z%eIf}{wQ3}@icxLTz&z80RmN)Pf$+=lmH;b(^vFy3ROs~ zzv;bW-3*9duh!}@&{IU{0jXkp%DK&OiZsERhK6SAi>CDUk!e*g6j1nl_Uy^gaycL& zBS-LVmK@f*DTtNu0J~f6zEX1l7;}sULWY8Z3J3)E{yEAV*r zYsdOTwarw4Tpc>9KG0(eQdh9|?vg7Bqqai1Y0J$ge~hJ8m0v&u3R0DYCjh~w1r7p( zFyFNNaH%@(=vH_MmdsN?3>KjCiumjmPMajeVqsxf0K0N=ae*}oE(3T%x=$=EE#dwv zySuwxC5F{^fk8~1YUhHi04EZOv1b1JWS~6cC?w}HLwVky+V;wmBWAGiM>;98mMOZ^qlNC^&>8T7-SNO_feVjR$_oOTY!>0?UVSn59Aeb&vh9@7Kbfqf?~q6;9zfZT*<@^^L7|x z`}lVT;4woF8WaZy3Kzj%IZ81LCUtuX*VSIOL%)K^zGg9!5cW2vk`FP4Nf2@jC)#Tz z57aSsxyPsbLJr^lLai~T%=t9UXHi;zF)--lnI4J zM#aVT6l&!FA>o5ibsdWPoz;`7k3sSsey7h1q(Q}lRQs~Cv-9Uv0p+o4oW(q-pi}1( z`oORDKn;wzQ+3zJZ^4vl|zi6&k;&|G=KYSkB*Kq&DsLMz@I^ELb@8bOq<79aRS?w zK(u-Zz@snmh81ATX&IGZ02`q1T>4jrmD6#AFcku;91 zy+-d{Rvy!4HnFf=L0y!6rQDYsXi?hP))>X-<>l2)KhyXImLZ{))lTC;)f^<}C__>> z+Ug<%5%LA8Cf--<(ilGI3)4l=FN9|;q_6H6b_XCBnCVrG&`0}xq}l<>mMbJ>L_!B? zrwWoY5$)5G59l&^JjV6yRw7Q*P}(4P^5h8!Le|@#ILk8)t8HNfGNj=Q>1~5P5*TUN z$R=MHJNW5ZZm#!V;YX)6g5RKYs*7l0P`n58z0if4C5T)YBYeHMMn(^9(PWB;-#eR) z5Jix71g_QHxos6=JBSXoRJu*H3N6red$t#Q=9ia2083bh7zZK;X&pCG?M->2R4phDEe>B!EQ&?vq2zV%)qlvlEuud)|I zQ5!l($ZGhPV2WAbFjz=y1YZOxC_>_Q(r=XO8&SFoYN6~`%G6ut$D~)F9gsxq$sh0- z!w9S(wcNZsPz<$TwOFVX@?_O@2G)RRJK(`zyT+oIYgA}u& zeJML9A=EVB*yb+~YEYste`)r12aN{yo4nY#fqxaK;?MpsU%uErdgytTcFuKlbQBlo z`W}KWu9lyxZX#O>QkL)jDW`k^_BD~b$NR8$m-;oqU}=Eh&X`nVVx^TwN=l!MF2{rdeo2c8K%50El3*;2R* zAp#^UWJ0uy+T%SYZtv3H$I?G&E-t{SwI7l5z+{?75jw7tCziXrdL z8Qew2ehG9bhJMGVx>zy~AFeVx?8D6qTZf0&XrHQ(L5ws+-6cYrRiQ_&GVtQObCc{d zIVl%Csh^?1{ktXCgP^Yjy3$A~mo>ro&{G&K&Uyw_*DeS?TG0LkAui;$iV6Z(z*TZM zbc;ivPEVG~4I+w0r7a#EI|>BczvHzh&`K~7fHs;8+z4q4gH0<^f}OmzZ7f<892_h^ z@7NJ6OxxJlNPgBZ8*q9B_MF4`-EUpVzL+l;3W~R!XJ|kiAqND*1a&35!Ss$)0XslI zVV#@O0OJ*tuHqx5kvoo<3X@2?>ObU(&ol-F@arHmF^gfZJRfkzQm^ao=s*Lppb89L z+-b;146ess49zN_B|S$zTUc5O10@2<$6e?_q`Cl6;AH6l%klwVA4GZ+Ax%ca%H*o~ zImeGe|6Mk8F@Scf4N`QjApEce^b$$ZMO$f8;i0sjLxlr`M@EQ|9F-!h;O`9GfRf~w zN0JpD>VYBv!O+M9e-zp$aw$ybuS%vuOJq}16ZCH}L)76jUS#nRBk#*)LB0>DCz7O% zw$>(wfz?5oP=Kf2;z5gl0kg0K>4ZTHJ)!s&ubHU_=6?g)+1VkJkJ%*pcMrbwbi~`( z|9hi}21BJInmv8`B?G|KB(N4EDcoQow(rVA~%0#r@#ZA<>Qa8(3wK2;fmDgCqY(Y(^0hcP$2IrPh( z13qJBV94C^P3O*BfaQWGW0qZf$${_w_Ug726xdakA(vlAv4iflk&rzHQd&Cqa1n@M z2zdf4WdY| zMG_bZ9UYGty6R_GJz%Z?>k9qF?$}{Ul)Fovj4#pyQDW9+3bV6F6LyXTUx3^%2c7Ng z{Ey4S-ubwXtD|kPKpdBc_So;kj`1Dl?a(fUP#i#Gx%Gg`vVoq#Ny7S+%o_)#=%StC z85*HBG8dTnFf`}Dc<7+a0G)wqvPuNZ0gej!L#P-H5S|BNsU-aEN4SuE}W zp=tn9fYef?16vV@2DW^=e98Jccg(Fcb`&)4U%qzj8iJ~ztlV+D`x`-k-5@~V*ddI08X%8uGfC~6(edZh&HPwMzv8r5{b6y zqVCvG$Of#;l38nGdxs1K8Ze^l!;GN?dNO}OZO2Zn+14`j0B6`==Ym^K%V{r4+5-$j}(`Qh&mF{`|?4PZ=ao|2h;|YPU~Ul z-3$p0&4PMTc8)=Jz8&iPXpslZ7EduO_QVF(J*k2t3&ghd5%b5rApd1j;3bZ~5NVydVy)KU*lhJlN3JGH% z0&C5~v8dp-SZf;_MnORx5BzMqPeVgJuxX-4YrPN&he6CQF>V-LqC2cfg*|7EO>9338SGmnvX`l=XC$1AHE1&IW3TRIJl20HAwC`U#9k)>k7>kjU z^R@>KaUp;vgtWrmF^l1jFavOW2I`?{=CW}l@%5V^E8$b}V*)S9UX*xMj2DEU;6zO+ z3&lI35V*peTaO{WXEPy@t3Z=pDoi~Tyf8x4eJK+FQg)6+0!K0m6y%#ulY$=0!%u^y z$+kg$K-eS1p8uz-GXbY^eb@MhLJpP|;3ODU>8bi)1JjqE-^;ezmXvIsdb--L;Fg^nL4lhv&KP-~Db;4M;o!lXj0# z(+$7#xao|m$h&;cp@W~SAw<)HRR<|e*&fsZL=73N&GYD?y#LA~2PU!OpZ-)tx;+LQy~up1)c=a1q7@y1MWs_t~5T zF#SMT*Ueky>#GCHEfg)*!J%9i?81bv!gQoR!_zqE<)R^Q5GtFrsr4z7LlX>MnG929X*` z7GPjtfKje+nt%`(Lt%I-xNlu=@S&rhnxj8Yx+Q{)kyBCO2hBlideA+y3YupK30Gkx zuQ{?-qIX~*5^Cz(iE1e~$;m%Iorv&+QHk+xTH@I{k3>kYr;2>pSh$c#UK69Q)?uPC;q~ty4HH)SB|KD;c zv}q!jLakotVVl6of;|ORjuXzJjw+JjQ-dH^$Bv&7O9|)zraak$AP;#BHkyVb}Yn>U4 zPY$%F`r%J@?d6A`Wm-it#k4)eRvQ~*kS9JxlmJVLPKt$g&bo_B*-$?;5L0{GdU5%+ z1F#Yosy<~oN%I^$D^uhLPlTwili$;(L_YUL8#ocM z77Ej5sTgxr!Umurk|U8Ck$Hm9Efd*5pEIs8=ChFhRs26wpE$HYo`Ck(q$r z6f;3KTu{aoj^V+t?JLkg$~TsJY=oO6^1H9T+;s<(jow~4o9kHUD}TK6K>wD54>TQ< zzKmzIm#p5kWED}K( z5*qW$T0G}2WCqOaXf&@Ncj`aA%8fHwKd{+{wrXnfPg(rzJ?}7r8?ng%O)&8hDIx;} z-Rem!Vy<`voVmKkFJ1_6ar56AEKRDs3eAP2u}tXmTBBe}lWhXkUCngylHsE3HzE(Y zC59vnu(pwRD}yQ2+WY!ee<>}E`-vH+#S)@=fM+IGq_9r(+4JX2m?N+`0bG z8oZE~po&o6OYRS8}44%xa2Cm~%e~u#6IP0&zZmxl!UWN6f-f+g%V9XOr zW&2UtB6|`@AWGf~y>HWM(ue*|&`S;QwF5>Q&EUBm?L78bH5&TnQ}JLJ!_Yrj&{1hT zcrP?nCRz=3&$sH8Ll5~fKlHDGctVJDR8|X!o+HJmL0L+yJSbWvcjx50Q}Cf1Ft9w5 zWs4Ak*}SR9Z5FAc$x^1Iq=YoYc1TKwY!(*^3l=tn53Kd&&2WnIxydD<-lg9OU+z7;IWR;a?1Fq@W(9NX%FEG)>xdXjVJN=9~0|_3eTV{y-HDsFb z<){6!UjrU7Gc$8G&&0IGD$lTFBQV%d=xSE??raGKs@n`p$id-mlWBA$s0778IpiyW z|3XKIk79lW;}Y~XLrLk{&;v+NMhIn{(Pugm8HXg6;dPxUupDrF_~%gMdyHmOK=x1F zBYj??Qi0QfzUKLYAi$uGo95!q(_!ddwa(xq1v_*a^6aqK!&y^taKZ+JMNDlZF*P+7 zx+cS^a!;K33eBD7$(@h7YPL*FPZeJe>M-pGCq ztVTNCJrO-WXIgBrq7cSo0IxoUnX|S-Q)siCf&veQ59>IcseJ|1L{YnlN}W}(prq#R zGg9^QfCt5Ht@!fPh5}}m0ddk>(-K6IBZGLxtA9p(JI}FkAt$)9ZN4HaQfIzg*q1`rTEe6BeEe8pJOeHClURB zjbGe6e81sv0FP*Uyd>UZJp%^5VKCw~*tjg{$WfxpnapFDBH`#+iD?owdbIBaT}tl= zKNhjjwLExZ{D0w&|A)=AB6kfrhk&Y99~W;>GN^|WuO2iRkRcusG3o-l5C!AO27c5p z%HB(=BZU?IX6hF^6ikM1o&wE%~%QHtpQ}IVx?-~t> z)BOz@T+>HH$T6BU!C{>W4_|9Ic0d(U9X2zD2~iZBU(DS?fE?goM~)O3W;mHQaoFvkZBnHj!&=l+Ru{i(U&Lk4pfCfY|2e=5~UXA!&1FRmC-wu^jLph#R7ZAAOiyc=YB3{4f?39K|a1tR$LLEQ9%&pr5*9s&S zk=YpaY*vV%4*OX!=x3Uom z57mYMFw+fiRQ-o}!84{|FCf<(C`Wkt_=M@k!hq{@z@2456b!IRj4(GMXHZyMpXnFV zK0Py-nBSyQ!xusGFtZm!0IW_m@V7?s*|@=zcAhFw-`}n?P1iy@nd$mCMu`5;6*z1S zC@Kq`|KTPmx{n8%B{;v=@k686QZ)0w0f%YTj&SxQ7E98oXjPct^)GSUszL_^6FtIw zCU(Y9B$zrQ_HocC_i^wAg@|yGpV~jA2M}`F3=XUBLUiD7xZwG{$;b%1$H=dPRA8Mj za%b^R#}Y=;Wf+V^W{lA*sh4#!4~aGhny@9fGj3%ZqOu|O!-2{5F=IT;a;;?Q)~ZUh6PuUslydKrPm)$F5t*8 z{=5l=snJR_Pt&0vx5r!|lW||qQ@#y?Lh<+UhTlHhC?q8qj6htOt`jHAXeE<5{)j8Y zN1uzd)sUly%d8m;`m66JjLKE0rAwDKlppqh5j&j$;T-r?CA&?HgP=6iA*U7|?tvQ= z0jjkRbfR?^61sM3yC8p4^E^s$T#k`h+lY^){2~WbRT3MR4n3Wc#tSSt2v{=s{(%#j z>^9eMpDxfQGF=r-m(N@UnVOW|WaOCVbo%wtw;9a4ngYh<{=~>y8V3eJ1lh;YLJQH2 zHmTer4c(NKi zq?oRcA^_l1*y*ycc#skbRz&vi1r1}^DRtX;`z=6$o`PHfiCzwlYcMJ`Zd53NJuk7F zp8$-|jrxx>K`34eUZDo!cGx})M|L5709-)F#npADyl`B|RA6~3hhlo|MatjbpR`3J zKoAX6RsY8>Kp>5XDfRUAeZYm6zmpAl;(${Rx|3 zPagQdnhMh48lvt!pK-UWj95gwp_~>v9hzVtB-uz5V4Vjh>=OOCJ;2?W_ zg!v30FUU{`V*5*S8{+wT;G#6ZRpbNAn^GmbhJu#jDnhTnoB`^QhVf+twr=O=1xQQF z$;p*(S}AYChX4nj77sCrJp(=8l@J}gbU@f{1$!kHie0yw8R^gx2}-&>VA!Pf_tO_I z;4m*EQRhy{Rr19|UBrG&x~sv!oGVwRbDfy*gMk*OL#B!gDMjur%AA)jT_USBzqGy> zcZgBp@nzVxKYqlqJm&7GYM@Hn7pz3k3PDAek)Arlm~0B1JiLaMNUO1EA=lf52>}8K zk_-8T4L-Qfm1`aWraz7?D(c5Bb+I9wRj~kjd1q&5)Q^3$1SV^0Inyt^-a6wg7%4DD z;C9$`UP9Mq9d=4MVq&j1O%ELa)`Yo({TKR? zoN>h;|4j>pGwG+vE)UE4mQ>t7)$apTkXydOAj1W#@p6xrC1r4KZ60Iejz9l%>Rm-! z`qjLZ0xYK^e#gT&&#j(AOXQrb^6HfDh+MIAmAIBkc#h}Zl8cO*ffGvn)*jA}uUvCp zv}^V{$&|;-b%lE#N$j-TyO{Ih3DMqYw`9d@%<9mo=&(go;)DO(`+2G2=WoAzm%eZ7 z==k1t=;fd5w!2Awj*xGnqN2%8`zwXiCR3d`SR9QeBs1mc=ty961{Q`*v9tPKrq!}o z02!EJgkc{2@gpks1h%`^EiFWQNtRwS5wvx}06}o$%qS`+WnA&Z`^m_Xg|Gb8mMjrG zQbDh&sY!lWU-Mp1g{n;7DMWy2v;?jgVTj;0yIF0l8+B&7%>d(=*w5P%85?VAYb)Ft z@ZA#O!@Wxt<_CQ%q=ph`CRKqyJHp9{Ot7{b4oj~WA6s4%$&4Q}*l1(JScWLPA0)mZqCj1o0nXay`%&hhXHd}|VlCPVal{)n! zq91tQ*J$BG+{d&RqL5$P*C!@I7)+c5PYfQMAwBHOAKk=FMA$Qq}qh|)6 zJg3O%w)@iufz5XqkpY*bUvzF#p^^B{Oa1RLEz_^Uu?7z-l{nq@;8m>xKxsmy;TzuU zHG+IGmghHje$e4tl=TS(li+ohf$i0FilH(3qcdfgqWB z0+(ac(ef=1T;@!YfpwiL{swA)WOlZEqelA?M7!-A99(wn0FiTWc;oz|l$~a?RTWl4 z-inSJ&uU~EUee^_Z#K25Rh^ocm{3aL!K-BWsKkz|yl2X;#p#WXcNzCA9^HCsy{6zX zoOm$VOg$>7>U|CQTk{ZC9(Iw0W%|`6R&@c zRqPE2kRrB|gaka1C%14ALql6zeo95yqGg7L0(jfQhpQVm@Z(e$zwDbg1(D$+x6%m@ ztp)sKNO@hRt%}D`9`A)mGzJAPf z-ouDV9cOp(Okj?~VG;m!aObjNpoCQ}4t>iYx){P7^Kte?W|o)(#Jt{@X>rqueTLK$ zt}_aizx@_1mCrgbrGN+)lp&D8HE-XF5gOg+=+UhFe7N5TYSE1DS${5TX=x!6Vq)P= z_nwXwBm8`ncPmu2hUVslx?#O}`T3$9d6T(%U+)?x9voYBol_QbNlQyBFGjT(9svuK zIz~(^R^;=6zrWlOla|I=cD8&pl`5EU_L6Dmsn-Pihh~_keLn^tOJhfeD%dGr{5=;N zZ%>6_e7}9$->AChM$sk}SXXxY0ybZ)cb^7%S9oemVmr6HY^+_$zv?S?3AJVKhq*G=ft7K z?7mU)waHCQTxdo@#D0zpg)mwDCHbPFdp)b|RXuAq99@tEdi zc}~4d*5bpu)$C)nfJQkw{qP+h$aOBXUZUcQfaXZAA!Cdee0WxkDb;ii?F2 zsw9&br%5S|{ru_bep7NkscW{A?<|J}%Y&>k3GZvs0Y-AeQiqkB^ff zh)>vd>BEdnXaqQ7z~=3QsWQdv{DG$$yK%dp$=eA>jfeh8m4J<|^n7lcf}~M}C`hQg zx($cyco|JpG^3=%ZZ~(S_;n8jKTHeDy7PPl?!}H59h+gXOJ969F)%O?qtkI3fhZ(BUIJiy z1&z|YhMwuKAzu@E>J*li$k>DQi!`&+Ck{R2;6bw1xhksZ=!h8`8{^aL*+eyD&z?P- zC<@s1e!af=#@^oE87On6>sGVTE*(|8vEBQbsxKIOlUnO_@Duj#-P_RG8VLa*GS)cZ zyX5jUAxCW<5xuUxJ?70Dhrh~qT)SW2Wt{-F`g8Z`dr5F)r+}zwGtl@&Q^B|mO_Uowe@$#Fg+O%^uhO zjH)6mj9cleQCiHpDfcyJ|CG&~F(W-AgJaQIeVJ(V`8D7xSYA3r_`%U#8-3(QUQC*hRlKjezRDqYDkB-p!jz29q{v8fo*MxX2@c<&P6|y3f|wCQo=cVfR#m(5Wkfy+)GXosIeGAn9^%*$2^I77$h zuvon)o*cRgW1_t%+Db@En;IE$9G@6Av+T2kPmi^7gM&jD*gVU=MXrF%k|iW1js5-g zl2cNg@3d+C>KI8%q7gJ_%bUw@r02_`r7VhPFfHXtl^n-TXK% zCgzcAoIw~d`M?5_8D7Rd+lxn_PAuochqa^xc((h0(Q@0hYq9R}b?f-?SVZZze8;w^ zY|E(av$M6$VmkzwnsVbN5P4Vfe1D&g&NM1^eUAW*lHUqdghbQ88)jXXvgy^~b_V>)rZgDE1si9#mF~9JM1VD=3 zKNSdK3TeZetCx=ba#_1Wd<#{Pmzl}AZ{NQCQythyh|E*4t%8PaR9Sw(2q?0I&RuDN zVMGzYi?A}-8lsu!N5zf9R`a-n^2XXDGT0%LmN7`48po1c+H7opKID=VcC zMzR?bksS{TIGiv_vXnTiiHNI-iHYXs<`+hX!EhAZm>;xi^2&;@4Ih3?t;7PHUS58z zsrJ$1$K=3Ha&$;TQ`5=JOorN|yutm|7R&Ki!t(NzrB)u7vb3~B%(Lr(^fL7Jc6N5W z=D8{cn)L@0m*}6znIuyI_wG%OfA-Rm^6d(pPYy_trN{4@FyWE)Zeiw@ba%U;*~ly_ z6PF1X;vn$PWUQ?qgTdflb1i8FYt2Uj{wDR0 - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/CogSmall.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/CogSmall.afdesign deleted file mode 100644 index 72368b29603122b1403716a11959a969d98bbff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20024 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 - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.afdesign deleted file mode 100644 index 4b398ac900b0dcaf24cf6a233d8038022a2386a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37783 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⪻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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.svg b/plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.svg deleted file mode 100644 index 7e071f33..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/res/IOPortB.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - ]> - - - - - - - - - - - - - - - - - - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/res/MS20.afdesign b/plugins/community/repos/LindenbergResearch__ORIG/res/MS20.afdesign deleted file mode 100644 index c83071c27b2c60decab1bf4a3cb2958d7ea13ceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136325 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

    *<0URTou3;!Oc2oIT;{DOQo9r2 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 - + - - - - - - - - - - - + + + + + + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + + + + + - + - - + + - + - + - + - + - + + + + - + - - - - - - - + + + + + + + + + + + + + + + + + + + - + - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + @@ -249,37 +233,32 @@ - + - + + + + + + + + + + + + - + - - - - + - - - - - - - - - - - - - - + @@ -290,15 +269,15 @@ - - - + + + - - - + + + - + @@ -318,38 +297,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/community/repos/LindenbergResearch/res/WestcoastAged.svg b/plugins/community/repos/LindenbergResearch/res/WestcoastAged.svg new file mode 100644 index 00000000..046a403e --- /dev/null +++ b/plugins/community/repos/LindenbergResearch/res/WestcoastAged.svg @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/community/repos/LindenbergResearch/src/LRComponents.hpp b/plugins/community/repos/LindenbergResearch/src/LRComponents.hpp index 6038a422..3dc619c8 100644 --- a/plugins/community/repos/LindenbergResearch/src/LRComponents.hpp +++ b/plugins/community/repos/LindenbergResearch/src/LRComponents.hpp @@ -128,6 +128,10 @@ namespace lrt { /** normalized control voltage. must between [0..1] */ float cv = 0.f; + /** indicator distances */ + float d1 = 4.f; + float d2 = 0.1f; + /** draw angle */ float angle; float angle2; @@ -144,6 +148,13 @@ namespace lrt { LRCVIndicator(float distance, float angle); + /** + * @brief Manipulate the indicator symbol + * @param d1 Height of the triangle + * @param d2 Half of the base width + */ + void setDistances(float d1, float d2); + /** * @brief Draw routine for cv indicator * @param vg @@ -232,6 +243,7 @@ namespace lrt { */ void setIndicatorValue(float value) { indicator->cv = value; + dirty = true; } @@ -241,6 +253,7 @@ namespace lrt { */ void setIndicatorActive(bool active) { indicator->active = active; + dirty = true; } @@ -259,6 +272,17 @@ namespace lrt { */ void setIndicatorDistance(float distance) { indicator->distance = distance; + dirty = true; + } + + + /** + * @brief Setup distance of indicator from middle + * @param distance + */ + void setIndicatorShape(float d1, float d2) { + indicator->setDistances(d1, d2); + dirty = true; } @@ -353,7 +377,7 @@ namespace lrt { minAngle = -length * (float) M_PI; maxAngle = length * (float) M_PI; - setSVG(SVG::load(assetPlugin(plugin, "res/MiddleIncremental.svg"))); + setSVG(SVG::load(assetPlugin(plugin, "res/AlternateMiddleKnob.svg"))); shader->setShadowPosition(3, 4); shader->setStrength(1.2f); @@ -380,6 +404,7 @@ namespace lrt { LRBigKnob() { setSVG(SVG::load(assetPlugin(plugin, "res/BigKnob.svg"))); setIndicatorDistance(15); + setIndicatorShape(4.8, 0.12); shader->setShadowPosition(5, 6); } }; @@ -391,7 +416,8 @@ namespace lrt { struct LRMiddleKnob : LRKnob { LRMiddleKnob() { setSVG(SVG::load(assetPlugin(plugin, "res/MiddleKnob.svg"))); - setIndicatorDistance(12); + setIndicatorDistance(13); + setIndicatorShape(5, 0.13); shader->setShadowPosition(4, 4); } }; @@ -433,8 +459,11 @@ namespace lrt { struct LRAlternateMiddleKnob : LRKnob { LRAlternateMiddleKnob() { setSVG(SVG::load(assetPlugin(plugin, "res/AlternateMiddleKnob.svg"))); - setIndicatorDistance(12); - shader->setShadowPosition(4, 4); + setIndicatorDistance(11); + setIndicatorShape(6, 0.2); + shader->setShadowPosition(4, 5); + + setSnap(0.0f, 0.12f); } }; @@ -446,6 +475,7 @@ namespace lrt { LRAlternateBigKnob() { setSVG(SVG::load(assetPlugin(plugin, "res/AlternateBigKnob.svg"))); setIndicatorDistance(15); + setIndicatorShape(4.8, 0.12); shader->setShadowPosition(5, 6); } }; @@ -499,12 +529,12 @@ namespace lrt { box.size = background->box.size; shader = new LRShadow(); - // addChild(shader); + // addChild(shader); /** inherit dimensions */ shader->setBox(box); shader->setSize(0.50); - shader->setShadowPosition(2, 1); + shader->setShadowPosition(3, 2); } diff --git a/plugins/community/repos/LindenbergResearch/src/Westcoast.cpp b/plugins/community/repos/LindenbergResearch/src/Westcoast.cpp index 20b5bd65..36a0d3ec 100644 --- a/plugins/community/repos/LindenbergResearch/src/Westcoast.cpp +++ b/plugins/community/repos/LindenbergResearch/src/Westcoast.cpp @@ -23,7 +23,6 @@ struct Westcoast : LRModule { CV_BIAS_PARAM, BIAS_PARAM, TYPE_PARAM, - DCBLOCK_PARAM, NUM_PARAMS }; @@ -54,15 +53,28 @@ struct Westcoast : LRModule { LRAlternateBigKnob *gain; LRAlternateMiddleKnob *bias; + LRPanel *patina; + void step() override; void onSampleRateChange() override; -}; -void Westcoast::step() { + json_t *toJson() override { + json_t *rootJ = json_object(); + json_object_set_new(rootJ, "agedmode", json_boolean(patina->visible)); + return rootJ; + } + + + void fromJson(json_t *rootJ) override { + json_t *agedmodeJ = json_object_get(rootJ, "agedmode"); + if (agedmodeJ) + patina->visible = json_boolean_value(agedmodeJ); + } +}; - outputs[SHAPER_OUTPUT].value = 0.0f; +void Westcoast::step() { float gaincv = 0; float biascv = 0; @@ -89,7 +101,6 @@ void Westcoast::step() { hs->setGain((params[GAIN_PARAM].value + gaincv)); hs->setBias(params[BIAS_PARAM].value + biascv); hs->setIn(inputs[SHAPER_INPUT].value); - hs->setBlockDC(params[DCBLOCK_PARAM].value == 1); hs->process(); out = (float) hs->getOut(); @@ -98,7 +109,6 @@ void Westcoast::step() { sg->setGain((params[GAIN_PARAM].value + gaincv)); sg->setBias(params[BIAS_PARAM].value + biascv); sg->setIn(inputs[SHAPER_INPUT].value); - sg->setBlockDC(params[DCBLOCK_PARAM].value == 1); sg->process(); out = (float) sg->getOut(); @@ -121,6 +131,7 @@ void Westcoast::onSampleRateChange() { struct WestcoastWidget : LRModuleWidget { WestcoastWidget(Westcoast *module); + void appendContextMenu(Menu *menu) override; }; @@ -129,6 +140,11 @@ WestcoastWidget::WestcoastWidget(Westcoast *module) : LRModuleWidget(module) { panel->setBackground(SVG::load(assetPlugin(plugin, "res/Westcoast.svg"))); addChild(panel); + module->patina = new LRPanel(); + module->patina->setBackground(SVG::load(assetPlugin(plugin, "res/WestcoastAged.svg"))); + module->patina->visible = false; + addChild(module->patina); + box.size = panel->box.size; // ***** SCREWS ********** @@ -145,7 +161,7 @@ WestcoastWidget::WestcoastWidget(Westcoast *module) : LRModuleWidget(module) { addParam(module->gain); addParam(module->bias); - addParam(LRKnob::create(Vec(85, 274.3), module, Westcoast::TYPE_PARAM, 1, 6, 1)); + addParam(LRKnob::create(Vec(85, 279.3), module, Westcoast::TYPE_PARAM, 1, 6, 1)); addParam(LRKnob::create(Vec(83.4, 101.00), module, Westcoast::CV_GAIN_PARAM, -1.f, 1.f, 0.f)); addParam(LRKnob::create(Vec(83.4, 183.0), module, Westcoast::CV_BIAS_PARAM, -1.f, 1.f, 0.f)); @@ -157,18 +173,45 @@ WestcoastWidget::WestcoastWidget(Westcoast *module) : LRModuleWidget(module) { // ***** CV INPUTS ******* // ***** INPUTS ********** - addInput(Port::create(Vec(22.4, 324.6), Port::INPUT, module, Westcoast::SHAPER_INPUT)); + addInput(Port::create(Vec(22.4, 332.6), Port::INPUT, module, Westcoast::SHAPER_INPUT)); // ***** INPUTS ********** // ***** OUTPUTS ********* - addOutput(Port::create(Vec(159.4, 324.6), Port::OUTPUT, module, Westcoast::SHAPER_OUTPUT)); + addOutput(Port::create(Vec(159.4, 332.6), Port::OUTPUT, module, Westcoast::SHAPER_OUTPUT)); // ***** OUTPUTS ********* // ***** SWITCH ********* - addParam(ParamWidget::create(Vec(119, 331), module, Westcoast::DCBLOCK_PARAM, 0.0, 1.0, 1.0)); + //addParam(ParamWidget::create(Vec(119, 331), module, Westcoast::DCBLOCK_PARAM, 0.0, 1.0, 1.0)); // ***** SWITCH ********* } + +struct WestcoastShowPatina : MenuItem { + Westcoast *westcoast; + + + void onAction(EventAction &e) override { + westcoast->patina->visible ^= true; + } + + + void step() override { + rightText = CHECKMARK(westcoast->patina->visible); + } +}; + + +void WestcoastWidget::appendContextMenu(Menu *menu) { + menu->addChild(MenuEntry::create()); + + auto *westcoast = dynamic_cast(module); + assert(westcoast); + + auto *mergeItem = MenuItem::create("use aged look"); + mergeItem->westcoast = westcoast; + menu->addChild(mergeItem); +} + } // namespace rack_plugin_LindenbergResearch using namespace rack_plugin_LindenbergResearch; diff --git a/plugins/community/repos/LindenbergResearch/src/dsp/Serge.cpp b/plugins/community/repos/LindenbergResearch/src/dsp/Serge.cpp index 78c4cbc1..dfc89ba2 100644 --- a/plugins/community/repos/LindenbergResearch/src/dsp/Serge.cpp +++ b/plugins/community/repos/LindenbergResearch/src/dsp/Serge.cpp @@ -71,7 +71,7 @@ double SergeWavefolder::compute(double x) { in = sg5.compute(in); in = sg6.compute(in); - in *= 2.f; + in *= 4.f; if (blockDC) in = dc->filter(in); out = tanh1->next(in); diff --git a/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.cpp b/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.cpp deleted file mode 100644 index 68bdd4c3..00000000 --- a/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "SergeWavefolder.hpp" - -using namespace dsp; - - -double SergeWFStage::compute(double x) { - double out; - double l, u, ln, fn, xn; - - l = sign(x); - u = (SERGE_R1 * SERGE_IS) / (SERGE_N * SERGE_VT) * pow(M_E, (l * x) / (SERGE_N * SERGE_VT)); - ln = lambert_W_Fritsch(u); - fn = x * x / 2 - SERGE_VT * SERGE_N * SERGE_N * SERGE_VT * (ln * (ln + 2)); - - // Check for ill-conditioning - if (abs(x - xn1) < SERGE_THRESHOLD) { - // Compute Averaged Wavefolder Output - xn = 0.5 * (x + xn1); - u = (SERGE_R1 * SERGE_IS) / (SERGE_N * SERGE_VT) * pow(M_E, (l * xn) / (SERGE_VT * SERGE_N)); - ln = lambert_W_Fritsch(u); - out = xn - 2 * l * SERGE_N * SERGE_VT * ln; - } else { - // Apply AA Form - out = (fn - fn1) / (x - xn1); - } - - fn1 = fn; - xn1 = x; - - return out; -} - - -SergeWFStage::SergeWFStage() { - fn1 = 0; - xn1 = 0; -} - - -SergeWavefolder::SergeWavefolder(float sr) : WaveShaper(sr) { - init(); - tanh1 = new HQTanh(sr, 4); -} - - -void SergeWavefolder::init() { - dsp::WaveShaper::rs = new dsp::Resampler<1>(1); -} - - -void SergeWavefolder::process() { - WaveShaper::process(); -} - - -double SergeWavefolder::compute(double x) { - double out; - double in = (x / 8. + bias) * gain; - - // in *= 0.5; - - in = sg1.compute(in); - in = sg2.compute(in); - in = sg3.compute(in); - in = sg4.compute(in); - in = sg5.compute(in); - in = sg6.compute(in); - - in *= 4.f; - - out = in;// tanh1->next(in / 2.); - - return out; -} - diff --git a/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.hpp b/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.hpp deleted file mode 100644 index 03900479..00000000 --- a/plugins/community/repos/LindenbergResearch/src/dsp/SergeWavefolder.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - - -#include "WaveShaper.hpp" -#include "HQTrig.hpp" - -#define SERGE_R1 33e3 -#define SERGE_IS 2.52e-9 -#define SERGE_VT 25.864e-3 -#define SERGE_N 1.752 - -#define SERGE_THRESHOLD 10e-10 - -namespace dsp { - - struct SergeWFStage { - private: - double fn1, xn1; - - public: - SergeWFStage(); - double compute(double x); - }; - - - struct SergeWavefolder : WaveShaper { - - private: - SergeWFStage sg1, sg2, sg3, sg4, sg5, sg6; - // DCBlocker *dc = new DCBlocker(DCBLOCK_ALPHA); - HQTanh *tanh1; - bool blockDC = false; - - - public: - explicit SergeWavefolder(float sr); - - void init() override; - void process() override; - double compute(double x) override; - - }; - - -} \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch/src/widgets/LRCVIndicator.cpp b/plugins/community/repos/LindenbergResearch/src/widgets/LRCVIndicator.cpp index 7b7839c0..a28ad5ff 100644 --- a/plugins/community/repos/LindenbergResearch/src/widgets/LRCVIndicator.cpp +++ b/plugins/community/repos/LindenbergResearch/src/widgets/LRCVIndicator.cpp @@ -40,18 +40,18 @@ namespace lrt { float a = -angle + cv * angle2; - float d = distance - 4.f; + float d = distance - d1; Vec p1, p2, p3; /** compute correct point of indicator on circle */ p1.x = middle.x - sin(-a * (float) M_PI) * distance; p1.y = middle.y - cos(-a * (float) M_PI) * distance; - p2.x = middle.x - sin(-(a + 0.1f) * (float) M_PI) * d; - p2.y = middle.y - cos(-(a + 0.1f) * (float) M_PI) * d; + p2.x = middle.x - sin(-(a + d2) * (float) M_PI) * d; + p2.y = middle.y - cos(-(a + d2) * (float) M_PI) * d; - p3.x = middle.x - sin(-(a - 0.1f) * (float) M_PI) * d; - p3.y = middle.y - cos(-(a - 0.1f) * (float) M_PI) * d; + p3.x = middle.x - sin(-(a - d2) * (float) M_PI) * d; + p3.y = middle.y - cos(-(a - d2) * (float) M_PI) * d; nvgBeginPath(vg); nvgMoveTo(vg, p1.x, p1.y); @@ -66,4 +66,10 @@ namespace lrt { } + void LRCVIndicator::setDistances(float d1, float d2) { + LRCVIndicator::d1 = d1; + LRCVIndicator::d2 = d2; + } + + } \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch/src/widgets/LRKnob.cpp b/plugins/community/repos/LindenbergResearch/src/widgets/LRKnob.cpp index bedd934a..2f14d01d 100644 --- a/plugins/community/repos/LindenbergResearch/src/widgets/LRKnob.cpp +++ b/plugins/community/repos/LindenbergResearch/src/widgets/LRKnob.cpp @@ -13,7 +13,7 @@ namespace lrt { font = Font::load(assetGlobal("res/fonts/ShareTechMono-Regular.ttf")); indicator = new LRCVIndicator(15.f, ANGLE); - addChild(indicator); + // addChild(indicator); } @@ -34,6 +34,8 @@ namespace lrt { /** component */ FramebufferWidget::draw(vg); + indicator->draw(vg); + /** debug numerical values */ if (debug) { auto text = stringf("%4.2f", value); diff --git a/plugins/community/repos/LindenbergResearch__ORIG/.idea/dictionaries/patricklindenberg.xml b/plugins/community/repos/LindenbergResearch__ORIG/.idea/dictionaries/patricklindenberg.xml deleted file mode 100644 index bfe001cf..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/.idea/dictionaries/patricklindenberg.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - courve - lindenberg - rastered - shaper - - - \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/CMakeLists.txt b/plugins/community/repos/LindenbergResearch__ORIG/CMakeLists.txt deleted file mode 100644 index 839cd6e8..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(LRT) - -set(CMAKE_CXX_STANDARD 11) - -set(SOURCE_FILES - src/LindenbergResearch.cpp - src/LindenbergResearch.hpp - src/AlmaFilter.cpp - src/SimpleFilter.cpp - src/ReShaper.cpp - src/BlankPanel.cpp - src/BlankPanelM1.cpp - src/VCO.cpp - src/dsp/DSPMath.cpp - src/dsp/DSPMath.hpp - src/Release.h - src/dsp/Oscillator.cpp - src/dsp/Oscillator.hpp - src/dsp/DSPSystem.hpp - src/dsp/LadderFilter.hpp - src/dsp/LadderFilter.cpp - src/dsp/MS20zdf.hpp src/dsp/MS20zdf.cpp src/MS20Filter.cpp src/LRComponents.cpp src/LRComponents.hpp) - -include_directories(.) -include_directories(src) -include_directories(src/dsp) -include_directories(../../include) -include_directories(../../include) -include_directories(../../include/dsp) -include_directories(../../dep/include) - -add_executable(LRT ${SOURCE_FILES} src/dsp/DSPMath.cpp src/dsp/DSPMath.hpp src/Release.h) \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/LICENSE b/plugins/community/repos/LindenbergResearch__ORIG/LICENSE deleted file mode 100644 index 0287067d..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2017-2018, Lindenberg Research / Patrick Lindenberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Commercial redistribution of the code, or parts, in any form - must be granted by the author. - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Lindenberg Research nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY 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. diff --git a/plugins/community/repos/LindenbergResearch__ORIG/Makefile b/plugins/community/repos/LindenbergResearch__ORIG/Makefile deleted file mode 100644 index 6ccd8700..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -SLUG = LindenbergResearch -VERSION = 0.6.0 - -SOURCES += $(wildcard src/*.cpp src/dsp/*.cpp) - -DISTRIBUTABLES += $(wildcard LICENSE*) res - -RACK_DIR ?= ../.. -include $(RACK_DIR)/plugin.mk diff --git a/plugins/community/repos/LindenbergResearch__ORIG/README.md b/plugins/community/repos/LindenbergResearch__ORIG/README.md deleted file mode 100644 index 691f5996..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Lindenberg Research Tec. - VCV Rack modules -LRT Rack modules is a collection of modules made for [VCV Rack](https://vcvrack.com) virtual modular system. - -Copyright (C) 2017-2018 by Lindenberg Research / Patrick Lindenberg - -![SCREENSHOT](doc/LRTRackModules_0.6.0.png) - - -## 1. Installation - -You can find the latest release here: https://github.com/lindenbergresearch/LRTRack/releases -Just download fpr you architecture and unzip in your _**Rack**_ folder located in your documents. - - -## 2. Build from source - -_**NOTE:**_ - -The current master has been migrated to 0.6.0dev! So you have to install the correct version -of Rack in order to get it running. I suggest to fetch a clean 0.6.xx version of Rack via git and build -all from scratch. - -You can build build the latest release from source, to do so use the following steps: -Note that you have to install a C++ environment with a compiler and other needed tools. -For further information about this, check the documentation found here of: [VCV Rack GIT](https://github.com/VCVRack/Rack) - -Clone git to local machine (into Rack/plugins): - - git clone https://github.com/lindenbergresearch/LRTRack.git - -After that you should have the latest sources. If you want to build some release, you **HAVE** -to switch to the corresponding TAG! For every released version a TAG exists, **be aware that if you check out the current master it could be -possible that it contains errors or unfinished modules... it is a current workstate!** - -To view all tags use: - - git tag - -To checkout to a specific tag simply use: - - git checkout - -Build from sources: - - make dist - -If the release could be successfully compiled you can find a zipped file under: - - 'dist/LindenbergResearch-xx.xx.xx-.zip'. - -Where xx.xx.xx is filled with the version of the release and with the system you are on (win/mac/lin). - -## 3. Bugs, requests and other issues - -Bug reports, change requests, genius ideas and other stuff goes here: [ISSUES](https://github.com/lindenbergresearch/LRTRack/issues) -Thanks to all people who helped to improve the modules and created releases for other architectures in the past! :) - - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/_config.yml b/plugins/community/repos/LindenbergResearch__ORIG/_config.yml deleted file mode 100644 index cc35c1df..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-modernist \ No newline at end of file diff --git a/plugins/community/repos/LindenbergResearch__ORIG/build.sh b/plugins/community/repos/LindenbergResearch__ORIG/build.sh deleted file mode 100644 index f0535392..00000000 --- a/plugins/community/repos/LindenbergResearch__ORIG/build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# script argument -ARG=$1 - -# Rack base dir -RACK_DIR="../.." - -# build plugin -make - -# quit if compiling fails -[[ $? != 0 ]] && exit 1 - -# build and run -if [[ ${ARG} == "run" ]]; then - pushd $RACK_DIR - make run - popd -fi - diff --git a/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.210.png b/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.210.png deleted file mode 100644 index 5f13f88f08937905bd025562ed234467958a557f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264611 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%0Du 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 U12~_a1Q0$Pj=R{swDC>(KMqqKi2wiq diff --git a/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.3.png b/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.5.3.png deleted file mode 100644 index 8d653754c86a332ef43461f79cfd6fd02f5b4572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132715 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 diff --git a/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.6.0.png b/plugins/community/repos/LindenbergResearch__ORIG/doc/LRTRackModules_0.6.0.png deleted file mode 100644 index 3e9eb744301d5e0b36c706e6fe5dcac87e0b7ff1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276311 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