json-as 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +9 -26
  2. package/README.md +41 -18
  3. package/assembly/deserialize/index/arbitrary.ts +1 -1
  4. package/assembly/deserialize/index/array.ts +6 -1
  5. package/assembly/deserialize/index/float.ts +1 -1
  6. package/assembly/deserialize/index/integer.ts +1 -1
  7. package/assembly/deserialize/index/unsigned.ts +1 -1
  8. package/assembly/deserialize/simd/string.ts +17 -13
  9. package/assembly/deserialize/simple/arbitrary.ts +1 -1
  10. package/assembly/deserialize/simple/array/generic.ts +42 -0
  11. package/assembly/deserialize/simple/array.ts +8 -1
  12. package/assembly/deserialize/{float.ts → simple/float.ts} +22 -2
  13. package/assembly/deserialize/{integer.ts → simple/integer.ts} +3 -2
  14. package/assembly/deserialize/simple/map.ts +60 -12
  15. package/assembly/deserialize/simple/object.ts +1 -1
  16. package/assembly/deserialize/simple/set.ts +119 -134
  17. package/assembly/deserialize/simple/staticarray.ts +12 -1
  18. package/assembly/deserialize/simple/string.ts +15 -10
  19. package/assembly/deserialize/simple/struct.ts +7 -157
  20. package/assembly/deserialize/simple/typedarray.ts +1 -1
  21. package/assembly/deserialize/{unsigned.ts → simple/unsigned.ts} +3 -2
  22. package/assembly/deserialize/swar/array/array.ts +42 -7
  23. package/assembly/deserialize/swar/array/bool.ts +5 -2
  24. package/assembly/deserialize/swar/array/float.ts +7 -3
  25. package/assembly/deserialize/swar/array/generic.ts +40 -0
  26. package/assembly/deserialize/swar/array/integer.ts +7 -4
  27. package/assembly/deserialize/swar/array/object.ts +20 -4
  28. package/assembly/deserialize/swar/array/shared.ts +18 -4
  29. package/assembly/deserialize/swar/array/string.ts +5 -2
  30. package/assembly/deserialize/swar/array/struct.ts +20 -4
  31. package/assembly/deserialize/swar/array.ts +56 -2
  32. package/assembly/deserialize/swar/string.ts +249 -371
  33. package/assembly/index.ts +74 -17
  34. package/assembly/serialize/index/arbitrary.ts +3 -3
  35. package/assembly/serialize/index/float.ts +1 -1
  36. package/assembly/serialize/index/object.ts +1 -5
  37. package/assembly/serialize/simd/string.ts +4 -5
  38. package/assembly/serialize/simple/arbitrary.ts +3 -3
  39. package/assembly/serialize/simple/array.ts +17 -6
  40. package/assembly/serialize/simple/float.ts +18 -4
  41. package/assembly/serialize/simple/map.ts +10 -27
  42. package/assembly/serialize/simple/object.ts +1 -5
  43. package/assembly/serialize/simple/set.ts +3 -4
  44. package/assembly/serialize/simple/staticarray.ts +4 -3
  45. package/assembly/serialize/simple/typedarray.ts +9 -7
  46. package/assembly/serialize/swar/string.ts +0 -1
  47. package/assembly/tsconfig.json +3 -2
  48. package/assembly/util/dragonbox-cache.ts +1322 -0
  49. package/assembly/util/dragonbox.ts +596 -0
  50. package/lib/as-bs.ts +10 -7
  51. package/package.json +17 -10
  52. package/transform/lib/index.d.ts.map +1 -1
  53. package/transform/lib/index.js +408 -191
  54. package/transform/lib/index.js.map +1 -1
package/assembly/index.ts CHANGED
@@ -17,15 +17,26 @@ import { serializeSet } from "./serialize/index/set";
17
17
  import { deserializeSet } from "./deserialize/index/set";
18
18
  import { serializeStaticArray } from "./serialize/index/staticarray";
19
19
  import { deserializeStaticArray } from "./deserialize/index/staticarray";
20
-
21
- import { NULL_WORD, QUOTE, NULL_WORD_U64, TRUE_WORD_U64, FALSE_WORD_U64 } from "./custom/chars";
22
- import { dtoa_buffered, itoa_buffered } from "util/number";
20
+ import {
21
+ BRACE_LEFT,
22
+ BRACE_RIGHT,
23
+ BRACKET_LEFT,
24
+ BRACKET_RIGHT,
25
+ COMMA,
26
+ NULL_WORD,
27
+ QUOTE,
28
+ NULL_WORD_U64,
29
+ TRUE_WORD_U64,
30
+ FALSE_WORD_U64,
31
+ } from "./custom/chars";
32
+ import { itoa_buffered } from "util/number";
23
33
  import { serializeBool } from "./serialize/index/bool";
24
34
  import { serializeInteger } from "./serialize/index/integer";
25
- import { serializeFloat } from "./serialize/index/float";
35
+ import { serializeFloat, serializeFloat32, serializeFloat64 } from "./serialize/index/float";
36
+ import { dragonbox_f32_buffered, dragonbox_f64_buffered } from "./util/dragonbox";
26
37
  import { serializeStruct } from "./serialize/index/struct";
27
38
  import { ptrToStr } from "./util/ptrToStr";
28
- import { atoi, bytes } from "./util";
39
+ import { atoi, bytes, scanStringEnd } from "./util";
29
40
  import { deserializeArbitrary } from "./deserialize/index/arbitrary";
30
41
  import { serializeObject } from "./serialize/index/object";
31
42
  import { deserializeObject } from "./deserialize/index/object";
@@ -101,13 +112,9 @@ export namespace JSON {
101
112
  }
102
113
  return data.toString();
103
114
  } else if (isFloat<T>(data)) {
104
- if (out) {
105
- out = changetype<string>(__renew(changetype<usize>(out), 64));
106
-
107
- const bytes = dtoa_buffered(changetype<usize>(out), data) << 1;
108
- return (out = changetype<string>(__renew(changetype<usize>(out), bytes)));
109
- }
110
- return data.toString();
115
+ out = out ? changetype<string>(__renew(changetype<usize>(out), 64)) : changetype<string>(__new(64, idof<string>()));
116
+ const bytes = (sizeof<T>() == 4 ? dragonbox_f32_buffered(changetype<usize>(out), <f32>data) : dragonbox_f64_buffered(changetype<usize>(out), <f64>data)) << 1;
117
+ return changetype<string>(__renew(changetype<usize>(out), bytes));
111
118
  } else if (isNullable<T>() && changetype<usize>(data) == <usize>0) {
112
119
  if (out) {
113
120
  out = changetype<string>(__renew(changetype<usize>(out), 8));
@@ -234,12 +241,16 @@ export namespace JSON {
234
241
  // @ts-expect-error
235
242
  return out.__DESERIALIZE_CUSTOM(data);
236
243
  // @ts-expect-error: Defined by transform
237
- } else if (isDefined(type.__DESERIALIZE)) {
244
+ } else if (isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST)) {
238
245
  const out = changetype<nonnull<T>>(__new(offsetof<nonnull<T>>(), idof<nonnull<T>>()));
239
246
  // @ts-expect-error: Defined by transform
240
247
  if (isDefined(type.__INITIALIZE)) out.__INITIALIZE();
241
248
  // @ts-expect-error: Defined by transform
242
- out.__DESERIALIZE(dataPtr, dataPtr + dataSize, out);
249
+ if (isDefined(type.__DESERIALIZE_FAST)) {
250
+ // @ts-expect-error: Defined by transform
251
+ out.__DESERIALIZE_FAST(dataPtr, dataPtr + dataSize, out);
252
+ // @ts-expect-error: Defined by transform
253
+ } else out.__DESERIALIZE_SLOW(dataPtr, dataPtr + dataSize, out);
243
254
  return out;
244
255
  }
245
256
  if (type instanceof StaticArray) {
@@ -842,7 +853,9 @@ export namespace JSON {
842
853
  serializeInteger<T>(data);
843
854
  } else if (isFloat<T>(data)) {
844
855
  // @ts-expect-error
845
- serializeFloat<T>(data);
856
+ if (sizeof<T>() == 4) serializeFloat32(<f32>data);
857
+ // @ts-expect-error
858
+ else serializeFloat64(<f64>data);
846
859
  } else if (isNullable<T>() && changetype<usize>(data) == <usize>0) {
847
860
  bs.proposeSize(8);
848
861
  store<u64>(bs.offset, NULL_WORD_U64);
@@ -940,12 +953,14 @@ export namespace JSON {
940
953
  // @ts-expect-error: Defined by transform
941
954
  return out.__DESERIALIZE_CUSTOM(ptrToStr(srcStart, srcEnd));
942
955
  // @ts-expect-error: Defined by transform
943
- } else if (isDefined(type.__DESERIALIZE)) {
956
+ } else if (isDefined(type.__DESERIALIZE_SLOW) || isDefined(type.__DESERIALIZE_FAST)) {
944
957
  const out = changetype<nonnull<T>>(dst || __new(offsetof<nonnull<T>>(), idof<nonnull<T>>()));
945
958
  // @ts-expect-error: Defined by transform
946
959
  if (isDefined(type.__INITIALIZE)) out.__INITIALIZE();
947
960
  // @ts-expect-error: Defined by transform
948
- out.__DESERIALIZE(srcStart, srcEnd, out);
961
+ if (isDefined(type.__DESERIALIZE_FAST)) out.__DESERIALIZE_FAST(srcStart, srcEnd, out);
962
+ // @ts-expect-error: Defined by transform
963
+ else out.__DESERIALIZE_SLOW(srcStart, srcEnd, out);
949
964
  return out;
950
965
  }
951
966
  if (type instanceof StaticArray) {
@@ -1010,6 +1025,48 @@ export namespace JSON {
1010
1025
  return code == 0x20 || code - 9 <= 4;
1011
1026
  }
1012
1027
  // @ts-expect-error: decorator
1028
+ @inline export function scanValueEnd(srcStart: usize, srcEnd: usize): usize {
1029
+ if (srcStart >= srcEnd) return 0;
1030
+ let ptr = srcStart;
1031
+ while (ptr < srcEnd && isSpace(load<u16>(ptr))) ptr += 2;
1032
+ if (ptr >= srcEnd) return 0;
1033
+ const first = load<u16>(ptr);
1034
+
1035
+ if (first == QUOTE) {
1036
+ const endQuote = scanStringEnd(ptr, srcEnd);
1037
+ return endQuote >= srcEnd ? 0 : endQuote + 2;
1038
+ }
1039
+
1040
+ if (first == BRACE_LEFT || first == BRACKET_LEFT) {
1041
+ let depth: i32 = 1;
1042
+ ptr += 2;
1043
+ while (ptr < srcEnd) {
1044
+ const code = load<u16>(ptr);
1045
+ if (code == QUOTE) {
1046
+ const endQuote = scanStringEnd(ptr, srcEnd);
1047
+ if (endQuote >= srcEnd) return 0;
1048
+ ptr = endQuote + 2;
1049
+ continue;
1050
+ }
1051
+ if (code == BRACE_LEFT || code == BRACKET_LEFT) {
1052
+ depth++;
1053
+ } else if (code == BRACE_RIGHT || code == BRACKET_RIGHT) {
1054
+ if (--depth == 0) return ptr + 2;
1055
+ }
1056
+ ptr += 2;
1057
+ }
1058
+ return 0;
1059
+ }
1060
+
1061
+ while (ptr < srcEnd) {
1062
+ const code = load<u16>(ptr);
1063
+ if (code == COMMA || code == BRACKET_RIGHT || code == BRACE_RIGHT || isSpace(code)) return ptr;
1064
+ ptr += 2;
1065
+ }
1066
+
1067
+ return ptr;
1068
+ }
1069
+ // @ts-expect-error: decorator
1013
1070
  @inline export function ptrToStr(start: usize, end: usize): string {
1014
1071
  const size = end - start;
1015
1072
  const out = __new(size, idof<string>());
@@ -2,7 +2,7 @@ import { JSON } from "../..";
2
2
  import { bs } from "../../../lib/as-bs";
3
3
  import { serializeArray } from "./array";
4
4
  import { serializeBool } from "./bool";
5
- import { serializeFloat } from "./float";
5
+ import { serializeFloat32, serializeFloat64 } from "./float";
6
6
  import { serializeInteger } from "./integer";
7
7
  import { serializeMap } from "./map";
8
8
  import { serializeObject } from "./object";
@@ -41,10 +41,10 @@ export function serializeArbitrary(src: JSON.Value): void {
41
41
  serializeInteger<i64>(src.get<i64>());
42
42
  break;
43
43
  case JSON.Types.F32:
44
- serializeFloat<f32>(src.get<f32>());
44
+ serializeFloat32(src.get<f32>());
45
45
  break;
46
46
  case JSON.Types.F64:
47
- serializeFloat<f64>(src.get<f64>());
47
+ serializeFloat64(src.get<f64>());
48
48
  break;
49
49
  case JSON.Types.String:
50
50
  serializeString(src.get<string>());
@@ -1 +1 @@
1
- export { serializeFloat } from "../simple/float";
1
+ export { serializeFloat, serializeFloat32, serializeFloat64 } from "../simple/float";
@@ -18,29 +18,25 @@ export function serializeObject(src: JSON.Obj): void {
18
18
  const keys = src.keys();
19
19
  const values = src.values();
20
20
 
21
- bs.growSize(2);
21
+ bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
22
22
  store<u16>(bs.offset, BRACE_LEFT);
23
23
  bs.offset += 2;
24
24
 
25
25
  for (let i = 0; i < srcEnd; i++) {
26
26
  serializeString(unchecked(keys[i]));
27
- bs.growSize(2);
28
27
  store<u16>(bs.offset, COLON);
29
28
  bs.offset += 2;
30
29
 
31
30
  serializeArbitrary(unchecked(values[i]));
32
- bs.growSize(2);
33
31
  store<u16>(bs.offset, COMMA);
34
32
  bs.offset += 2;
35
33
  }
36
34
 
37
35
  serializeString(unchecked(keys[srcEnd]));
38
- bs.growSize(2);
39
36
  store<u16>(bs.offset, COLON);
40
37
  bs.offset += 2;
41
38
  serializeArbitrary(unchecked(values[srcEnd]));
42
39
 
43
- bs.growSize(2);
44
40
  store<u16>(bs.offset, BRACE_RIGHT);
45
41
  bs.offset += 2;
46
42
  }
@@ -55,16 +55,15 @@ export function serializeString_SIMD(src: string): void {
55
55
  // console.log("lt20 : " + mask_to_string_v128(lt20) + " -> " + mask_to_string_v128(SPLAT_0020));
56
56
  // console.log("gteD8 : " + mask_to_string_v128(gteD8) + " -> " + mask_to_string_v128(SPLAT_FFD8));
57
57
 
58
- const sieve = v128.or(eq22, v128.or(eq5C, v128.or(lt20, gteD8)));
59
- // console.log("sieve : " + mask_to_string_v128(sieve));
58
+ let mask = i8x16.bitmask(v128.or(eq22, v128.or(eq5C, v128.or(lt20, gteD8))));
60
59
 
61
- if (!v128.any_true(sieve)) {
60
+ if (mask == 0) {
62
61
  bs.offset += 16;
63
62
  srcStart += 16;
64
63
  continue;
65
64
  }
66
65
 
67
- let mask = i8x16.bitmask(sieve);
66
+ bs.growSize(popcnt(mask) * 10 + 12);
68
67
 
69
68
  do {
70
69
  const laneIdx = ctz(mask);
@@ -110,7 +109,7 @@ export function serializeString_SIMD(src: string): void {
110
109
  const next = load<u16>(srcIdx, 1);
111
110
  if (next >= 0xdc00 && next <= 0xdfff) {
112
111
  // paired surrogate
113
- mask &= mask - 1;
112
+ mask &= ~(0b11 << (laneIdx + 1));
114
113
  continue;
115
114
  }
116
115
  }
@@ -2,7 +2,7 @@ import { JSON } from "../..";
2
2
  import { bs } from "../../../lib/as-bs";
3
3
  import { serializeArray } from "./array";
4
4
  import { serializeBool } from "./bool";
5
- import { serializeFloat } from "./float";
5
+ import { serializeFloat32, serializeFloat64 } from "./float";
6
6
  import { serializeInteger } from "./integer";
7
7
  import { serializeMap } from "./map";
8
8
  import { serializeObject } from "./object";
@@ -41,10 +41,10 @@ export function serializeArbitrary(src: JSON.Value): void {
41
41
  serializeInteger<i64>(src.get<i64>());
42
42
  break;
43
43
  case JSON.Types.F32:
44
- serializeFloat<f32>(src.get<f32>());
44
+ serializeFloat32(src.get<f32>());
45
45
  break;
46
46
  case JSON.Types.F64:
47
- serializeFloat<f64>(src.get<f64>());
47
+ serializeFloat64(src.get<f64>());
48
48
  break;
49
49
  case JSON.Types.String:
50
50
  serializeString(src.get<string>());
@@ -1,16 +1,29 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
2
  import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
3
3
  import { JSON } from "../..";
4
+ import { serializeFloat32, serializeFloat64 } from "./float";
5
+
6
+ @inline
7
+ function serializeArrayElement<T>(value: T): void {
8
+ if (isFloat<T>()) {
9
+ if (sizeof<T>() == 4) serializeFloat32(<f32>value);
10
+ else serializeFloat64(<f64>value);
11
+ return;
12
+ }
13
+ JSON.__serialize<T>(value);
14
+ }
4
15
 
5
16
  export function serializeArray<T extends any[]>(src: T): void {
6
- bs.proposeSize(4);
7
- const end = src.length - 1;
17
+ const len = src.length;
18
+ const end = len - 1;
8
19
  let i = 0;
9
20
  if (end == -1) {
21
+ bs.proposeSize(4);
10
22
  store<u32>(bs.offset, 6094939);
11
23
  bs.offset += 4;
12
24
  return;
13
25
  }
26
+ bs.proposeSize(4 + <u32>(len - 1) * 2);
14
27
  // {} = 4
15
28
  // xi, = n << 1
16
29
 
@@ -19,15 +32,13 @@ export function serializeArray<T extends any[]>(src: T): void {
19
32
 
20
33
  while (i < end) {
21
34
  const block = unchecked(src[i++]);
22
- JSON.__serialize<valueof<T>>(block);
23
- bs.growSize(2);
35
+ serializeArrayElement<valueof<T>>(block);
24
36
  store<u16>(bs.offset, COMMA);
25
37
  bs.offset += 2;
26
38
  }
27
39
 
28
40
  const lastBlock = unchecked(src[end]);
29
- JSON.__serialize<valueof<T>>(lastBlock);
30
- // bs.growSize(2);
41
+ serializeArrayElement<valueof<T>>(lastBlock);
31
42
  store<u16>(bs.offset, BRACKET_RIGHT);
32
43
  bs.offset += 2;
33
44
  }
@@ -1,10 +1,24 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
- import { dtoa_buffered } from "util/number";
2
+ import { dragonbox_f32_buffered, dragonbox_f64_buffered } from "../../util/dragonbox";
3
3
 
4
- // @ts-ignore: inline
5
- @inline export function serializeFloat<T extends number>(data: T): void {
4
+ @inline
5
+ export function serializeFloat32(data: f32): void {
6
6
  bs.ensureSize(64);
7
- const size = dtoa_buffered(bs.offset, data) << 1;
7
+ const size = dragonbox_f32_buffered(bs.offset, data) << 1;
8
8
  bs.stackSize += size;
9
9
  bs.offset += size;
10
10
  }
11
+
12
+ @inline
13
+ export function serializeFloat64(data: f64): void {
14
+ bs.ensureSize(64);
15
+ const size = dragonbox_f64_buffered(bs.offset, data) << 1;
16
+ bs.stackSize += size;
17
+ bs.offset += size;
18
+ }
19
+
20
+ // @ts-ignore: inline
21
+ @inline export function serializeFloat<T extends number>(data: T): void {
22
+ if (sizeof<T>() == 4) serializeFloat32(<f32>data);
23
+ else serializeFloat64(<f64>data);
24
+ }
@@ -15,52 +15,35 @@ export function serializeMap<T extends Map<any, any>>(src: T): void {
15
15
 
16
16
  let keys = src.keys();
17
17
  let values = src.values();
18
+ const keyIsString = isString<indexof<T>>();
18
19
 
19
- bs.proposeSize(4);
20
+ bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
20
21
 
21
22
  store<u16>(bs.offset, BRACE_LEFT);
22
23
  bs.offset += 2;
23
24
 
24
25
  for (let i = 0; i < srcEnd; i++) {
25
- // @ts-ignore: Valid
26
- if (!isString<indexof<T>>()) {
27
- bs.growSize(6);
28
- store<u16>(bs.offset, 34);
29
- bs.offset += 2;
26
+ if (keyIsString) {
30
27
  JSON.__serialize(unchecked(keys[i]));
31
- store<u16>(bs.offset, 34);
32
- store<u16>(bs.offset, COLON, 2);
33
- bs.offset += 4;
34
28
  } else {
35
- JSON.__serialize(unchecked(keys[i]));
36
- bs.growSize(2);
37
- store<u16>(bs.offset, COLON);
38
- bs.offset += 2;
29
+ JSON.__serialize<string>(JSON.internal.stringify<indexof<T>>(unchecked(keys[i])));
39
30
  }
31
+ store<u16>(bs.offset, COLON);
32
+ bs.offset += 2;
40
33
  JSON.__serialize(unchecked(values[i]));
41
- bs.growSize(2);
42
34
  store<u16>(bs.offset, COMMA);
43
35
  bs.offset += 2;
44
36
  }
45
37
 
46
- // @ts-ignore: Valid
47
- if (!isString<indexof<T>>()) {
48
- bs.growSize(6);
49
- store<u16>(bs.offset, 34);
50
- bs.offset += 2;
38
+ if (keyIsString) {
51
39
  JSON.__serialize(unchecked(keys[srcEnd]));
52
- store<u16>(bs.offset, 34);
53
- store<u16>(bs.offset, COLON, 2);
54
- bs.offset += 4;
55
40
  } else {
56
- JSON.__serialize(unchecked(keys[srcEnd]));
57
- bs.growSize(2);
58
- store<u16>(bs.offset, COLON);
59
- bs.offset += 2;
41
+ JSON.__serialize<string>(JSON.internal.stringify<indexof<T>>(unchecked(keys[srcEnd])));
60
42
  }
43
+ store<u16>(bs.offset, COLON);
44
+ bs.offset += 2;
61
45
 
62
46
  JSON.__serialize(unchecked(values[srcEnd]));
63
- // bs.growSize(2);
64
47
  store<u16>(bs.offset, BRACE_RIGHT);
65
48
  bs.offset += 2;
66
49
  }
@@ -18,29 +18,25 @@ export function serializeObject(src: JSON.Obj): void {
18
18
  const keys = src.keys();
19
19
  const values = src.values();
20
20
 
21
- bs.growSize(2);
21
+ bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
22
22
  store<u16>(bs.offset, BRACE_LEFT);
23
23
  bs.offset += 2;
24
24
 
25
25
  for (let i = 0; i < srcEnd; i++) {
26
26
  serializeString_SWAR(unchecked(keys[i]));
27
- bs.growSize(2);
28
27
  store<u16>(bs.offset, COLON);
29
28
  bs.offset += 2;
30
29
 
31
30
  serializeArbitrary(unchecked(values[i]));
32
- bs.growSize(2);
33
31
  store<u16>(bs.offset, COMMA);
34
32
  bs.offset += 2;
35
33
  }
36
34
 
37
35
  serializeString_SWAR(unchecked(keys[srcEnd]));
38
- bs.growSize(2);
39
36
  store<u16>(bs.offset, COLON);
40
37
  bs.offset += 2;
41
38
  serializeArbitrary(unchecked(values[srcEnd]));
42
39
 
43
- bs.growSize(2);
44
40
  store<u16>(bs.offset, BRACE_RIGHT);
45
41
  bs.offset += 2;
46
42
  }
@@ -3,25 +3,24 @@ import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
3
3
  import { JSON } from "../..";
4
4
 
5
5
  export function serializeSet<T extends Set<any>>(src: T): void {
6
- bs.proposeSize(4);
7
6
  const srcSize = src.size;
8
7
  if (srcSize == 0) {
8
+ bs.proposeSize(4);
9
9
  store<u32>(bs.offset, 6094939); // []
10
10
  bs.offset += 4;
11
11
  return;
12
12
  }
13
+ bs.proposeSize(4 + <u32>(srcSize - 1) * 2);
13
14
 
14
15
  const values = src.values();
15
- const end = srcSize - 1;
16
-
17
16
  store<u16>(bs.offset, BRACKET_LEFT);
18
17
  bs.offset += 2;
19
18
 
19
+ const end = srcSize - 1;
20
20
  for (let i = 0; i < end; i++) {
21
21
  const block = unchecked(values[i]);
22
22
  // @ts-ignore: type
23
23
  JSON.__serialize<indexof<T>>(block);
24
- bs.growSize(2);
25
24
  store<u16>(bs.offset, COMMA);
26
25
  bs.offset += 2;
27
26
  }
@@ -3,14 +3,16 @@ import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
3
3
  import { JSON } from "../..";
4
4
 
5
5
  export function serializeStaticArray<T extends StaticArray<any>>(src: T): void {
6
- bs.proposeSize(4);
7
- const end = src.length - 1;
6
+ const len = src.length;
7
+ const end = len - 1;
8
8
  let i = 0;
9
9
  if (end == -1) {
10
+ bs.proposeSize(4);
10
11
  store<u32>(bs.offset, 6094939); // []
11
12
  bs.offset += 4;
12
13
  return;
13
14
  }
15
+ bs.proposeSize(4 + <u32>(len - 1) * 2);
14
16
 
15
17
  store<u16>(bs.offset, BRACKET_LEFT);
16
18
  bs.offset += 2;
@@ -18,7 +20,6 @@ export function serializeStaticArray<T extends StaticArray<any>>(src: T): void {
18
20
  while (i < end) {
19
21
  const block = unchecked(src[i++]);
20
22
  JSON.__serialize<valueof<T>>(block);
21
- bs.growSize(2);
22
23
  store<u16>(bs.offset, COMMA);
23
24
  bs.offset += 2;
24
25
  }
@@ -1,33 +1,35 @@
1
1
  import { bs } from "../../../lib/as-bs";
2
2
  import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../custom/chars";
3
- import { serializeFloat } from "./float";
3
+ import { serializeFloat32, serializeFloat64 } from "./float";
4
4
  import { serializeInteger } from "./integer";
5
5
 
6
6
 
7
7
  @inline
8
8
  function serializeTypedArrayElement<T extends ArrayLike<number>>(src: T, index: i32): void {
9
9
  if (isFloat<valueof<T>>()) {
10
- serializeFloat<valueof<T>>(unchecked(src[index]));
10
+ if (sizeof<valueof<T>>() == 4) serializeFloat32(<f32>unchecked(src[index]));
11
+ else serializeFloat64(<f64>unchecked(src[index]));
11
12
  } else {
12
13
  serializeInteger<valueof<T>>(unchecked(src[index]));
13
14
  }
14
15
  }
15
16
 
16
17
  export function serializeTypedArray<T extends ArrayLike<number>>(src: T): void {
17
- bs.proposeSize(4);
18
- const end = src.length - 1;
18
+ const len = src.length;
19
+ const end = len - 1;
19
20
  if (end == -1) {
21
+ bs.proposeSize(4);
20
22
  store<u32>(bs.offset, 6094939);
21
23
  bs.offset += 4;
22
24
  return;
23
25
  }
26
+ bs.proposeSize(4 + <u32>(len - 1) * 2);
24
27
 
25
28
  store<u16>(bs.offset, BRACKET_LEFT);
26
29
  bs.offset += 2;
27
30
 
28
31
  for (let i = 0; i < end; i++) {
29
32
  serializeTypedArrayElement(src, i);
30
- bs.growSize(2);
31
33
  store<u16>(bs.offset, COMMA);
32
34
  bs.offset += 2;
33
35
  }
@@ -40,19 +42,19 @@ export function serializeTypedArray<T extends ArrayLike<number>>(src: T): void {
40
42
  export function serializeArrayBufferUnsafe(srcStart: usize, byteLength: i32): void {
41
43
  const end = byteLength - 1;
42
44
 
43
- bs.proposeSize(4);
44
45
  if (end == -1) {
46
+ bs.proposeSize(4);
45
47
  store<u32>(bs.offset, 6094939);
46
48
  bs.offset += 4;
47
49
  return;
48
50
  }
51
+ bs.proposeSize(4 + <u32>(end) * 2);
49
52
 
50
53
  store<u16>(bs.offset, BRACKET_LEFT);
51
54
  bs.offset += 2;
52
55
 
53
56
  for (let i = 0; i < end; i++) {
54
57
  serializeInteger<u8>(load<u8>(srcStart + <usize>i));
55
- bs.growSize(2);
56
58
  store<u16>(bs.offset, COMMA);
57
59
  bs.offset += 2;
58
60
  }
@@ -5,7 +5,6 @@ import { u16_to_hex4_swar } from "../../util/swar";
5
5
  import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
6
6
 
7
7
  // @ts-expect-error: @lazy is a valid decorator
8
- // @ts-nocheck
9
8
  @lazy const U00_MARKER = 13511005048209500;
10
9
  // @ts-expect-error: @lazy is a valid decorator
11
10
  @lazy const U_MARKER = 7667804;
@@ -2,6 +2,7 @@
2
2
  "extends": "assemblyscript/std/assembly.json",
3
3
  "include": ["./**/*.ts"],
4
4
  "compilerOptions": {
5
+ "allowImportingTsExtensions": true,
5
6
  "experimentalDecorators": true,
6
7
  "emitDecoratorMetadata": true,
7
8
 
@@ -18,6 +19,6 @@
18
19
  "noUnusedParameters": false,
19
20
  "noImplicitReturns": true,
20
21
  "noFallthroughCasesInSwitch": true,
21
- "noUncheckedIndexedAccess": false
22
- }
22
+ "noUncheckedIndexedAccess": false,
23
+ },
23
24
  }