forked from cory/tildefriends
1246 lines
45 KiB
HTML
1246 lines
45 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html>
|
||
|
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
|
||
|
<head>
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||
|
<title>QuickJS Javascript Engine</title>
|
||
|
|
||
|
<meta name="description" content="QuickJS Javascript Engine">
|
||
|
<meta name="keywords" content="QuickJS Javascript Engine">
|
||
|
<meta name="resource-type" content="document">
|
||
|
<meta name="distribution" content="global">
|
||
|
<meta name="Generator" content="makeinfo">
|
||
|
<link href="#SEC_Contents" rel="contents" title="Table of Contents">
|
||
|
<style type="text/css">
|
||
|
<!--
|
||
|
a.summary-letter {text-decoration: none}
|
||
|
blockquote.indentedblock {margin-right: 0em}
|
||
|
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
|
||
|
blockquote.smallquotation {font-size: smaller}
|
||
|
div.display {margin-left: 3.2em}
|
||
|
div.example {margin-left: 3.2em}
|
||
|
div.lisp {margin-left: 3.2em}
|
||
|
div.smalldisplay {margin-left: 3.2em}
|
||
|
div.smallexample {margin-left: 3.2em}
|
||
|
div.smalllisp {margin-left: 3.2em}
|
||
|
kbd {font-style: oblique}
|
||
|
pre.display {font-family: inherit}
|
||
|
pre.format {font-family: inherit}
|
||
|
pre.menu-comment {font-family: serif}
|
||
|
pre.menu-preformatted {font-family: serif}
|
||
|
pre.smalldisplay {font-family: inherit; font-size: smaller}
|
||
|
pre.smallexample {font-size: smaller}
|
||
|
pre.smallformat {font-family: inherit; font-size: smaller}
|
||
|
pre.smalllisp {font-size: smaller}
|
||
|
span.nolinebreak {white-space: nowrap}
|
||
|
span.roman {font-family: initial; font-weight: normal}
|
||
|
span.sansserif {font-family: sans-serif; font-weight: normal}
|
||
|
ul.no-bullet {list-style: none}
|
||
|
-->
|
||
|
</style>
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
|
||
|
|
||
|
</head>
|
||
|
|
||
|
<body lang="en">
|
||
|
<h1 class="settitle" align="center">QuickJS Javascript Engine</h1>
|
||
|
|
||
|
<a name="SEC_Contents"></a>
|
||
|
<h2 class="contents-heading">Table of Contents</h2>
|
||
|
|
||
|
<div class="contents">
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Introduction" href="#Introduction">1 Introduction</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Main-Features" href="#Main-Features">1.1 Main Features</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-Usage" href="#Usage">2 Usage</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Installation" href="#Installation">2.1 Installation</a></li>
|
||
|
<li><a name="toc-Quick-start" href="#Quick-start">2.2 Quick start</a></li>
|
||
|
<li><a name="toc-Command-line-options" href="#Command-line-options">2.3 Command line options</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-qjs-interpreter" href="#qjs-interpreter">2.3.1 <code>qjs</code> interpreter</a></li>
|
||
|
<li><a name="toc-qjsc-compiler" href="#qjsc-compiler">2.3.2 <code>qjsc</code> compiler</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-qjscalc-application" href="#qjscalc-application">2.4 <code>qjscalc</code> application</a></li>
|
||
|
<li><a name="toc-Built_002din-tests" href="#Built_002din-tests">2.5 Built-in tests</a></li>
|
||
|
<li><a name="toc-Test262-_0028ECMAScript-Test-Suite_0029" href="#Test262-_0028ECMAScript-Test-Suite_0029">2.6 Test262 (ECMAScript Test Suite)</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-Specifications" href="#Specifications">3 Specifications</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Language-support" href="#Language-support">3.1 Language support</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-ES2019-support" href="#ES2019-support">3.1.1 ES2019 support</a></li>
|
||
|
<li><a name="toc-JSON" href="#JSON">3.1.2 JSON</a></li>
|
||
|
<li><a name="toc-ECMA402" href="#ECMA402">3.1.3 ECMA402</a></li>
|
||
|
<li><a name="toc-Extensions" href="#Extensions">3.1.4 Extensions</a></li>
|
||
|
<li><a name="toc-Mathematical-extensions" href="#Mathematical-extensions">3.1.5 Mathematical extensions</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-Modules" href="#Modules">3.2 Modules</a></li>
|
||
|
<li><a name="toc-Standard-library" href="#Standard-library">3.3 Standard library</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Global-objects" href="#Global-objects">3.3.1 Global objects</a></li>
|
||
|
<li><a name="toc-std-module" href="#std-module">3.3.2 <code>std</code> module</a></li>
|
||
|
<li><a name="toc-os-module" href="#os-module">3.3.3 <code>os</code> module</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-QuickJS-C-API" href="#QuickJS-C-API">3.4 QuickJS C API</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Runtime-and-contexts" href="#Runtime-and-contexts">3.4.1 Runtime and contexts</a></li>
|
||
|
<li><a name="toc-JSValue" href="#JSValue">3.4.2 JSValue</a></li>
|
||
|
<li><a name="toc-C-functions" href="#C-functions">3.4.3 C functions</a></li>
|
||
|
<li><a name="toc-Exceptions" href="#Exceptions">3.4.4 Exceptions</a></li>
|
||
|
<li><a name="toc-Script-evaluation" href="#Script-evaluation">3.4.5 Script evaluation</a></li>
|
||
|
<li><a name="toc-JS-Classes" href="#JS-Classes">3.4.6 JS Classes</a></li>
|
||
|
<li><a name="toc-C-Modules" href="#C-Modules">3.4.7 C Modules</a></li>
|
||
|
<li><a name="toc-Memory-handling" href="#Memory-handling">3.4.8 Memory handling</a></li>
|
||
|
<li><a name="toc-Execution-timeout-and-interrupts" href="#Execution-timeout-and-interrupts">3.4.9 Execution timeout and interrupts</a></li>
|
||
|
</ul></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-Internals" href="#Internals">4 Internals</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Bytecode" href="#Bytecode">4.1 Bytecode</a></li>
|
||
|
<li><a name="toc-Executable-generation" href="#Executable-generation">4.2 Executable generation</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-qjsc-compiler-1" href="#qjsc-compiler-1">4.2.1 <code>qjsc</code> compiler</a></li>
|
||
|
<li><a name="toc-Binary-JSON" href="#Binary-JSON">4.2.2 Binary JSON</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-Runtime" href="#Runtime">4.3 Runtime</a>
|
||
|
<ul class="no-bullet">
|
||
|
<li><a name="toc-Strings" href="#Strings">4.3.1 Strings</a></li>
|
||
|
<li><a name="toc-Objects" href="#Objects">4.3.2 Objects</a></li>
|
||
|
<li><a name="toc-Atoms" href="#Atoms">4.3.3 Atoms</a></li>
|
||
|
<li><a name="toc-Numbers" href="#Numbers">4.3.4 Numbers</a></li>
|
||
|
<li><a name="toc-Garbage-collection" href="#Garbage-collection">4.3.5 Garbage collection</a></li>
|
||
|
<li><a name="toc-JSValue-1" href="#JSValue-1">4.3.6 JSValue</a></li>
|
||
|
<li><a name="toc-Function-call" href="#Function-call">4.3.7 Function call</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-RegExp" href="#RegExp">4.4 RegExp</a></li>
|
||
|
<li><a name="toc-Unicode" href="#Unicode">4.5 Unicode</a></li>
|
||
|
<li><a name="toc-BigInt-and-BigFloat" href="#BigInt-and-BigFloat">4.6 BigInt and BigFloat</a></li>
|
||
|
</ul></li>
|
||
|
<li><a name="toc-License" href="#License">5 License</a></li>
|
||
|
|
||
|
</ul>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<a name="Introduction"></a>
|
||
|
<h2 class="chapter">1 Introduction</h2>
|
||
|
|
||
|
<p>QuickJS is a small and embeddable Javascript engine. It supports the
|
||
|
ES2019 specification
|
||
|
<a name="DOCF1" href="#FOOT1"><sup>1</sup></a>
|
||
|
including modules, asynchronous generators and proxies.
|
||
|
</p>
|
||
|
<p>It optionally supports mathematical extensions such as big integers
|
||
|
(BigInt), big floating point numbers (BigFloat) and operator
|
||
|
overloading.
|
||
|
</p>
|
||
|
<a name="Main-Features"></a>
|
||
|
<h3 class="section">1.1 Main Features</h3>
|
||
|
|
||
|
<ul>
|
||
|
<li> Small and easily embeddable: just a few C files, no external dependency, 180 KiB of x86 code for a simple “hello world” program.
|
||
|
|
||
|
</li><li> Fast interpreter with very low startup time: runs the 69000 tests of the ECMAScript Test Suite<a name="DOCF2" href="#FOOT2"><sup>2</sup></a> in about 95 seconds on a single core of a desktop PC. The complete life cycle of a runtime instance completes in less than 300 microseconds.
|
||
|
|
||
|
</li><li> Almost complete ES2019 support including modules, asynchronous
|
||
|
generators and full Annex B support (legacy web compatibility). Many
|
||
|
features from the upcoming ES2020 specification
|
||
|
<a name="DOCF3" href="#FOOT3"><sup>3</sup></a> are also supported.
|
||
|
|
||
|
</li><li> Passes nearly 100% of the ECMAScript Test Suite tests when selecting the ES2019 features.
|
||
|
|
||
|
</li><li> Can compile Javascript sources to executables with no external dependency.
|
||
|
|
||
|
</li><li> Garbage collection using reference counting (to reduce memory usage and have deterministic behavior) with cycle removal.
|
||
|
|
||
|
</li><li> Mathematical extensions: BigInt, BigFloat, operator overloading, bigint mode, math mode.
|
||
|
|
||
|
</li><li> Command line interpreter with contextual colorization and completion implemented in Javascript.
|
||
|
|
||
|
</li><li> Small built-in standard library with C library wrappers.
|
||
|
|
||
|
</li></ul>
|
||
|
|
||
|
<a name="Usage"></a>
|
||
|
<h2 class="chapter">2 Usage</h2>
|
||
|
|
||
|
<a name="Installation"></a>
|
||
|
<h3 class="section">2.1 Installation</h3>
|
||
|
|
||
|
<p>A Makefile is provided to compile the engine on Linux or MacOS/X. A
|
||
|
preliminary Windows support is available thru cross compilation on a
|
||
|
Linux host with the MingGW tools.
|
||
|
</p>
|
||
|
<p>Edit the top of the <code>Makefile</code> if you wish to select specific
|
||
|
options then run <code>make</code>.
|
||
|
</p>
|
||
|
<p>You can type <code>make install</code> as root if you wish to install the binaries and support files to
|
||
|
<code>/usr/local</code> (this is not necessary to use QuickJS).
|
||
|
</p>
|
||
|
<a name="Quick-start"></a>
|
||
|
<h3 class="section">2.2 Quick start</h3>
|
||
|
|
||
|
<p><code>qjs</code> is the command line interpreter (Read-Eval-Print Loop). You can pass
|
||
|
Javascript files and/or expressions as arguments to execute them:
|
||
|
</p>
|
||
|
<div class="example">
|
||
|
<pre class="example">./qjs examples/hello.js
|
||
|
</pre></div>
|
||
|
|
||
|
<p><code>qjsc</code> is the command line compiler:
|
||
|
</p>
|
||
|
<div class="example">
|
||
|
<pre class="example">./qjsc -o hello examples/hello.js
|
||
|
./hello
|
||
|
</pre></div>
|
||
|
|
||
|
<p>generates a <code>hello</code> executable with no external dependency.
|
||
|
</p>
|
||
|
<p><code>qjsbn</code> and <code>qjscbn</code> are the corresponding interpreter and
|
||
|
compiler with the mathematical extensions:
|
||
|
</p>
|
||
|
<div class="example">
|
||
|
<pre class="example">./qjsbn examples/pi.js 1000
|
||
|
</pre></div>
|
||
|
|
||
|
<p>displays 1000 digits of PI.
|
||
|
</p>
|
||
|
<div class="example">
|
||
|
<pre class="example">./qjsbnc -o pi examples/pi.js
|
||
|
./pi 1000
|
||
|
</pre></div>
|
||
|
|
||
|
<p>compiles and executes the PI program.
|
||
|
</p>
|
||
|
<a name="Command-line-options"></a>
|
||
|
<h3 class="section">2.3 Command line options</h3>
|
||
|
|
||
|
<a name="qjs-interpreter"></a>
|
||
|
<h4 class="subsection">2.3.1 <code>qjs</code> interpreter</h4>
|
||
|
|
||
|
<pre class="verbatim">usage: qjs [options] [files]
|
||
|
</pre>
|
||
|
<p>Options are:
|
||
|
</p><dl compact="compact">
|
||
|
<dt><code>-h</code></dt>
|
||
|
<dt><code>--help</code></dt>
|
||
|
<dd><p>List options.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-e <code>EXPR</code></code></dt>
|
||
|
<dt><code>--eval <code>EXPR</code></code></dt>
|
||
|
<dd><p>Evaluate EXPR.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-i</code></dt>
|
||
|
<dt><code>--interactive</code></dt>
|
||
|
<dd><p>Go to interactive mode (it is not the default when files are provided on the command line).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-m</code></dt>
|
||
|
<dt><code>--module</code></dt>
|
||
|
<dd><p>Load as ES6 module (default=autodetect).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>--script</code></dt>
|
||
|
<dd><p>Load as ES6 script (default=autodetect).
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<p>Advanced options are:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>-d</code></dt>
|
||
|
<dt><code>--dump</code></dt>
|
||
|
<dd><p>Dump the memory usage stats.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-q</code></dt>
|
||
|
<dt><code>--quit</code></dt>
|
||
|
<dd><p>just instantiate the interpreter and quit.
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<a name="qjsc-compiler"></a>
|
||
|
<h4 class="subsection">2.3.2 <code>qjsc</code> compiler</h4>
|
||
|
|
||
|
<pre class="verbatim">usage: qjsc [options] [files]
|
||
|
</pre>
|
||
|
<p>Options are:
|
||
|
</p><dl compact="compact">
|
||
|
<dt><code>-c</code></dt>
|
||
|
<dd><p>Only output bytecode in a C file. The default is to output an executable file.
|
||
|
</p></dd>
|
||
|
<dt><code>-e</code></dt>
|
||
|
<dd><p>Output <code>main()</code> and bytecode in a C file. The default is to output an
|
||
|
executable file.
|
||
|
</p></dd>
|
||
|
<dt><code>-o output</code></dt>
|
||
|
<dd><p>Set the output filename (default = <samp>out.c</samp> or <samp>a.out</samp>).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-N cname</code></dt>
|
||
|
<dd><p>Set the C name of the generated data.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-m</code></dt>
|
||
|
<dd><p>Compile as Javascript module (default=autodetect).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-M module_name[,cname]</code></dt>
|
||
|
<dd><p>Add initialization code for an external C module. See the
|
||
|
<code>c_module</code> example.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-x</code></dt>
|
||
|
<dd><p>Byte swapped output (only used for cross compilation).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-flto</code></dt>
|
||
|
<dd><p>Use link time optimization. The compilation is slower but the
|
||
|
executable is smaller and faster. This option is automatically set
|
||
|
when the <code>-fno-x</code> options are used.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>-fno-[eval|string-normalize|regexp|json|proxy|map|typedarray|promise]</code></dt>
|
||
|
<dd><p>Disable selected language features to produce a smaller executable file.
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<a name="qjscalc-application"></a>
|
||
|
<h3 class="section">2.4 <code>qjscalc</code> application</h3>
|
||
|
|
||
|
<p>The <code>qjscalc</code> application is a superset of the <code>qjsbn</code>
|
||
|
command line interpreter implementing a Javascript calculator with
|
||
|
arbitrarily large integer and floating point numbers, fractions,
|
||
|
complex numbers, polynomials and matrices. The source code is in
|
||
|
<samp>qjscalc.js</samp>. More documentation and a web version are available at
|
||
|
<a href="http://numcalc.com">http://numcalc.com</a>.
|
||
|
</p>
|
||
|
<a name="Built_002din-tests"></a>
|
||
|
<h3 class="section">2.5 Built-in tests</h3>
|
||
|
|
||
|
<p>Run <code>make test</code> to run the few built-in tests included in the
|
||
|
QuickJS archive.
|
||
|
</p>
|
||
|
<a name="Test262-_0028ECMAScript-Test-Suite_0029"></a>
|
||
|
<h3 class="section">2.6 Test262 (ECMAScript Test Suite)</h3>
|
||
|
|
||
|
<p>A test262 runner is included in the QuickJS archive.
|
||
|
</p>
|
||
|
<p>For reference, the full test262 tests are provided in the archive
|
||
|
<samp>qjs-tests-yyyy-mm-dd.tar.xz</samp>. You just need to untar it into the
|
||
|
QuickJS source code directory.
|
||
|
</p>
|
||
|
<p>Alternatively, the test262 tests can be installed with:
|
||
|
</p>
|
||
|
<div class="example">
|
||
|
<pre class="example">git clone https://github.com/tc39/test262.git test262
|
||
|
cd test262
|
||
|
patch -p1 < ../tests/test262.patch
|
||
|
cd ..
|
||
|
</pre></div>
|
||
|
|
||
|
<p>The patch adds the implementation specific <code>harness</code> functions
|
||
|
and optimizes the inefficient RegExp character classes and Unicode
|
||
|
property escapes tests (the tests themselves are not modified, only a
|
||
|
slow string initialization function is optimized).
|
||
|
</p>
|
||
|
<p>The tests can be run with
|
||
|
</p><div class="example">
|
||
|
<pre class="example">make test2
|
||
|
</pre></div>
|
||
|
|
||
|
<p>The configuration files <code>test262.conf</code> (resp
|
||
|
<code>test262bn.conf</code> for the bignum version, <code>test262o.conf</code> for
|
||
|
the old ES5.1 tests<a name="DOCF4" href="#FOOT4"><sup>4</sup></a>)) contain the options
|
||
|
to run the various tests. Tests can be excluded based on features or
|
||
|
filename.
|
||
|
</p>
|
||
|
<p>The file <code>test262_errors.txt</code> contains the current list of
|
||
|
errors. The runner displays a message when a new error appears or when
|
||
|
an existing error is corrected or modified. Use the <code>-u</code> option
|
||
|
to update the current list of errors (or <code>make test2-update</code>).
|
||
|
</p>
|
||
|
<p>The file <code>test262_report.txt</code> contains the logs of all the
|
||
|
tests. It is useful to have a clearer analysis of a particular
|
||
|
error. In case of crash, the last line corresponds to the failing
|
||
|
test.
|
||
|
</p>
|
||
|
<p>Use the syntax <code>./run-test262 -c test262.conf -f filename.js</code> to
|
||
|
run a single test. Use the syntax <code>./run-test262 -c test262.conf
|
||
|
N</code> to start testing at test number <code>N</code>.
|
||
|
</p>
|
||
|
<p>For more information, run <code>./run-test262</code> to see the command line
|
||
|
options of the test262 runner.
|
||
|
</p>
|
||
|
<p><code>run-test262</code> accepts the <code>-N</code> option to be invoked from
|
||
|
<code>test262-harness</code><a name="DOCF5" href="#FOOT5"><sup>5</sup></a>
|
||
|
thru <code>eshost</code>. Unless you want to compare QuickJS with other
|
||
|
engines under the same conditions, we do not recommend to run the
|
||
|
tests this way as it is much slower (typically half an hour instead of
|
||
|
about 100 seconds).
|
||
|
</p>
|
||
|
<a name="Specifications"></a>
|
||
|
<h2 class="chapter">3 Specifications</h2>
|
||
|
|
||
|
<a name="Language-support"></a>
|
||
|
<h3 class="section">3.1 Language support</h3>
|
||
|
|
||
|
<a name="ES2019-support"></a>
|
||
|
<h4 class="subsection">3.1.1 ES2019 support</h4>
|
||
|
|
||
|
<p>The ES2019 specification is almost fully supported including the Annex
|
||
|
B (legacy web compatibility) and the Unicode related features.
|
||
|
</p>
|
||
|
<p>The following features are not supported yet:
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li> Realms (althougth the C API supports different runtimes and contexts)
|
||
|
|
||
|
</li><li> Tail calls<a name="DOCF6" href="#FOOT6"><sup>6</sup></a>
|
||
|
|
||
|
</li></ul>
|
||
|
|
||
|
<a name="JSON"></a>
|
||
|
<h4 class="subsection">3.1.2 JSON</h4>
|
||
|
|
||
|
<p>The JSON parser is currently more tolerant than the specification.
|
||
|
</p>
|
||
|
<a name="ECMA402"></a>
|
||
|
<h4 class="subsection">3.1.3 ECMA402</h4>
|
||
|
|
||
|
<p>ECMA402 (Internationalization API) is not supported.
|
||
|
</p>
|
||
|
<a name="Extensions"></a>
|
||
|
<h4 class="subsection">3.1.4 Extensions</h4>
|
||
|
|
||
|
<ul>
|
||
|
<li> The directive <code>"use strip"</code> indicates that the debug information (including the source code of the functions) should not be retained to save memory. As <code>"use strict"</code>, the directive can be global to a script or local to a function.
|
||
|
|
||
|
</li><li> The first line of a script beginning with <code>#!</code> is ignored.
|
||
|
|
||
|
</li></ul>
|
||
|
|
||
|
<a name="Mathematical-extensions"></a>
|
||
|
<h4 class="subsection">3.1.5 Mathematical extensions</h4>
|
||
|
|
||
|
<p>The mathematical extensions are available in the <code>qjsbn</code> version and are fully
|
||
|
backward compatible with standard Javascript. See <code>jsbignum.pdf</code>
|
||
|
for more information.
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li> The <code>BigInt</code> (big integers) TC39 proposal is supported.
|
||
|
|
||
|
</li><li> <code>BigFloat</code> support: arbitrary large floating point numbers in base 2.
|
||
|
|
||
|
</li><li> Operator overloading.
|
||
|
|
||
|
</li><li> The directive <code>"use bigint"</code> enables the bigint mode where integers are <code>BigInt</code> by default.
|
||
|
|
||
|
</li><li> The directive <code>"use math"</code> enables the math mode where the division and power operators on integers produce fractions. Floating point literals are <code>BigFloat</code> by default and integers are <code>BigInt</code> by default.
|
||
|
|
||
|
</li></ul>
|
||
|
|
||
|
<a name="Modules"></a>
|
||
|
<h3 class="section">3.2 Modules</h3>
|
||
|
|
||
|
<p>ES6 modules are fully supported. The default name resolution is the
|
||
|
following:
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li> Module names with a leading <code>.</code> or <code>..</code> are relative
|
||
|
to the current module path.
|
||
|
|
||
|
</li><li> Module names without a leading <code>.</code> or <code>..</code> are system
|
||
|
modules, such as <code>std</code> or <code>os</code>.
|
||
|
|
||
|
</li><li> Module names ending with <code>.so</code> are native modules using the
|
||
|
QuickJS C API.
|
||
|
|
||
|
</li></ul>
|
||
|
|
||
|
<a name="Standard-library"></a>
|
||
|
<h3 class="section">3.3 Standard library</h3>
|
||
|
|
||
|
<p>The standard library is included by default in the command line
|
||
|
interpreter. It contains the two modules <code>std</code> and <code>os</code> and
|
||
|
a few global objects.
|
||
|
</p>
|
||
|
<a name="Global-objects"></a>
|
||
|
<h4 class="subsection">3.3.1 Global objects</h4>
|
||
|
|
||
|
<dl compact="compact">
|
||
|
<dt><code>scriptArgs</code></dt>
|
||
|
<dd><p>Provides the command line arguments. The first argument is the script name.
|
||
|
</p></dd>
|
||
|
<dt><code>print(...args)</code></dt>
|
||
|
<dd><p>Print the arguments separated by spaces and a trailing newline.
|
||
|
</p></dd>
|
||
|
<dt><code>console.log(...args)</code></dt>
|
||
|
<dd><p>Same as print().
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<a name="std-module"></a>
|
||
|
<h4 class="subsection">3.3.2 <code>std</code> module</h4>
|
||
|
|
||
|
<p>The <code>std</code> module provides wrappers to the libc <samp>stdlib.h</samp>
|
||
|
and <samp>stdio.h</samp> and a few other utilities.
|
||
|
</p>
|
||
|
<p>Available exports:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>exit(n)</code></dt>
|
||
|
<dd><p>Exit the process.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>evalScript(str)</code></dt>
|
||
|
<dd><p>Evaluate the string <code>str</code> as a script (global eval).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>loadScript(filename)</code></dt>
|
||
|
<dd><p>Evaluate the file <code>filename</code> as a script (global eval).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>Error(errno)</code></dt>
|
||
|
<dd>
|
||
|
<p><code>std.Error</code> constructor. Error instances contain the field
|
||
|
<code>errno</code> (error code) and <code>message</code> (result of
|
||
|
<code>std.Error.strerror(errno)</code>).
|
||
|
</p>
|
||
|
<p>The constructor contains the following fields:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>EINVAL</code></dt>
|
||
|
<dt><code>EIO</code></dt>
|
||
|
<dt><code>EACCES</code></dt>
|
||
|
<dt><code>EEXIST</code></dt>
|
||
|
<dt><code>ENOSPC</code></dt>
|
||
|
<dt><code>ENOSYS</code></dt>
|
||
|
<dt><code>EBUSY</code></dt>
|
||
|
<dt><code>ENOENT</code></dt>
|
||
|
<dt><code>EPERM</code></dt>
|
||
|
<dt><code>EPIPE</code></dt>
|
||
|
<dd><p>Integer value of common errors (additional error codes may be defined).
|
||
|
</p></dd>
|
||
|
<dt><code>strerror(errno)</code></dt>
|
||
|
<dd><p>Return a string that describes the error <code>errno</code>.
|
||
|
</p></dd>
|
||
|
</dl>
|
||
|
|
||
|
</dd>
|
||
|
<dt><code>open(filename, flags)</code></dt>
|
||
|
<dd><p>Open a file (wrapper to the libc <code>fopen()</code>). Throws
|
||
|
<code>std.Error</code> in case of I/O error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>popen(command, flags)</code></dt>
|
||
|
<dd><p>Open a process by creating a pipe (wrapper to the libc <code>popen()</code>). Throws
|
||
|
<code>std.Error</code> in case of I/O error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>fdopen(fd, flags)</code></dt>
|
||
|
<dd><p>Open a file from a file handle (wrapper to the libc
|
||
|
<code>fdopen()</code>). Throws <code>std.Error</code> in case of I/O error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>tmpfile()</code></dt>
|
||
|
<dd><p>Open a temporary file. Throws <code>std.Error</code> in case of I/O error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>puts(str)</code></dt>
|
||
|
<dd><p>Equivalent to <code>std.out.puts(str)</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>printf(fmt, ...args)</code></dt>
|
||
|
<dd><p>Equivalent to <code>std.out.printf(fmt, ...args)</code>
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>sprintf(fmt, ...args)</code></dt>
|
||
|
<dd><p>Equivalent to the libc sprintf().
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>in</code></dt>
|
||
|
<dt><code>out</code></dt>
|
||
|
<dt><code>err</code></dt>
|
||
|
<dd><p>Wrappers to the libc file <code>stdin</code>, <code>stdout</code>, <code>stderr</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>SEEK_SET</code></dt>
|
||
|
<dt><code>SEEK_CUR</code></dt>
|
||
|
<dt><code>SEEK_END</code></dt>
|
||
|
<dd><p>Constants for seek().
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>gc()</code></dt>
|
||
|
<dd><p>Manually invoke the cycle removal algorithm. The cycle removal
|
||
|
algorithm is automatically started when needed, so this function is
|
||
|
useful in case of specific memory constraints or for testing.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>getenv(name)</code></dt>
|
||
|
<dd><p>Return the value of the environment variable <code>name</code> or
|
||
|
<code>undefined</code> if it is not defined.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>urlGet(url, options = undefined)</code></dt>
|
||
|
<dd>
|
||
|
<p>Download <code>url</code> using the <samp>curl</samp> command line
|
||
|
utility. <code>options</code> is an optional object containing the following
|
||
|
optional properties:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>binary</code></dt>
|
||
|
<dd><p>Boolean (default = false). If true, the response is an ArrayBuffer
|
||
|
instead of a string. When a string is returned, the data is assumed
|
||
|
to be UTF-8 encoded.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>full</code></dt>
|
||
|
<dd><p>Boolean (default = false). If true, return the an object contains
|
||
|
the properties <code>response</code> (response content),
|
||
|
<code>responseHeaders</code> (headers separated by CRLF), <code>status</code>
|
||
|
(status code). If <code>full</code> is false, only the response is
|
||
|
returned if the status is between 200 and 299. Otherwise an
|
||
|
<code>std.Error</code> exception is raised.
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<p>FILE prototype:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>close()</code></dt>
|
||
|
<dd><p>Close the file.
|
||
|
</p></dd>
|
||
|
<dt><code>puts(str)</code></dt>
|
||
|
<dd><p>Outputs the string with the UTF-8 encoding.
|
||
|
</p></dd>
|
||
|
<dt><code>printf(fmt, ...args)</code></dt>
|
||
|
<dd><p>Formatted printf, same formats as the libc printf.
|
||
|
</p></dd>
|
||
|
<dt><code>flush()</code></dt>
|
||
|
<dd><p>Flush the buffered file.
|
||
|
</p></dd>
|
||
|
<dt><code>seek(offset, whence)</code></dt>
|
||
|
<dd><p>Seek to a give file position (whence is <code>std.SEEK_*</code>). Throws a
|
||
|
<code>std.Error</code> in case of I/O error.
|
||
|
</p></dd>
|
||
|
<dt><code>tell()</code></dt>
|
||
|
<dd><p>Return the current file position.
|
||
|
</p></dd>
|
||
|
<dt><code>eof()</code></dt>
|
||
|
<dd><p>Return true if end of file.
|
||
|
</p></dd>
|
||
|
<dt><code>fileno()</code></dt>
|
||
|
<dd><p>Return the associated OS handle.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>read(buffer, position, length)</code></dt>
|
||
|
<dd><p>Read <code>length</code> bytes from the file to the ArrayBuffer <code>buffer</code> at byte
|
||
|
position <code>position</code> (wrapper to the libc <code>fread</code>).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>write(buffer, position, length)</code></dt>
|
||
|
<dd><p>Write <code>length</code> bytes to the file from the ArrayBuffer <code>buffer</code> at byte
|
||
|
position <code>position</code> (wrapper to the libc <code>fread</code>).
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>getline()</code></dt>
|
||
|
<dd><p>Return the next line from the file, assuming UTF-8 encoding, excluding
|
||
|
the trailing line feed.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>getByte()</code></dt>
|
||
|
<dd><p>Return the next byte from the file.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>putByte(c)</code></dt>
|
||
|
<dd><p>Write one byte to the file.
|
||
|
</p></dd>
|
||
|
</dl>
|
||
|
|
||
|
<a name="os-module"></a>
|
||
|
<h4 class="subsection">3.3.3 <code>os</code> module</h4>
|
||
|
|
||
|
<p>The <code>os</code> module provides Operating System specific functions:
|
||
|
</p>
|
||
|
<ul>
|
||
|
<li> low level file access
|
||
|
</li><li> signals
|
||
|
</li><li> timers
|
||
|
</li><li> asynchronous I/O
|
||
|
</li></ul>
|
||
|
|
||
|
<p>The OS functions usually return 0 if OK or an OS specific negative
|
||
|
error code.
|
||
|
</p>
|
||
|
<p>Available exports:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>open(filename, flags, mode = 0o666)</code></dt>
|
||
|
<dd><p>Open a file. Return a handle or < 0 if error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>O_RDONLY</code></dt>
|
||
|
<dt><code>O_WRONLY</code></dt>
|
||
|
<dt><code>O_RDWR</code></dt>
|
||
|
<dt><code>O_APPEND</code></dt>
|
||
|
<dt><code>O_CREAT</code></dt>
|
||
|
<dt><code>O_EXCL</code></dt>
|
||
|
<dt><code>O_TRUNC</code></dt>
|
||
|
<dd><p>POSIX open flags.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>O_TEXT</code></dt>
|
||
|
<dd><p>(Windows specific). Open the file in text mode. The default is binary mode.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>close(fd)</code></dt>
|
||
|
<dd><p>Close the file handle <code>fd</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>seek(fd, offset, whence)</code></dt>
|
||
|
<dd><p>Seek in the file. Use <code>std.SEEK_*</code> for <code>whence</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>read(fd, buffer, offset, length)</code></dt>
|
||
|
<dd><p>Read <code>length</code> bytes from the file handle <code>fd</code> to the
|
||
|
ArrayBuffer <code>buffer</code> at byte position <code>offset</code>.
|
||
|
Return the number of read bytes or < 0 if error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>write(fd, buffer, offset, length)</code></dt>
|
||
|
<dd><p>Write <code>length</code> bytes to the file handle <code>fd</code> from the
|
||
|
ArrayBuffer <code>buffer</code> at byte position <code>offset</code>.
|
||
|
Return the number of written bytes or < 0 if error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>isatty(fd)</code></dt>
|
||
|
<dd><p>Return <code>true</code> is <code>fd</code> is a TTY (terminal) handle.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>ttyGetWinSize(fd)</code></dt>
|
||
|
<dd><p>Return the TTY size as <code>[width, height]</code> or <code>null</code> if not available.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>ttySetRaw(fd)</code></dt>
|
||
|
<dd><p>Set the TTY in raw mode.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>remove(filename)</code></dt>
|
||
|
<dd><p>Remove a file. Return 0 if OK or < 0 if error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>rename(oldname, newname)</code></dt>
|
||
|
<dd><p>Rename a file. Return 0 if OK or < 0 if error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>realpath(path)</code></dt>
|
||
|
<dd><p>Return <code>[str, err]</code> where <code>str</code> is the canonicalized absolute
|
||
|
pathname of <code>path</code> and <code>err</code> the error code.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>getcwd()</code></dt>
|
||
|
<dd><p>Return <code>[str, err]</code> where <code>str</code> is the current working directory
|
||
|
and <code>err</code> the error code.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>mkdir(path, mode = 0o777)</code></dt>
|
||
|
<dd><p>Create a directory at <code>path</code>. Return the error code.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>stat(path)</code></dt>
|
||
|
<dt><code>lstat(path)</code></dt>
|
||
|
<dd>
|
||
|
<p>Return <code>[obj, err]</code> where <code>obj</code> is an object containing the
|
||
|
file status of <code>path</code>. <code>err</code> is the error code. The
|
||
|
following fields are defined in <code>obj</code>: dev, ino, mode, nlink,
|
||
|
uid, gid, rdev, size, blocks, atime, mtime, ctime. The times are
|
||
|
specified in milliseconds since 1970. <code>lstat()</code> is the same as
|
||
|
<code>stat()</code> excepts that it returns information about the link
|
||
|
itself.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>S_IFMT</code></dt>
|
||
|
<dt><code>S_IFIFO</code></dt>
|
||
|
<dt><code>S_IFCHR</code></dt>
|
||
|
<dt><code>S_IFDIR</code></dt>
|
||
|
<dt><code>S_IFBLK</code></dt>
|
||
|
<dt><code>S_IFREG</code></dt>
|
||
|
<dt><code>S_IFSOCK</code></dt>
|
||
|
<dt><code>S_IFLNK</code></dt>
|
||
|
<dt><code>S_ISGID</code></dt>
|
||
|
<dt><code>S_ISUID</code></dt>
|
||
|
<dd><p>Constants to interpret the <code>mode</code> property returned by
|
||
|
<code>stat()</code>. They have the same value as in the C system header
|
||
|
<samp>sys/stat.h</samp>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>utimes(path, atime, mtime)</code></dt>
|
||
|
<dd><p>Change the access and modification times of the file <code>path</code>. The
|
||
|
times are specified in milliseconds since 1970.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>symlink(target, linkpath)</code></dt>
|
||
|
<dd><p>Create a link at <code>linkpath</code> containing the string <code>target</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>readlink(path)</code></dt>
|
||
|
<dd><p>Return <code>[str, err]</code> where <code>str</code> is the link target and <code>err</code>
|
||
|
the error code.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>readdir(path)</code></dt>
|
||
|
<dd><p>Return <code>[array, err]</code> where <code>array</code> is an array of strings
|
||
|
containing the filenames of the directory <code>path</code>. <code>err</code> is
|
||
|
the error code.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>setReadHandler(fd, func)</code></dt>
|
||
|
<dd><p>Add a read handler to the file handle <code>fd</code>. <code>func</code> is called
|
||
|
each time there is data pending for <code>fd</code>. A single read handler
|
||
|
per file handle is supported. Use <code>func = null</code> to remove the
|
||
|
hander.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>setWriteHandler(fd, func)</code></dt>
|
||
|
<dd><p>Add a write handler to the file handle <code>fd</code>. <code>func</code> is
|
||
|
called each time data can be written to <code>fd</code>. A single write
|
||
|
handler per file handle is supported. Use <code>func = null</code> to remove
|
||
|
the hander.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>signal(signal, func)</code></dt>
|
||
|
<dd><p>Call the function <code>func</code> when the signal <code>signal</code>
|
||
|
happens. Only a single handler per signal number is supported. Use
|
||
|
<code>null</code> to set the default handler or <code>undefined</code> to ignore
|
||
|
the signal.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>SIGINT</code></dt>
|
||
|
<dt><code>SIGABRT</code></dt>
|
||
|
<dt><code>SIGFPE</code></dt>
|
||
|
<dt><code>SIGILL</code></dt>
|
||
|
<dt><code>SIGSEGV</code></dt>
|
||
|
<dt><code>SIGTERM</code></dt>
|
||
|
<dd><p>POSIX signal numbers.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>kill(pid, sig)</code></dt>
|
||
|
<dd><p>Send the signal <code>sig</code> to the process <code>pid</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>exec(args[, options])</code></dt>
|
||
|
<dd><p>Execute a process with the arguments <code>args</code>. <code>options</code> is an
|
||
|
object containing optional parameters:
|
||
|
</p>
|
||
|
<dl compact="compact">
|
||
|
<dt><code>block</code></dt>
|
||
|
<dd><p>Boolean (default = true). If true, wait until the process is
|
||
|
termined. In this case, <code>exec</code> return the exit code if positive
|
||
|
or the negated signal number if the process was interrupted by a
|
||
|
signal. If false, do not block and return the process id of the child.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>usePath</code></dt>
|
||
|
<dd><p>Boolean (default = true). If true, the file is searched in the
|
||
|
<code>PATH</code> environment variable.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>file</code></dt>
|
||
|
<dd><p>String (default = <code>args[0]</code>). Set the file to be executed.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>cwd</code></dt>
|
||
|
<dd><p>String. If present, set the working directory of the new process.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>stdin</code></dt>
|
||
|
<dt><code>stdout</code></dt>
|
||
|
<dt><code>stderr</code></dt>
|
||
|
<dd><p>If present, set the handle in the child for stdin, stdout or stderr.
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
</dd>
|
||
|
<dt><code>waitpid(pid, options)</code></dt>
|
||
|
<dd><p><code>waitpid</code> Unix system call. Return the array <code>[ret, status]</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>WNOHANG</code></dt>
|
||
|
<dd><p>Constant for the <code>options</code> argument of <code>waitpid</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>dup(fd)</code></dt>
|
||
|
<dd><p><code>dup</code> Unix system call.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>dup2(oldfd, newfd)</code></dt>
|
||
|
<dd><p><code>dup2</code> Unix system call.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>pipe()</code></dt>
|
||
|
<dd><p><code>pipe</code> Unix system call. Return two handles as <code>[read_fd,
|
||
|
write_fd]</code> or null in case of error.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>sleep(delay_ms)</code></dt>
|
||
|
<dd><p>Sleep during <code>delay_ms</code> milliseconds.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>setTimeout(func, delay)</code></dt>
|
||
|
<dd><p>Call the function <code>func</code> after <code>delay</code> ms. Return a handle
|
||
|
to the timer.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>clearTimeout(handle)</code></dt>
|
||
|
<dd><p>Cancel a timer.
|
||
|
</p>
|
||
|
</dd>
|
||
|
<dt><code>platform</code></dt>
|
||
|
<dd><p>Return a string representing the platform: <code>"linux"</code>, <code>"darwin"</code>,
|
||
|
<code>"win32"</code> or <code>"js"</code>.
|
||
|
</p>
|
||
|
</dd>
|
||
|
</dl>
|
||
|
|
||
|
<a name="QuickJS-C-API"></a>
|
||
|
<h3 class="section">3.4 QuickJS C API</h3>
|
||
|
|
||
|
<p>The C API was designed to be simple and efficient. The C API is
|
||
|
defined in the header <code>quickjs.h</code>.
|
||
|
</p>
|
||
|
<a name="Runtime-and-contexts"></a>
|
||
|
<h4 class="subsection">3.4.1 Runtime and contexts</h4>
|
||
|
|
||
|
<p><code>JSRuntime</code> represents a Javascript runtime corresponding to an
|
||
|
object heap. Several runtimes can exist at the same time but they
|
||
|
cannot exchange objects. Inside a given runtime, no multi-threading is
|
||
|
supported.
|
||
|
</p>
|
||
|
<p><code>JSContext</code> represents a Javascript context (or Realm). Each
|
||
|
JSContext has its own global objects and system objects. There can be
|
||
|
several JSContexts per JSRuntime and they can share objects, similary
|
||
|
to frames of the same origin sharing Javascript objects in a
|
||
|
web browser.
|
||
|
</p>
|
||
|
<a name="JSValue"></a>
|
||
|
<h4 class="subsection">3.4.2 JSValue</h4>
|
||
|
|
||
|
<p><code>JSValue</code> represents a Javascript value which can be a primitive
|
||
|
type or an object. Reference counting is used, so it is important to
|
||
|
explicitely duplicate (<code>JS_DupValue()</code>, increment the reference
|
||
|
count) or free (<code>JS_FreeValue()</code>, decrement the reference count)
|
||
|
JSValues.
|
||
|
</p>
|
||
|
<a name="C-functions"></a>
|
||
|
<h4 class="subsection">3.4.3 C functions</h4>
|
||
|
|
||
|
<p>C functions can be created with
|
||
|
<code>JS_NewCFunction()</code>. <code>JS_SetPropertyFunctionList()</code> is a
|
||
|
shortcut to easily add functions, setters and getters properties to a
|
||
|
given object.
|
||
|
</p>
|
||
|
<p>Unlike other embedded Javascript engines, there is no implicit stack,
|
||
|
so C functions get their parameters as normal C parameters. As a
|
||
|
general rule, C functions take constant <code>JSValue</code>s as parameters
|
||
|
(so they don’t need to free them) and return a newly allocated (=live)
|
||
|
<code>JSValue</code>.
|
||
|
</p>
|
||
|
<a name="Exceptions"></a>
|
||
|
<h4 class="subsection">3.4.4 Exceptions</h4>
|
||
|
|
||
|
<p>Exceptions: most C functions can return a Javascript exception. It
|
||
|
must be explicitely tested and handled by the C code. The specific
|
||
|
<code>JSValue</code> <code>JS_EXCEPTION</code> indicates that an exception
|
||
|
occured. The actual exception object is stored in the
|
||
|
<code>JSContext</code> and can be retrieved with <code>JS_GetException()</code>.
|
||
|
</p>
|
||
|
<a name="Script-evaluation"></a>
|
||
|
<h4 class="subsection">3.4.5 Script evaluation</h4>
|
||
|
|
||
|
<p>Use <code>JS_Eval()</code> to evaluate a script or module source.
|
||
|
</p>
|
||
|
<p>If the script or module was compiled to bytecode with <code>qjsc</code>, it
|
||
|
can be evaluated by calling <code>js_std_eval_binary()</code>. The advantage
|
||
|
is that no compilation is needed so it is faster and smaller because
|
||
|
the compiler can be removed from the executable if no <code>eval</code> is
|
||
|
required.
|
||
|
</p>
|
||
|
<p>Note: the bytecode format is linked to a given QuickJS
|
||
|
version. Moreover, no security check is done before its
|
||
|
execution. Hence the bytecode should not be loaded from untrusted
|
||
|
sources. That’s why there is no option to output the bytecode to a
|
||
|
binary file in <code>qjsc</code>.
|
||
|
</p>
|
||
|
<a name="JS-Classes"></a>
|
||
|
<h4 class="subsection">3.4.6 JS Classes</h4>
|
||
|
|
||
|
<p>C opaque data can be attached to a Javascript object. The type of the
|
||
|
C opaque data is determined with the class ID (<code>JSClassID</code>) of
|
||
|
the object. Hence the first step is to register a new class ID and JS
|
||
|
class (<code>JS_NewClassID()</code>, <code>JS_NewClass()</code>). Then you can
|
||
|
create objects of this class with <code>JS_NewObjectClass()</code> and get or
|
||
|
set the C opaque point with
|
||
|
<code>JS_GetOpaque()</code>/<code>JS_SetOpaque()</code>.
|
||
|
</p>
|
||
|
<p>When defining a new JS class, it is possible to declare a finalizer
|
||
|
which is called when the object is destroyed. A <code>gc_mark</code> method
|
||
|
can be provided so that the cycle removal algorithm can find the other
|
||
|
objects referenced by this object. Other methods are available to
|
||
|
define exotic object behaviors.
|
||
|
</p>
|
||
|
<p>The Class ID are globally allocated (i.e. for all runtimes). The
|
||
|
JSClass are allocated per <code>JSRuntime</code>. <code>JS_SetClassProto()</code>
|
||
|
is used to define a prototype for a given class in a given
|
||
|
JSContext. <code>JS_NewObjectClass()</code> sets this prototype in the
|
||
|
created object.
|
||
|
</p>
|
||
|
<p>Examples are available in <samp>quickjs-libc.c</samp>.
|
||
|
</p>
|
||
|
<a name="C-Modules"></a>
|
||
|
<h4 class="subsection">3.4.7 C Modules</h4>
|
||
|
|
||
|
<p>Native ES6 modules are supported and can be dynamically or statically
|
||
|
linked. Look at the <samp>test_bjson</samp> and <samp>bjson.so</samp>
|
||
|
examples. The standard library <samp>quickjs-libc.c</samp> is also a good example
|
||
|
of a native module.
|
||
|
</p>
|
||
|
<a name="Memory-handling"></a>
|
||
|
<h4 class="subsection">3.4.8 Memory handling</h4>
|
||
|
|
||
|
<p>Use <code>JS_SetMemoryLimit()</code> to set a global memory allocation limit
|
||
|
to a given JSRuntime.
|
||
|
</p>
|
||
|
<p>Custom memory allocation functions can be provided with
|
||
|
<code>JS_NewRuntime2()</code>.
|
||
|
</p>
|
||
|
<p>The maximum system stack size can be set with <code>JS_SetMaxStackSize()</code>.
|
||
|
</p>
|
||
|
<a name="Execution-timeout-and-interrupts"></a>
|
||
|
<h4 class="subsection">3.4.9 Execution timeout and interrupts</h4>
|
||
|
|
||
|
<p>Use <code>JS_SetInterruptHandler()</code> to set a callback which is
|
||
|
regularly called by the engine when it is executing code. This
|
||
|
callback can be used to implement an execution timeout.
|
||
|
</p>
|
||
|
<p>It is used by the command line interpreter to implement a
|
||
|
<code>Ctrl-C</code> handler.
|
||
|
</p>
|
||
|
<a name="Internals"></a>
|
||
|
<h2 class="chapter">4 Internals</h2>
|
||
|
|
||
|
<a name="Bytecode"></a>
|
||
|
<h3 class="section">4.1 Bytecode</h3>
|
||
|
|
||
|
<p>The compiler generates bytecode directly with no intermediate
|
||
|
representation such as a parse tree, hence it is very fast. Several
|
||
|
optimizations passes are done over the generated bytecode.
|
||
|
</p>
|
||
|
<p>A stack-based bytecode was chosen because it is simple and generates
|
||
|
compact code.
|
||
|
</p>
|
||
|
<p>For each function, the maximum stack size is computed at compile time so that
|
||
|
no runtime stack overflow tests are needed.
|
||
|
</p>
|
||
|
<p>A separate compressed line number table is maintained for the debug
|
||
|
information.
|
||
|
</p>
|
||
|
<p>Access to closure variables is optimized and is almost as fast as local
|
||
|
variables.
|
||
|
</p>
|
||
|
<p>Direct <code>eval</code> in strict mode is optimized.
|
||
|
</p>
|
||
|
<a name="Executable-generation"></a>
|
||
|
<h3 class="section">4.2 Executable generation</h3>
|
||
|
|
||
|
<a name="qjsc-compiler-1"></a>
|
||
|
<h4 class="subsection">4.2.1 <code>qjsc</code> compiler</h4>
|
||
|
|
||
|
<p>The <code>qjsc</code> compiler generates C sources from Javascript files. By
|
||
|
default the C sources are compiled with the system compiler
|
||
|
(<code>gcc</code> or <code>clang</code>).
|
||
|
</p>
|
||
|
<p>The generated C source contains the bytecode of the compiled functions
|
||
|
or modules. If a full complete executable is needed, it also
|
||
|
contains a <code>main()</code> function with the necessary C code to initialize the
|
||
|
Javascript engine and to load and execute the compiled functions and
|
||
|
modules.
|
||
|
</p>
|
||
|
<p>Javascript code can be mixed with C modules.
|
||
|
</p>
|
||
|
<p>In order to have smaller executables, specific Javascript features can
|
||
|
be disabled, in particular <code>eval</code> or the regular expressions. The
|
||
|
code removal relies on the Link Time Optimization of the system
|
||
|
compiler.
|
||
|
</p>
|
||
|
<a name="Binary-JSON"></a>
|
||
|
<h4 class="subsection">4.2.2 Binary JSON</h4>
|
||
|
|
||
|
<p><code>qjsc</code> works by compiling scripts or modules and then serializing
|
||
|
them to a binary format. A subset of this format (without functions or
|
||
|
modules) can be used as binary JSON. The example <samp>test_bjson.js</samp>
|
||
|
shows how to use it.
|
||
|
</p>
|
||
|
<p>Warning: the binary JSON format may change without notice, so it
|
||
|
should not be used to store persistent data. The <samp>test_bjson.js</samp>
|
||
|
example is only used to test the binary object format functions.
|
||
|
</p>
|
||
|
<a name="Runtime"></a>
|
||
|
<h3 class="section">4.3 Runtime</h3>
|
||
|
|
||
|
<a name="Strings"></a>
|
||
|
<h4 class="subsection">4.3.1 Strings</h4>
|
||
|
|
||
|
<p>Strings are stored either as an 8 bit or a 16 bit array of
|
||
|
characters. Hence random access to characters is always fast.
|
||
|
</p>
|
||
|
<p>The C API provides functions to convert Javascript Strings to C UTF-8 encoded
|
||
|
strings. The most common case where the Javascript string contains
|
||
|
only ASCII characters involves no copying.
|
||
|
</p>
|
||
|
<a name="Objects"></a>
|
||
|
<h4 class="subsection">4.3.2 Objects</h4>
|
||
|
|
||
|
<p>The object shapes (object prototype, property names and flags) are shared
|
||
|
between objects to save memory.
|
||
|
</p>
|
||
|
<p>Arrays with no holes (except at the end of the array) are optimized.
|
||
|
</p>
|
||
|
<p>TypedArray accesses are optimized.
|
||
|
</p>
|
||
|
<a name="Atoms"></a>
|
||
|
<h4 class="subsection">4.3.3 Atoms</h4>
|
||
|
|
||
|
<p>Object property names and some strings are stored as Atoms (unique
|
||
|
strings) to save memory and allow fast comparison. Atoms are
|
||
|
represented as a 32 bit integer. Half of the atom range is reserved for
|
||
|
immediate integer literals from <em>0</em> to <em>2^{31}-1</em>.
|
||
|
</p>
|
||
|
<a name="Numbers"></a>
|
||
|
<h4 class="subsection">4.3.4 Numbers</h4>
|
||
|
|
||
|
<p>Numbers are represented either as 32-bit signed integers or 64-bit IEEE-754
|
||
|
floating point values. Most operations have fast paths for the 32-bit
|
||
|
integer case.
|
||
|
</p>
|
||
|
<a name="Garbage-collection"></a>
|
||
|
<h4 class="subsection">4.3.5 Garbage collection</h4>
|
||
|
|
||
|
<p>Reference counting is used to free objects automatically and
|
||
|
deterministically. A separate cycle removal pass is done when the allocated
|
||
|
memory becomes too large. The cycle removal algorithm only uses the
|
||
|
reference counts and the object content, so no explicit garbage
|
||
|
collection roots need to be manipulated in the C code.
|
||
|
</p>
|
||
|
<a name="JSValue-1"></a>
|
||
|
<h4 class="subsection">4.3.6 JSValue</h4>
|
||
|
|
||
|
<p>It is a Javascript value which can be a primitive type (such as
|
||
|
Number, String, ...) or an Object. NaN boxing is used in the 32-bit version
|
||
|
to store 64-bit floating point numbers. The representation is
|
||
|
optimized so that 32-bit integers and reference counted values can be
|
||
|
efficiently tested.
|
||
|
</p>
|
||
|
<p>In 64-bit code, JSValue are 128-bit large and no NaN boxing is used. The
|
||
|
rationale is that in 64-bit code memory usage is less critical.
|
||
|
</p>
|
||
|
<p>In both cases (32 or 64 bits), JSValue exactly fits two CPU registers,
|
||
|
so it can be efficiently returned by C functions.
|
||
|
</p>
|
||
|
<a name="Function-call"></a>
|
||
|
<h4 class="subsection">4.3.7 Function call</h4>
|
||
|
|
||
|
<p>The engine is optimized so that function calls are fast. The system
|
||
|
stack holds the Javascript parameters and local variables.
|
||
|
</p>
|
||
|
<a name="RegExp"></a>
|
||
|
<h3 class="section">4.4 RegExp</h3>
|
||
|
|
||
|
<p>A specific regular expression engine was developped. It is both small
|
||
|
and efficient and supports all the ES2020 features including the
|
||
|
Unicode properties. As the Javascript compiler, it directly generates
|
||
|
bytecode without a parse tree.
|
||
|
</p>
|
||
|
<p>Backtracking with an explicit stack is used so that there is no
|
||
|
recursion on the system stack. Simple quantizers are specifically
|
||
|
optimized to avoid recursions.
|
||
|
</p>
|
||
|
<p>Infinite recursions coming from quantizers with empty terms are
|
||
|
avoided.
|
||
|
</p>
|
||
|
<p>The full regexp library weights about 15 KiB (x86 code), excluding the
|
||
|
Unicode library.
|
||
|
</p>
|
||
|
<a name="Unicode"></a>
|
||
|
<h3 class="section">4.5 Unicode</h3>
|
||
|
|
||
|
<p>A specific Unicode library was developped so that there is no
|
||
|
dependency on an external large Unicode library such as ICU. All the
|
||
|
Unicode tables are compressed while keeping a reasonnable access
|
||
|
speed.
|
||
|
</p>
|
||
|
<p>The library supports case conversion, Unicode normalization, Unicode
|
||
|
script queries, Unicode general category queries and all Unicode
|
||
|
binary properties.
|
||
|
</p>
|
||
|
<p>The full Unicode library weights about 45 KiB (x86 code).
|
||
|
</p>
|
||
|
<a name="BigInt-and-BigFloat"></a>
|
||
|
<h3 class="section">4.6 BigInt and BigFloat</h3>
|
||
|
|
||
|
<p>BigInt and BigFloat are implemented with the <code>libbf</code>
|
||
|
library<a name="DOCF7" href="#FOOT7"><sup>7</sup></a>. It weights about 60
|
||
|
KiB (x86 code) and provides arbitrary precision IEEE 754 floating
|
||
|
point operations and transcendental functions with exact rounding.
|
||
|
</p>
|
||
|
<a name="License"></a>
|
||
|
<h2 class="chapter">5 License</h2>
|
||
|
|
||
|
<p>QuickJS is released under the MIT license.
|
||
|
</p>
|
||
|
<p>Unless otherwise specified, the QuickJS sources are copyright Fabrice
|
||
|
Bellard and Charlie Gordon.
|
||
|
</p>
|
||
|
<div class="footnote">
|
||
|
<hr>
|
||
|
<h4 class="footnotes-heading">Footnotes</h4>
|
||
|
|
||
|
<h3><a name="FOOT1" href="#DOCF1">(1)</a></h3>
|
||
|
<p><a href="https://www.ecma-international.org/ecma-262/10.0">https://www.ecma-international.org/ecma-262/10.0</a></p>
|
||
|
<h3><a name="FOOT2" href="#DOCF2">(2)</a></h3>
|
||
|
<p><a href="https://github.com/tc39/test262">https://github.com/tc39/test262</a></p>
|
||
|
<h3><a name="FOOT3" href="#DOCF3">(3)</a></h3>
|
||
|
<p><a href="https://tc39.github.io/ecma262/">https://tc39.github.io/ecma262/</a></p>
|
||
|
<h3><a name="FOOT4" href="#DOCF4">(4)</a></h3>
|
||
|
<p>The old ES5.1 tests can be extracted with
|
||
|
<code>git clone --single-branch --branch es5-tests
|
||
|
https://github.com/tc39/test262.git test262o</code></p>
|
||
|
<h3><a name="FOOT5" href="#DOCF5">(5)</a></h3>
|
||
|
<p><a href="https://github.com/bterlson/test262-harness">https://github.com/bterlson/test262-harness</a></p>
|
||
|
<h3><a name="FOOT6" href="#DOCF6">(6)</a></h3>
|
||
|
<p>We believe the current specification of tails calls is too complicated and presents limited practical interests.</p>
|
||
|
<h3><a name="FOOT7" href="#DOCF7">(7)</a></h3>
|
||
|
<p><a href="https://bellard.org/libbf">https://bellard.org/libbf</a></p>
|
||
|
</div>
|
||
|
<hr>
|
||
|
|
||
|
|
||
|
|
||
|
</body>
|
||
|
</html>
|