|
@@ -1,8 +1,27 @@
|
|
|
package goja
|
|
|
|
|
|
-// ported from https://gist.github.com/orlp/3551590
|
|
|
+// inspired by https://gist.github.com/orlp/3551590
|
|
|
|
|
|
-var highest_bit_set = [256]byte{
|
|
|
+var overflows = [64]int64{
|
|
|
+ 9223372036854775807, 9223372036854775807, 3037000499, 2097151,
|
|
|
+ 55108, 6208, 1448, 511,
|
|
|
+ 234, 127, 78, 52,
|
|
|
+ 38, 28, 22, 18,
|
|
|
+ 15, 13, 11, 9,
|
|
|
+ 8, 7, 7, 6,
|
|
|
+ 6, 5, 5, 5,
|
|
|
+ 4, 4, 4, 4,
|
|
|
+ 3, 3, 3, 3,
|
|
|
+ 3, 3, 3, 3,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+ 2, 2, 2, 2,
|
|
|
+}
|
|
|
+
|
|
|
+var highestBitSet = [63]byte{
|
|
|
0, 1, 2, 2, 3, 3, 3, 3,
|
|
|
4, 4, 4, 4, 4, 4, 4, 4,
|
|
|
5, 5, 5, 5, 5, 5, 5, 5,
|
|
@@ -10,38 +29,11 @@ var highest_bit_set = [256]byte{
|
|
|
6, 6, 6, 6, 6, 6, 6, 6,
|
|
|
6, 6, 6, 6, 6, 6, 6, 6,
|
|
|
6, 6, 6, 6, 6, 6, 6, 6,
|
|
|
- 6, 6, 6, 6, 6, 6, 6, 255, // anything past 63 is a guaranteed overflow with base > 1
|
|
|
- 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,
|
|
|
- 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,
|
|
|
+ 6, 6, 6, 6, 6, 6, 6,
|
|
|
}
|
|
|
|
|
|
func ipow(base, exp int64) (result int64) {
|
|
|
- result = 1
|
|
|
-
|
|
|
- switch highest_bit_set[byte(exp)] {
|
|
|
- case 255: // we use 255 as an overflow marker and return 0 on overflow/underflow
|
|
|
+ if exp >= 63 {
|
|
|
if base == 1 {
|
|
|
return 1
|
|
|
}
|
|
@@ -51,6 +43,15 @@ func ipow(base, exp int64) (result int64) {
|
|
|
}
|
|
|
|
|
|
return 0
|
|
|
+ }
|
|
|
+
|
|
|
+ if base > overflows[exp] || -base > overflows[exp] {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+
|
|
|
+ result = 1
|
|
|
+
|
|
|
+ switch highestBitSet[byte(exp)] {
|
|
|
case 6:
|
|
|
if exp&1 != 0 {
|
|
|
result *= base
|