Add Array#join and Array#toString + dtoa (#275)

This commit is contained in:
Max Graey
2018-10-01 23:57:56 +03:00
committed by Daniel Wirtz
parent ff87857f40
commit 53b030fed5
16 changed files with 22635 additions and 2229 deletions

View File

@ -637,7 +637,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 136)
(i32.const 23)
(i32.const 37)
(i32.const 39)
)
(unreachable)
@ -737,7 +737,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 136)
(i32.const 23)
(i32.const 37)
(i32.const 39)
)
(unreachable)

File diff suppressed because it is too large Load Diff

View File

@ -730,3 +730,39 @@ assert(isArraysEqual<string>(randomStringsActual, randomStringsExpected));
var randomStrings400 = createRandomStringArray(400);
assertSorted<string>(randomStrings400, (a: string, b: string): i32 => <i32>(a > b) - <i32>(a < b));
// Array#join //////////////////////////////////////////////////////////////////////////////////////
class Ref { constructor() {} }
assert((<bool[]>[true, false]).join() == "true,false");
assert((<i32[]>[1,-2,-3]).join("") == "1-2-3");
assert((<u32[]>[1, 2, 3]).join("-") == "1-2-3");
assert((<i32[]>[i32.MIN_VALUE, i32.MIN_VALUE]).join("__") == "-2147483648__-2147483648");
assert((<f64[]>[0.0, 1.0, -2.0, NaN, -Infinity, Infinity]).join(", ") == "0.0, 1.0, -2.0, NaN, -Infinity, Infinity");
assert((<string[]>["", "1", null]).join("") == "1");
var refArr: Ref[] = [new Ref(), null, new Ref()];
assert(refArr.join() == "[object Object],,[object Object]");
// Array#toString //////////////////////////////////////////////////////////////////////////////////
assert(reversed0.toString() == "");
assert(reversed1.toString() == "1");
assert(reversed2.toString() == "1,2");
assert(reversed4.toString() == "0,1,2,3");
assert((<i8[]>[1, -1, 0]).toString() == "1,-1,0");
assert((<u16[]>[1, 0xFFFF, 0]).toString() == "1,65535,0");
assert((<u64[]>[1, 0xFFFFFFFFFFFFFFFF, 0]).toString() == "1,18446744073709551615,0");
assert((<i64[]>[-1, -1234567890123456, 0, i64.MAX_VALUE]).toString() == "-1,-1234567890123456,0,9223372036854775807");
assert(randomStringsExpected.toString() == ",a,a,ab,b,ba,");
assert((<string[]>["1", "2", null, "4"]).toString() == "1,2,,4");
var subarr32: i32[][] = [[1,2], [3,4]];
assert(subarr32.toString() == "1,2,3,4");
var subarr8: u8[][] = [[1,2], [3,4]];
assert(subarr8.toString() == "1,2,3,4");
var subarrU32: u32[][][] = [[[1]]];
assert(subarrU32.toString() == "1");

File diff suppressed because it is too large Load Diff

View File

@ -2774,7 +2774,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 72)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)

View File

@ -3478,7 +3478,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 72)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)

View File

@ -2905,7 +2905,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 184)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)
@ -3011,7 +3011,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 184)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)
@ -3117,7 +3117,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 184)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)
@ -3223,7 +3223,7 @@
(call $~lib/env/abort
(i32.const 0)
(i32.const 184)
(i32.const 87)
(i32.const 101)
(i32.const 41)
)
(unreachable)

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,12 @@
import "allocator/arena";
import { utoa32, itoa32, utoa64, itoa64 } from "internal/itoa";
import {
utoa32,
itoa32,
utoa64,
itoa64,
itoa,
dtoa
} from "internal/number";
// preliminary
@ -169,3 +175,70 @@ assert(itoa64(-999868719476735) == "-999868719476735");
assert(itoa64(-19999868719476735) == "-19999868719476735");
assert(itoa64(i64.MAX_VALUE) == "9223372036854775807");
assert(itoa64(i64.MIN_VALUE) == "-9223372036854775808");
// special cases
assert(dtoa(0.0) == "0.0");
assert(dtoa(-0.0) == "0.0");
assert(dtoa(NaN) == "NaN");
assert(dtoa(+Infinity) == "Infinity");
assert(dtoa(-Infinity) == "-Infinity");
assert(dtoa(+f64.EPSILON) == "2.220446049250313e-16");
assert(dtoa(-f64.EPSILON) == "-2.220446049250313e-16");
assert(dtoa(+f64.MAX_VALUE) == "1.7976931348623157e+308");
assert(dtoa(-f64.MAX_VALUE) == "-1.7976931348623157e+308");
assert(dtoa(4.185580496821357e+298) == "4.185580496821357e+298");
assert(dtoa(2.2250738585072014e-308) == "2.2250738585072014e-308");
assert(dtoa(2.98023223876953125e-8) == "2.9802322387695312e-8");
assert(dtoa(-2.109808898695963e+16) == "-21098088986959630.0");
assert(dtoa(4.940656E-318) == "4.940656e-318");
assert(dtoa(9.0608011534336e+15) == "9060801153433600.0");
assert(dtoa(4.708356024711512e+18) == "4708356024711512000.0");
assert(dtoa(9.409340012568248e+18) == "9409340012568248000.0");
assert(dtoa(5e-324) == "5e-324");
// Known imprecise issue for Grisu alghoritm. Need workaround
// Expeced: 1.2345e+21
// Actual: 1.2344999999999999e+21
// assert(dtoa(1.2345e+21) == "1.2345e+21");
assert(dtoa(1.0) == "1.0");
assert(dtoa(0.1) == "0.1");
assert(dtoa(-1.0) == "-1.0");
assert(dtoa(-0.1) == "-0.1");
assert(dtoa(1e+6) == "1000000.0");
assert(dtoa(1e-6) == "0.000001");
assert(dtoa(-1e+6) == "-1000000.0");
assert(dtoa(-1e-6) == "-0.000001");
assert(dtoa(1e+7) == "10000000.0");
assert(dtoa(1e-7) == "1e-7");
assert(dtoa(1e+308) == "1e+308");
assert(dtoa(-1e+308) == "-1e+308");
assert(dtoa(1e+309) == "Infinity");
assert(dtoa(-1e+309) == "-Infinity");
assert(dtoa(1e-308) == "1e-308");
assert(dtoa(-1e-308) == "-1e-308");
assert(dtoa(1e-323) == "1e-323");
assert(dtoa(-1e-323) == "-1e-323");
assert(dtoa(1e-324) == "0.0");
assert(dtoa(4294967272) == "4294967272.0");
assert(dtoa(1.23121456734562345678e-8) == "1.2312145673456234e-8");
assert(dtoa(-0.0000010471975511965976) == "-0.0000010471975511965976");
assert(dtoa(555555555.55555555) == "555555555.5555556");
assert(dtoa(0.9999999999999999) == "0.9999999999999999");
assert(dtoa(0.99999999999999995) == "1.0");
assert(dtoa(1234e-2) == "12.34");
assert(dtoa(0.1 + 0.2) == "0.30000000000000004");
assert(dtoa(1.0 / 3.0) == "0.3333333333333333");
assert(dtoa(1.234e+20) == "123400000000000000000.0");
assert(dtoa(1.234e+21) == "1.234e+21");
assert(dtoa(2.71828) == "2.71828");
assert(dtoa(2.71828e-2) == "0.0271828");
assert(dtoa(2.71828e+2) == "271.828");
assert(dtoa(1.1e+128) == "1.1e+128");
assert(dtoa(1.1e-64) == "1.1e-64");
assert(dtoa(0.000035689) == "0.000035689");
assert(dtoa(f32.MAX_VALUE) == "3.4028234663852886e+38");
assert(dtoa(f32.EPSILON) == "1.1920928955078125e-7");

File diff suppressed because it is too large Load Diff