You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
5.8 KiB

=========================
Duktape 2.3 release notes
=========================
Release overview
================
Main changes in this release (see RELEASES.rst for full details):
* duk_xxx_literal() API call variants which take a plain C literal argument,
for example duk_get_prop_literal(ctx, -2, "myProperty"). The calls are
conceptually similar to the duk_xxx_string() variants, but can take advantage
of the fact that e.g. string length for a C literal can be determined at
compile time using sizeof("myProperty") - 1 (the -1 is for NUL termination).
Literal strings used by application code are also automatically pinned
between mark-and-sweep rounds, and a small lookup cache makes mapping a C
literal to a heap string object quite fast (almost as fast as using a heapptr).
For now the calls are experimental.
* More ES2015 support: Symbol.hasInstance, Symbol.toStringTag,
Symbol.isConcatSpreadable, Symbol.toPrimitive, Proxy improvements,
Number.EPSILON, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER,
Number.isFinite(), Number.isNaN(), Number.isSafeInteger(),
Number.parseInt(), Number.parseFloat().
* Other API additions: duk_random(), duk_push_new_target(),
duk_get_global_heapptr(), duk_put_global_heapptr().
* When C++ exception support is enabled (DUK_USE_CPP_EXCEPTIONS), Duktape now
uses a C++ exception throw also for fatal errors (e.g. uncaught error). The
exception thrown has the type ``duk_fatal_exception`` which inherits from
``std::runtime_error`` so it has a ::what() method and a useful message.
* DUK_USE_ALIGN_BY now always defaults to 8 (natural alignment) to avoid any
potentially unsafe assumptions about compiler behavior for unaligned memory
accesses and pointers (which may be an issue even on x86).
* A new CBOR encoder/decoder extra which may be eventually merged (in some
form) into Duktape itself. CBOR is a useful binary serialization format
which is a superset of JSON and has an RFC specification.
* A Promise polyfill which will be used as a basis for the initial native
implementation.
* Various fixes and portability improvements.
Upgrading from Duktape 2.2
==========================
No action (other than recompiling) should be needed for most users to upgrade
from Duktape v2.2.x. Note the following:
* If you are using DUK_USE_CPP_EXCEPTIONS note that fatal errors are now
thrown using a C++ exception of the type ``duk_fatal_exception`` which
inherits from ``std::runtime_error`` and will be caught by a boilerplate
``std::exception`` catch. In previous versions uncaught errors would
propagate out as ``duk_internal_exception``\s, while assertions would
default to ``abort()``. As before, it is unsafe to continue after catching
a ``duk_fatal_exception``. You can override the new behavior by:
- Providing an explicit fatal error handler in heap creation. This affects
heap related fatal errors (like uncaught exceptions), but won't affect
fatal errors without a heap context (like assertions).
- Providing an explicit default fatal error handler using the
``DUK_USE_FATAL_HANDLER`` config option. This affects both types of
fatal errors.
* If performance matters, you might consider using duk_xxx_literal() variants
in place of duk_xxx_string() variants when the argument is a C literal.
With literal pinning and the literal lookup cache this improves property
access performance around 20% with minimal application changes. Make sure
that the arguments are C literals, e.g. duk_get_prop_literal(ctx, "mykey")
and not pointers to strings like duk_get_prop_literal(ctx, strptr).
* If you're using the duk_xxx_heapptr() API call variants, you might consider
switching to the duk_xxx_literal() variants. They are less error prone, and
with literal pinning and the literal lookup cache almost as fast as using a
borrowed heap pointer.
* If you're working with a low memory target or any other target where memory
usage matters, you may want to ensure UDK_USE_LITCACHE_SIZE is undefined in
configure.py configuration (this is included in low_memory.yaml base config).
* If you're working with a low memory target or any other target where memory
usage matters, you may want to force DUK_USE_ALIGN_BY to a lower value
(4 or 1) to reduce memory overhead. For most targets the memory overhead
is not important.
* Base-64 and hex encoding/decoding support is now configurable and disabled
by default in the example low_memory.yaml configuration. Enable them
manually if necessary using DUK_USE_BASE64_SUPPORT and DUK_USE_HEX_SUPPORT.
* The built-in base64 decoder is now more lenient. If you're relying on
strictness or specific behavior of the base64 decoder, you should use an
external decoder with the exact behavior desired (base64 decoders differ
quite a lot with respect to various decoding corner cases).
* Several -fsanitize=undefined warnings have been fixed in the default
configuration using explicit checks to avoid undefined behavior. For
example, floating point division by zero is avoided and behavior in that
case is implemented explicitly, at some cost in footprint and performance.
For many compilers the undefined behavior assumptions in Duktape source
are fine, and you can remove the extra overhead by enabling the
DUK_USE_ALLOW_UNDEFINED_BEHAVIOR option in configure.py (this option is
enabled in the low_memory.yaml and performance_sensitive.yaml example
configurations). Note, however, that recent gcc/clang versions are
optimizing around undefined behavior so while relying on undefined behavior
may work in one version, it may break with newer compiler versions.
* The console extra (extras/console) now by default uses ``stdout`` for log
levels up to info, and ``stderr`` for warn and above. To restore previous
behavior (stdout only) use the ``DUK_CONSOLE_STDOUT_ONLY`` flag in
``duk_console_init()``.