Add TextEncoder and TextDecoder built-ins, which allow Ecmascript code
to read and write text stored in ArrayBuffers. Based on the WHATWG
Encoding Living Standard:
https://encoding.spec.whatwg.org/#api
This avoids the need for a function call and up to two property lookups
for a `Math.pow()` invocation, as well as allowing expressions like
`2 ** 16` to be inlined at compile time.
Exponentiation uses the same internal handler as `Math.pow()`, per the
ES7 specification.
Usage:
x = base ** exp;
x **= 2;
Optimization to avoid a temporary for x <op>= y works for any RHS
which doesn't emit code when evaluated to an ivalue, e.g.:
* A plain constant or any expression which constant folds to a
constant, e.g.: x += 4 and x += 'foo' + 'bar'.
* A register-bound variable, e.g. x += y.
The optimization doesn't have enough state to detect safe cases
such as register bound 'y' in: x += y + 1.
Saves a few hundred bytes of footprint:
* duk_dup_0() = duk_dup(ctx, 0), duk_dup_1() = duk_dup(ctx, 1), etc.
* duk_dup_m2() = duk_dup(ctx, -2), etc.
* duk_dup_m1() is not added, because duk_dup_top() is the same thing
Add minimal fast paths for Array.prototype operations like push() and pop(),
triggered when the 'this' binding is an Array which has its array part still
present. This is the most common case and user code will expect for example
Array.prototype.push() to be relatively fast.
The main purpose of this commit is to figure out the necessary internal
helpers for fast paths. More fast paths will be added separately.