Improve BigInt support (#4118)

This patch adds several small features:
- Support right shift with negative numbers
- Support exponentation operator
- BigInts can be enabled in ES5.1 mode
- Remove dead code from ecma_deref_bigint
- Support longer BigInt literals in the parser
- Fix various BigInt comparison issues
- Do not discard unary plus for BigInt constants

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2020-08-11 11:25:01 +02:00
committed by GitHub
parent 286e515f9f
commit f761427a3e
13 changed files with 409 additions and 138 deletions
+10
View File
@@ -227,6 +227,16 @@ check_result16(BigInt("0x8fef5fcfffef5fcfffef5fcfffef5fcff") >> BigInt("51"), "1
check_result16(BigInt("0x8fef5fcfffef5fcfffef5fcfffef5fcff") >> BigInt("63"), "11fdebf9fffdebf9ff")
check_result16(BigInt("0x8fef5fcfffef5fcfffef5fcfffef5fcff") >> BigInt("64"), "8fef5fcfffef5fcff")
check_result16(-BigInt("0xff") >> BigInt("8"), "-1")
check_result16(-BigInt("0xff") >> BigInt("1000"), "-1")
check_result16(-BigInt("0xff") >> BigInt("7"), "-2")
check_result16(-BigInt("0xff00000000") >> BigInt("32"), "-ff")
check_result16(-BigInt("0xff80000000") >> BigInt("32"), "-100")
check_result16(-BigInt("0xff00000000000000000000000000000000") >> BigInt("128"), "-ff")
check_result16(-BigInt("0xff80000000000000000000000000000000") >> BigInt("128"), "-100")
check_result16(-BigInt("0xfe00000000000000000000000000000000") >> BigInt("129"), "-7f")
check_result16(-BigInt("0xff00000000000000000000000000000000") >> BigInt("129"), "-80")
check_result16(BigInt("0x8fef5fcfffef5fcfffef5fcfffef5fcff") >> BigInt("10000000000000000000000000"), "0")
try {
+55
View File
@@ -0,0 +1,55 @@
/* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Exponentiation
try {
12n ** -7n
assert(false)
} catch (e) {
assert(e instanceof RangeError)
}
assert((0n ** 0n) === 1n)
assert((1n ** 0n) === 1n)
assert(((-2n) ** 0n) === 1n)
assert((1000000000000000000000000000000000n ** 0n) === 1n)
assert(((-1000000000000000000000000000000000n) ** 0n) === 1n)
assert((1n ** 1n) === 1n)
assert((1n ** 10000000000000000000000000000000n) === 1n)
assert(((-1n) ** 1n) === -1n)
assert(((-1n) ** 10000000000000000000000000000000n) === 1n)
assert(((-1n) ** 10000000000000000000000000000001n) === -1n)
assert((2n ** 10n) === 1024n)
assert((2n ** 11n) === 2048n)
assert(((-2n) ** 10n) === 1024n)
assert(((-2n) ** 11n) === -2048n)
assert((2n ** 64n) === 0x10000000000000000n)
assert((2n ** 65n) === 0x20000000000000000n)
assert(((-2n) ** 64n) === 0x10000000000000000n)
assert(((-2n) ** 65n) === -0x20000000000000000n)
assert((2n ** 190n) === 0x400000000000000000000000000000000000000000000000n)
assert((2n ** 191n) === 0x800000000000000000000000000000000000000000000000n)
assert(((-2n) ** 190n) === 0x400000000000000000000000000000000000000000000000n)
assert(((-2n) ** 191n) === -0x800000000000000000000000000000000000000000000000n)
assert((103n ** 32n) === 25750827556851106532658069028441289322166445432839581773436522241n)
assert((103n ** 31n) === 250008034532535014880175427460595041962781023619801764790645847n)
assert(((-79n) ** 32n) === 5297450670659957549009604563595170759963655420038456036451841n)
assert(((-79n) ** 31n) === -67056337603290601886197526121457857721058929367575392866479n)
-29
View File
@@ -658,7 +658,6 @@
<test id="built-ins/BigInt/asUintN/order-of-steps.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-empty-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-trailing-leading-spaces.js"><reason></reason></test>
<test id="built-ins/BigInt/non-integer-rangeerror.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/a-z.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/length.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/valueOf/cross-realm.js"><reason></reason></test>
@@ -6134,9 +6133,6 @@
<test id="language/expressions/compound-assignment/S11.13.2_A7.9_T4.js"><reason></reason></test>
<test id="language/expressions/conditional/tco-cond.js"><reason></reason></test>
<test id="language/expressions/conditional/tco-pos.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-object.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/always-create-new-promise.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/assign-expr-get-value-abrupt-throws.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/assignment-expression/additive-expr.js"><reason></reason></test>
@@ -6547,15 +6543,7 @@
<test id="language/expressions/dynamic-import/usage/top-level-import-then-is-call-expression-square-brackets.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/usage/top-level-import-then-returns-thenable.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-object.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/equals/coerce-symbol-to-prim-return-prim.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-negative-exponent-throws.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-zero-base-zero-exponent.js"><reason></reason></test>
<test id="language/expressions/function/arguments-with-arguments-fn.js"><reason></reason></test>
<test id="language/expressions/function/arguments-with-arguments-lex.js"><reason></reason></test>
<test id="language/expressions/function/dflt-params-trailing-comma.js"><reason></reason></test>
@@ -6591,24 +6579,11 @@
<test id="language/expressions/generators/name.js"><reason></reason></test>
<test id="language/expressions/generators/named-yield-identifier-spread-non-strict.js"><reason></reason></test>
<test id="language/expressions/generators/yield-identifier-spread-non-strict.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/import.meta/distinct-for-each-module.js"><reason></reason></test>
<test id="language/expressions/import.meta/import-meta-is-an-ordinary-object.js"><reason></reason></test>
<test id="language/expressions/import.meta/same-object-returned.js"><reason></reason></test>
<test id="language/expressions/import.meta/syntax/goal-module-nested-function.js"><reason></reason></test>
<test id="language/expressions/import.meta/syntax/goal-module.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/logical-and/tco-right.js"><reason></reason></test>
<test id="language/expressions/logical-assignment/lgcl-and-assignment-operator-bigint.js"><reason></reason></test>
<test id="language/expressions/logical-assignment/lgcl-and-assignment-operator-lhs-before-rhs.js"><reason></reason></test>
@@ -6777,9 +6752,6 @@
<test id="language/expressions/prefix-increment/S11.4.4_A5_T4.js"><reason></reason></test>
<test id="language/expressions/prefix-increment/S11.4.4_A5_T5.js"><reason></reason></test>
<test id="language/expressions/prefix-increment/S11.4.4_A6_T3.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/super/call-proto-not-ctor.js"><reason></reason></test>
<test id="language/expressions/super/call-spread-obj-spread-order.js"><reason></reason></test>
<test id="language/expressions/super/call-spread-obj-symbol-property.js"><reason></reason></test>
@@ -6800,7 +6772,6 @@
<test id="language/expressions/tco-pos.js"><reason></reason></test>
<test id="language/expressions/template-literal/invalid-legacy-octal-escape-sequence.js"><reason></reason></test>
<test id="language/expressions/typeof/proxy.js"><reason></reason></test>
<test id="language/expressions/unary-plus/bigint-throws.js"><reason></reason></test>
<test id="language/expressions/yield/star-return-is-null.js"><reason></reason></test>
<test id="language/expressions/yield/star-rhs-iter-rtrn-no-rtrn.js"><reason></reason></test>
<test id="language/expressions/yield/star-throw-is-null.js"><reason></reason></test>