json-as 1.3.6 → 1.3.8

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 (155) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +1 -1
  3. package/assembly/deserialize/helpers/uint.ts +4 -1
  4. package/assembly/deserialize/index/arbitrary.ts +7 -3
  5. package/assembly/deserialize/index/array.ts +42 -17
  6. package/assembly/deserialize/index/bool.ts +1 -1
  7. package/assembly/deserialize/index/date.ts +1 -1
  8. package/assembly/deserialize/index/float.ts +40 -1
  9. package/assembly/deserialize/index/integer.ts +68 -1
  10. package/assembly/deserialize/index/map.ts +1 -1
  11. package/assembly/deserialize/index/object.ts +1 -1
  12. package/assembly/deserialize/index/raw.ts +1 -1
  13. package/assembly/deserialize/index/set.ts +1 -1
  14. package/assembly/deserialize/index/staticarray.ts +4 -1
  15. package/assembly/deserialize/index/string.ts +32 -4
  16. package/assembly/deserialize/index/struct.ts +1 -1
  17. package/assembly/deserialize/index/typedarray.ts +30 -10
  18. package/assembly/deserialize/index/unsigned.ts +78 -1
  19. package/assembly/deserialize/index.ts +1 -0
  20. package/assembly/deserialize/{simple → naive}/array/arbitrary.ts +24 -5
  21. package/assembly/deserialize/{simple → naive}/array/array.ts +8 -2
  22. package/assembly/deserialize/naive/array/bool.ts +68 -0
  23. package/assembly/deserialize/{simple → naive}/array/box.ts +8 -2
  24. package/assembly/deserialize/naive/array/float.ts +63 -0
  25. package/assembly/deserialize/{simple → naive}/array/generic.ts +14 -7
  26. package/assembly/deserialize/naive/array/integer.ts +86 -0
  27. package/assembly/deserialize/naive/array/map.ts +47 -0
  28. package/assembly/deserialize/naive/array/object.ts +47 -0
  29. package/assembly/deserialize/{simple → naive}/array/raw.ts +34 -7
  30. package/assembly/deserialize/naive/array/string.ts +69 -0
  31. package/assembly/deserialize/naive/array/struct.ts +47 -0
  32. package/assembly/deserialize/{simple → naive}/array.ts +15 -10
  33. package/assembly/deserialize/{simple → naive}/bool.ts +6 -2
  34. package/assembly/deserialize/naive/float.ts +135 -0
  35. package/assembly/deserialize/{simple → naive}/integer.ts +10 -2
  36. package/assembly/deserialize/{simple → naive}/map.ts +106 -27
  37. package/assembly/deserialize/{simple → naive}/object.ts +65 -19
  38. package/assembly/deserialize/{simple → naive}/raw.ts +4 -1
  39. package/assembly/deserialize/{simple → naive}/set.ts +49 -19
  40. package/assembly/deserialize/{simple → naive}/staticarray/array.ts +1 -1
  41. package/assembly/deserialize/{simple → naive}/staticarray/bool.ts +1 -1
  42. package/assembly/deserialize/{simple → naive}/staticarray/float.ts +1 -1
  43. package/assembly/deserialize/{simple → naive}/staticarray/integer.ts +1 -1
  44. package/assembly/deserialize/{simple → naive}/staticarray/string.ts +11 -3
  45. package/assembly/deserialize/{simple → naive}/staticarray/struct.ts +1 -2
  46. package/assembly/deserialize/{simple → naive}/staticarray.ts +68 -18
  47. package/assembly/deserialize/naive/string.ts +199 -0
  48. package/assembly/deserialize/{simple → naive}/struct.ts +5 -1
  49. package/assembly/deserialize/{simple → naive}/typedarray.ts +17 -4
  50. package/assembly/deserialize/{simple → naive}/unsigned.ts +10 -15
  51. package/assembly/deserialize/simd/array/integer.ts +339 -62
  52. package/assembly/deserialize/simd/float.ts +303 -0
  53. package/assembly/deserialize/simd/integer.ts +233 -0
  54. package/assembly/deserialize/simd/string.ts +266 -107
  55. package/assembly/deserialize/swar/array/arbitrary.ts +11 -3
  56. package/assembly/deserialize/swar/array/array.ts +40 -9
  57. package/assembly/deserialize/swar/array/bool.ts +28 -5
  58. package/assembly/deserialize/swar/array/box.ts +11 -3
  59. package/assembly/deserialize/swar/array/float.ts +295 -7
  60. package/assembly/deserialize/swar/array/generic.ts +28 -7
  61. package/assembly/deserialize/swar/array/integer.ts +363 -112
  62. package/assembly/deserialize/swar/array/map.ts +11 -3
  63. package/assembly/deserialize/swar/array/object.ts +37 -25
  64. package/assembly/deserialize/swar/array/raw.ts +11 -3
  65. package/assembly/deserialize/swar/array/shared.ts +63 -14
  66. package/assembly/deserialize/swar/array/string.ts +140 -7
  67. package/assembly/deserialize/swar/array/struct.ts +66 -12
  68. package/assembly/deserialize/swar/array.ts +12 -51
  69. package/assembly/deserialize/swar/float.ts +304 -0
  70. package/assembly/deserialize/swar/integer.ts +246 -0
  71. package/assembly/deserialize/swar/string.ts +213 -294
  72. package/assembly/deserialize/swar/typedarray.ts +224 -0
  73. package/assembly/index.d.ts +3 -1
  74. package/assembly/index.ts +402 -261
  75. package/assembly/serialize/index/array.ts +1 -1
  76. package/assembly/serialize/index/bool.ts +1 -1
  77. package/assembly/serialize/index/date.ts +1 -1
  78. package/assembly/serialize/index/float.ts +5 -1
  79. package/assembly/serialize/index/integer.ts +1 -1
  80. package/assembly/serialize/index/map.ts +1 -1
  81. package/assembly/serialize/index/raw.ts +1 -1
  82. package/assembly/serialize/index/set.ts +1 -1
  83. package/assembly/serialize/index/staticarray.ts +1 -1
  84. package/assembly/serialize/index/string.ts +1 -1
  85. package/assembly/serialize/index/struct.ts +1 -1
  86. package/assembly/serialize/index/typedarray.ts +21 -12
  87. package/assembly/serialize/index.ts +1 -0
  88. package/assembly/serialize/naive/array.ts +351 -0
  89. package/assembly/serialize/{simple → naive}/float.ts +4 -1
  90. package/assembly/serialize/naive/integer.ts +19 -0
  91. package/assembly/serialize/{simple → naive}/map.ts +6 -2
  92. package/assembly/serialize/{simple → naive}/raw.ts +5 -1
  93. package/assembly/serialize/{simple → naive}/set.ts +6 -1
  94. package/assembly/serialize/{simple → naive}/staticarray.ts +6 -1
  95. package/assembly/serialize/{simple → naive}/string.ts +1 -2
  96. package/assembly/serialize/{simple → naive}/typedarray.ts +10 -3
  97. package/assembly/serialize/simd/string.ts +6 -2
  98. package/assembly/serialize/swar/string.ts +15 -141
  99. package/assembly/util/atoi-fast.ts +81 -0
  100. package/assembly/util/concat.ts +5 -1
  101. package/assembly/util/dragonbox-cache.ts +443 -2
  102. package/assembly/util/dragonbox.ts +53 -17
  103. package/assembly/util/itoa-fast.ts +241 -0
  104. package/assembly/util/masks.ts +18 -1
  105. package/assembly/util/parsefloat-fast.ts +167 -0
  106. package/assembly/util/scanValueEnd.ts +78 -0
  107. package/assembly/util/scientific.ts +132 -0
  108. package/assembly/util/simd-int.ts +191 -0
  109. package/assembly/util/snp.ts +4 -1
  110. package/assembly/util/swar-int.ts +248 -0
  111. package/assembly/util/swar.ts +13 -3
  112. package/lib/as-bs.ts +27 -6
  113. package/package.json +15 -11
  114. package/transform/lib/builder.d.ts.map +1 -1
  115. package/transform/lib/builder.js +13 -5
  116. package/transform/lib/builder.js.map +1 -1
  117. package/transform/lib/index.d.ts +5 -0
  118. package/transform/lib/index.d.ts.map +1 -1
  119. package/transform/lib/index.js +1046 -340
  120. package/transform/lib/index.js.map +1 -1
  121. package/transform/lib/linkers/alias.d.ts.map +1 -1
  122. package/transform/lib/linkers/alias.js.map +1 -1
  123. package/transform/lib/linkers/custom.d.ts.map +1 -1
  124. package/transform/lib/linkers/custom.js +3 -2
  125. package/transform/lib/linkers/custom.js.map +1 -1
  126. package/transform/lib/linkers/imports.d.ts.map +1 -1
  127. package/transform/lib/linkers/imports.js.map +1 -1
  128. package/transform/lib/types.d.ts.map +1 -1
  129. package/transform/lib/types.js +54 -16
  130. package/transform/lib/types.js.map +1 -1
  131. package/transform/lib/util.d.ts.map +1 -1
  132. package/transform/lib/util.js +1 -1
  133. package/transform/lib/util.js.map +1 -1
  134. package/transform/lib/visitor.d.ts.map +1 -1
  135. package/transform/lib/visitor.js +2 -1
  136. package/transform/lib/visitor.js.map +1 -1
  137. package/assembly/custom/util.ts +0 -310
  138. package/assembly/deserialize/simple/arbitrary.ts +0 -23
  139. package/assembly/deserialize/simple/array/bool.ts +0 -17
  140. package/assembly/deserialize/simple/array/float.ts +0 -28
  141. package/assembly/deserialize/simple/array/integer.ts +0 -27
  142. package/assembly/deserialize/simple/array/map.ts +0 -28
  143. package/assembly/deserialize/simple/array/object.ts +0 -28
  144. package/assembly/deserialize/simple/array/string.ts +0 -23
  145. package/assembly/deserialize/simple/array/struct.ts +0 -28
  146. package/assembly/deserialize/simple/float.ts +0 -201
  147. package/assembly/deserialize/simple/string.ts +0 -132
  148. package/assembly/serialize/simple/arbitrary.ts +0 -79
  149. package/assembly/serialize/simple/array.ts +0 -86
  150. package/assembly/serialize/simple/integer.ts +0 -20
  151. package/assembly/serialize/simple/object.ts +0 -42
  152. /package/assembly/deserialize/{simple → naive}/date.ts +0 -0
  153. /package/assembly/serialize/{simple → naive}/bool.ts +0 -0
  154. /package/assembly/serialize/{simple → naive}/date.ts +0 -0
  155. /package/assembly/serialize/{simple → naive}/struct.ts +0 -0
@@ -1,201 +0,0 @@
1
- import { ptrToStr } from "../../util/ptrToStr";
2
-
3
- // @ts-ignore: inline
4
- @inline function pow10Fast(exponent: u32): f64 {
5
- if (exponent == 0) return 1.0;
6
- if (exponent == 1) return 10.0;
7
- if (exponent == 2) return 100.0;
8
- if (exponent == 3) return 1e3;
9
- if (exponent == 4) return 1e4;
10
- if (exponent == 5) return 1e5;
11
- if (exponent == 6) return 1e6;
12
- if (exponent == 7) return 1e7;
13
- if (exponent == 8) return 1e8;
14
- if (exponent == 9) return 1e9;
15
- if (exponent == 10) return 1e10;
16
- if (exponent == 11) return 1e11;
17
- if (exponent == 12) return 1e12;
18
- if (exponent == 13) return 1e13;
19
- if (exponent == 14) return 1e14;
20
- if (exponent == 15) return 1e15;
21
- if (exponent == 16) return 1e16;
22
- if (exponent == 17) return 1e17;
23
- if (exponent == 18) return 1e18;
24
- let result = 1.0;
25
- if (exponent & 1) result *= 1e1;
26
- if (exponent & 2) result *= 1e2;
27
- if (exponent & 4) result *= 1e4;
28
- if (exponent & 8) result *= 1e8;
29
- if (exponent & 16) result *= 1e16;
30
- if (exponent & 32) result *= 1e32;
31
- if (exponent & 64) result *= 1e64;
32
- if (exponent & 128) result *= 1e128;
33
- if (exponent & 256) result *= 1e256;
34
- return result;
35
- }
36
-
37
- // @ts-ignore: inline
38
- @inline export function deserializeFloat<T>(srcStart: usize, srcEnd: usize): T {
39
- let negative = false;
40
- if (load<u16>(srcStart) == 45) {
41
- negative = true;
42
- srcStart += 2;
43
- if (srcStart >= srcEnd) unreachable();
44
- }
45
-
46
- let value: f64 = 0.0;
47
- let seenDigit = false;
48
-
49
- while (srcStart < srcEnd) {
50
- const digit = <u32>load<u16>(srcStart) - 48;
51
- if (digit > 9) break;
52
- value = value * 10.0 + <f64>digit;
53
- seenDigit = true;
54
- srcStart += 2;
55
- }
56
-
57
- if (srcStart < srcEnd && load<u16>(srcStart) == 46) {
58
- srcStart += 2;
59
- let fraction: u64 = 0;
60
- let digits: u32 = 0;
61
- while (srcStart < srcEnd) {
62
- const digit = <u32>load<u16>(srcStart) - 48;
63
- if (digit > 9) break;
64
- fraction = fraction * 10 + digit;
65
- digits += 1;
66
- seenDigit = true;
67
- srcStart += 2;
68
- }
69
- if (digits != 0) value += <f64>fraction / pow10Fast(digits);
70
- }
71
-
72
- if (!seenDigit) {
73
- // @ts-ignore
74
- const type: T = 0;
75
- // @ts-ignore
76
- if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd));
77
- // @ts-ignore
78
- return f32.parse(ptrToStr(srcStart, srcEnd));
79
- }
80
-
81
- if (srcStart < srcEnd) {
82
- const code = load<u16>(srcStart);
83
- if (code == 101 || code == 69) {
84
- srcStart += 2;
85
- if (srcStart >= srcEnd) unreachable();
86
-
87
- let exponentNegative = false;
88
- let exponentCode = load<u16>(srcStart);
89
- if (exponentCode == 45 || exponentCode == 43) {
90
- exponentNegative = exponentCode == 45;
91
- srcStart += 2;
92
- if (srcStart >= srcEnd) unreachable();
93
- exponentCode = load<u16>(srcStart);
94
- }
95
-
96
- let exponent = <u32>exponentCode - 48;
97
- if (exponent > 9) unreachable();
98
- srcStart += 2;
99
- while (srcStart < srcEnd) {
100
- const digit = <u32>load<u16>(srcStart) - 48;
101
- if (digit > 9) break;
102
- exponent = exponent * 10 + digit;
103
- srcStart += 2;
104
- }
105
-
106
- const power = pow10Fast(exponent);
107
- value = exponentNegative ? value / power : value * power;
108
- }
109
- }
110
-
111
- if (negative) value = -value;
112
-
113
- // @ts-ignore
114
- const type: T = 0;
115
- // @ts-ignore
116
- if (type instanceof f64) return <T>value;
117
- // @ts-ignore
118
- return <T>(<f32>value);
119
- }
120
-
121
- // @ts-ignore: inline
122
- @inline export function deserializeFloatField<T extends number>(srcStart: usize, srcEnd: usize, dstObj: usize, dstOffset: usize = 0): usize {
123
- const fieldPtr = dstObj + dstOffset;
124
- let negative = false;
125
- if (load<u16>(srcStart) == 45) {
126
- negative = true;
127
- srcStart += 2;
128
- if (srcStart >= srcEnd) unreachable();
129
- }
130
-
131
- let value: f64 = 0.0;
132
- let seenDigit = false;
133
-
134
- while (srcStart < srcEnd) {
135
- const code = load<u16>(srcStart);
136
- const digit = <u32>code - 48;
137
- if (digit > 9) break;
138
- value = value * 10.0 + <f64>digit;
139
- seenDigit = true;
140
- srcStart += 2;
141
- }
142
-
143
- if (srcStart < srcEnd && load<u16>(srcStart) == 46) {
144
- srcStart += 2;
145
- let fraction: u64 = 0;
146
- let digits: u32 = 0;
147
- while (srcStart < srcEnd) {
148
- const code = load<u16>(srcStart);
149
- const digit = <u32>code - 48;
150
- if (digit > 9) break;
151
- fraction = fraction * 10 + digit;
152
- digits += 1;
153
- seenDigit = true;
154
- srcStart += 2;
155
- }
156
- if (digits != 0) value += <f64>fraction / pow10Fast(digits);
157
- }
158
-
159
- if (!seenDigit) unreachable();
160
-
161
- if (srcStart < srcEnd) {
162
- const code = load<u16>(srcStart);
163
- if (code == 101 || code == 69) {
164
- srcStart += 2;
165
- if (srcStart >= srcEnd) unreachable();
166
-
167
- let exponentNegative = false;
168
- let exponentCode = load<u16>(srcStart);
169
- if (exponentCode == 45 || exponentCode == 43) {
170
- exponentNegative = exponentCode == 45;
171
- srcStart += 2;
172
- if (srcStart >= srcEnd) unreachable();
173
- exponentCode = load<u16>(srcStart);
174
- }
175
-
176
- let exponent = <u32>exponentCode - 48;
177
- if (exponent > 9) unreachable();
178
- srcStart += 2;
179
- while (srcStart < srcEnd) {
180
- const code = load<u16>(srcStart);
181
- const digit = <u32>code - 48;
182
- if (digit > 9) break;
183
- exponent = exponent * 10 + digit;
184
- srcStart += 2;
185
- }
186
-
187
- const power = pow10Fast(exponent);
188
- value = exponentNegative ? value / power : value * power;
189
- }
190
- }
191
-
192
- if (negative) value = -value;
193
-
194
- if (sizeof<T>() == sizeof<f32>()) {
195
- store<f32>(fieldPtr, <f32>value);
196
- } else {
197
- store<f64>(fieldPtr, value);
198
- }
199
-
200
- return srcStart;
201
- }
@@ -1,132 +0,0 @@
1
- import { OBJECT, TOTAL_OVERHEAD } from "rt/common";
2
- import { __heap_base } from "memory";
3
- import { bs } from "../../../lib/as-bs";
4
- import { BACK_SLASH, QUOTE } from "../../custom/chars";
5
- import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
6
- import { hex4_to_u16_swar } from "../../util/swar";
7
-
8
- // @ts-ignore: inline
9
- @inline function writeStringToField(dstFieldPtr: usize, srcStart: usize, byteLength: u32): void {
10
- if (byteLength == 0) {
11
- store<usize>(dstFieldPtr, changetype<usize>(""));
12
- return;
13
- }
14
-
15
- const current = load<usize>(dstFieldPtr);
16
- let stringPtr: usize;
17
- if (current >= __heap_base) {
18
- if (changetype<OBJECT>(current - TOTAL_OVERHEAD).rtSize == byteLength) {
19
- stringPtr = current;
20
- } else {
21
- stringPtr = __renew(current, byteLength);
22
- store<usize>(dstFieldPtr, stringPtr);
23
- }
24
- } else {
25
- stringPtr = __new(byteLength, idof<string>());
26
- store<usize>(dstFieldPtr, stringPtr);
27
- }
28
- memory.copy(stringPtr, srcStart, byteLength);
29
- }
30
-
31
- // @ts-ignore: inline
32
- @inline export function deserializeString(srcStart: usize, srcEnd: usize): string {
33
- // Strip quotes
34
- srcStart += 2;
35
- srcEnd -= 2;
36
- const outStart = bs.offset - bs.buffer;
37
- bs.ensureSize(u32(srcEnd - srcStart));
38
-
39
- while (srcStart < srcEnd) {
40
- const block = load<u16>(srcStart);
41
- store<u16>(bs.offset, block);
42
- srcStart += 2;
43
-
44
- // Early exit
45
- if (block !== 0x5c) {
46
- bs.offset += 2;
47
- continue;
48
- }
49
-
50
- const code = load<u16>(srcStart);
51
- if (code !== 0x75) {
52
- // Short escapes (\n \t \" \\)
53
- const block = load<u16>(srcStart);
54
- const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + block);
55
- store<u16>(bs.offset, escape);
56
- srcStart += 2;
57
- } else {
58
- // Unicode escape (\uXXXX)
59
- const block = load<u64>(srcStart, 2); // XXXX
60
- const escaped = hex4_to_u16_swar(block);
61
- store<u16>(bs.offset, escaped);
62
- srcStart += 10;
63
- }
64
-
65
- bs.offset += 2;
66
- }
67
- return bs.sliceOut<string>(outStart);
68
- }
69
-
70
- // @ts-ignore: inline
71
- @inline export function deserializeStringField<T extends string | null>(srcStart: usize, srcEnd: usize, dstObj: usize, dstOffset: usize = 0): usize {
72
- const dstFieldPtr = dstObj + dstOffset;
73
- if (srcStart + 2 > srcEnd || load<u16>(srcStart) != QUOTE) abort("Expected leading quote");
74
-
75
- const payloadStart = srcStart + 2;
76
- srcStart = payloadStart;
77
-
78
- while (srcStart < srcEnd) {
79
- const char = load<u16>(srcStart);
80
- if (char == QUOTE) {
81
- writeStringToField(dstFieldPtr, payloadStart, <u32>(srcStart - payloadStart));
82
- return srcStart + 2;
83
- }
84
- if (char != BACK_SLASH) {
85
- srcStart += 2;
86
- continue;
87
- }
88
-
89
- bs.offset = bs.buffer;
90
- bs.ensureSize(u32(srcEnd - payloadStart));
91
- const prefixLen = <u32>(srcStart - payloadStart);
92
- if (prefixLen != 0) {
93
- memory.copy(bs.buffer, payloadStart, prefixLen);
94
- bs.offset += prefixLen;
95
- }
96
-
97
- while (srcStart < srcEnd) {
98
- const block = load<u16>(srcStart);
99
- if (block == QUOTE) {
100
- writeStringToField(dstFieldPtr, bs.buffer, <u32>(bs.offset - bs.buffer));
101
- bs.offset = bs.buffer;
102
- return srcStart + 2;
103
- }
104
-
105
- if (block != BACK_SLASH) {
106
- store<u16>(bs.offset, block);
107
- srcStart += 2;
108
- bs.offset += 2;
109
- continue;
110
- }
111
-
112
- srcStart += 2;
113
- const code = load<u16>(srcStart);
114
- if (code !== 0x75) {
115
- const escape = load<u16>(DESERIALIZE_ESCAPE_TABLE + code);
116
- store<u16>(bs.offset, escape);
117
- srcStart += 2;
118
- } else {
119
- const escaped = hex4_to_u16_swar(load<u64>(srcStart, 2));
120
- store<u16>(bs.offset, escaped);
121
- srcStart += 10;
122
- }
123
- bs.offset += 2;
124
- }
125
-
126
- bs.offset = bs.buffer;
127
- break;
128
- }
129
-
130
- abort("Unterminated string literal");
131
- return srcStart;
132
- }
@@ -1,79 +0,0 @@
1
- import { JSON } from "../..";
2
- import { bs } from "../../../lib/as-bs";
3
- import { serializeArray } from "./array";
4
- import { serializeBool } from "./bool";
5
- import { serializeFloat32, serializeFloat64 } from "./float";
6
- import { serializeInteger } from "./integer";
7
- import { serializeMap } from "./map";
8
- import { serializeObject } from "./object";
9
- import { serializeString } from "./string";
10
- import { serializeDynamic } from "../index/typedarray";
11
-
12
- export function serializeArbitrary(src: JSON.Value): void {
13
- switch (src.type) {
14
- case JSON.Types.Null:
15
- bs.proposeSize(8);
16
- store<u64>(bs.offset, 30399761348886638);
17
- bs.offset += 8;
18
- break;
19
- case JSON.Types.U8:
20
- serializeInteger<u8>(src.get<u8>());
21
- break;
22
- case JSON.Types.U16:
23
- serializeInteger<u16>(src.get<u16>());
24
- break;
25
- case JSON.Types.U32:
26
- serializeInteger<u32>(src.get<u32>());
27
- break;
28
- case JSON.Types.U64:
29
- serializeInteger<u64>(src.get<u64>());
30
- break;
31
- case JSON.Types.I8:
32
- serializeInteger<i8>(src.get<i8>());
33
- break;
34
- case JSON.Types.I16:
35
- serializeInteger<i16>(src.get<i16>());
36
- break;
37
- case JSON.Types.I32:
38
- serializeInteger<i32>(src.get<i32>());
39
- break;
40
- case JSON.Types.I64:
41
- serializeInteger<i64>(src.get<i64>());
42
- break;
43
- case JSON.Types.F32:
44
- serializeFloat32(src.get<f32>());
45
- break;
46
- case JSON.Types.F64:
47
- serializeFloat64(src.get<f64>());
48
- break;
49
- case JSON.Types.String:
50
- serializeString(src.get<string>());
51
- break;
52
- case JSON.Types.Bool:
53
- serializeBool(src.get<bool>());
54
- break;
55
- case JSON.Types.Array: {
56
- serializeArray(src.get<JSON.Value[]>());
57
- break;
58
- }
59
- case JSON.Types.Object: {
60
- serializeObject(src.get<JSON.Obj>());
61
- break;
62
- }
63
- case JSON.Types.Map: {
64
- serializeMap(src.get<Map<string, JSON.Value>>());
65
- break;
66
- }
67
- case JSON.Types.TypedArray:
68
- case JSON.Types.ArrayBuffer: {
69
- serializeDynamic(src.type, src.get<usize>());
70
- break;
71
- }
72
- default: {
73
- const fn = JSON.Value.METHODS.get(src.type - JSON.Types.Struct);
74
- const ptr = src.get<usize>();
75
- call_indirect<void>(fn, 0, ptr);
76
- break;
77
- }
78
- }
79
- }
@@ -1,86 +0,0 @@
1
- import { bs } from "../../../lib/as-bs";
2
- import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars";
3
- import { JSON } from "../..";
4
- import { serializeBoolUnsafe } from "./bool";
5
- import { serializeFloat32Unsafe, serializeFloat64Unsafe } from "./float";
6
- import { serializeIntegerUnsafe } from "./integer";
7
- import { serializeString } from "../index/string";
8
-
9
-
10
- @inline
11
- function maxIntegerBytes<T extends number>(): u32 {
12
- if (sizeof<T>() == 1) return isSigned<T>() ? 8 : 6;
13
- if (sizeof<T>() == 2) return isSigned<T>() ? 12 : 10;
14
- if (sizeof<T>() == 4) return isSigned<T>() ? 22 : 20;
15
- return isSigned<T>() ? 42 : 40;
16
- }
17
-
18
-
19
- @inline
20
- function reservePrimitiveArray<T>(len: i32): void {
21
- if (len <= 0) return;
22
- if (isBoolean<T>()) {
23
- bs.proposeSize(4 + <u32>len * 12);
24
- } else if (isInteger<T>()) {
25
- bs.proposeSize(4 + <u32>len * (maxIntegerBytes<T>() + 2));
26
- } else if (isFloat<T>()) {
27
- bs.proposeSize(4 + <u32>len * (sizeof<T>() == 4 ? 34 : 66));
28
- } else {
29
- bs.proposeSize(4 + <u32>(len - 1) * 2);
30
- }
31
- }
32
-
33
-
34
- @inline
35
- function serializeArrayElement<T>(value: T): void {
36
- if (isString<T>()) {
37
- serializeString(value as string);
38
- return;
39
- }
40
- if (isBoolean<T>()) {
41
- serializeBoolUnsafe(<bool>value);
42
- return;
43
- }
44
- if (isInteger<T>()) {
45
- serializeIntegerUnsafe<T>(value);
46
- return;
47
- }
48
- if (isFloat<T>()) {
49
- if (sizeof<T>() == 4) serializeFloat32Unsafe(<f32>value);
50
- else serializeFloat64Unsafe(<f64>value);
51
- return;
52
- }
53
- JSON.__serialize<T>(value);
54
- }
55
-
56
- export function serializeArray<T extends any[]>(src: T): void {
57
- const len = src.length;
58
- const end = len - 1;
59
- let i = 0;
60
- if (end == -1) {
61
- bs.proposeSize(4);
62
- store<u32>(bs.offset, 6094939);
63
- bs.offset += 4;
64
- return;
65
- }
66
- if (isBoolean<valueof<T>>() || isInteger<valueof<T>>() || isFloat<valueof<T>>() || isString<valueof<T>>()) {
67
- reservePrimitiveArray<valueof<T>>(len);
68
- } else {
69
- bs.proposeSize(4 + <u32>(len - 1) * 2);
70
- }
71
-
72
- store<u16>(bs.offset, BRACKET_LEFT);
73
- bs.offset += 2;
74
-
75
- while (i < end) {
76
- const block = unchecked(src[i++]);
77
- serializeArrayElement<valueof<T>>(block);
78
- store<u16>(bs.offset, COMMA);
79
- bs.offset += 2;
80
- }
81
-
82
- const lastBlock = unchecked(src[end]);
83
- serializeArrayElement<valueof<T>>(lastBlock);
84
- store<u16>(bs.offset, BRACKET_RIGHT);
85
- bs.offset += 2;
86
- }
@@ -1,20 +0,0 @@
1
- import { bs } from "../../../lib/as-bs";
2
- import { itoa_buffered } from "util/number";
3
-
4
-
5
- @inline
6
- export function serializeIntegerUnsafe<T extends number>(data: T): void {
7
- const bytesWritten = itoa_buffered(bs.offset, data) << 1;
8
- bs.offset += bytesWritten;
9
- }
10
-
11
- // @ts-ignore: inline
12
- @inline export function serializeInteger<T extends number>(data: T): void {
13
- bs.ensureSize(sizeof<T>() << 3);
14
- const bytesWritten = itoa_buffered(bs.offset, data) << 1;
15
- bs.growSize(bytesWritten);
16
- bs.offset += bytesWritten;
17
- }
18
-
19
- // 32 {"x":,"y":,"z"}
20
- // 18 3.41.28.3
@@ -1,42 +0,0 @@
1
- import { bs } from "../../../lib/as-bs";
2
- import { JSON } from "../..";
3
- import { BRACE_LEFT, BRACE_RIGHT, COLON, COMMA } from "../../custom/chars";
4
- import { serializeArbitrary } from "./arbitrary";
5
- import { serializeString_SWAR } from "../swar/string";
6
-
7
- export function serializeObject(src: JSON.Obj): void {
8
- const srcSize = src.size;
9
- const srcEnd = srcSize - 1;
10
-
11
- if (srcSize == 0) {
12
- bs.proposeSize(4);
13
- store<u32>(bs.offset, 8192123);
14
- bs.offset += 4;
15
- return;
16
- }
17
-
18
- const keys = src.keys();
19
- const values = src.values();
20
-
21
- bs.proposeSize(4 + <u32>(srcSize - 1) * 2 + <u32>srcSize * 2);
22
- store<u16>(bs.offset, BRACE_LEFT);
23
- bs.offset += 2;
24
-
25
- for (let i = 0; i < srcEnd; i++) {
26
- serializeString_SWAR(unchecked(keys[i]));
27
- store<u16>(bs.offset, COLON);
28
- bs.offset += 2;
29
-
30
- serializeArbitrary(unchecked(values[i]));
31
- store<u16>(bs.offset, COMMA);
32
- bs.offset += 2;
33
- }
34
-
35
- serializeString_SWAR(unchecked(keys[srcEnd]));
36
- store<u16>(bs.offset, COLON);
37
- bs.offset += 2;
38
- serializeArbitrary(unchecked(values[srcEnd]));
39
-
40
- store<u16>(bs.offset, BRACE_RIGHT);
41
- bs.offset += 2;
42
- }
File without changes
File without changes
File without changes
File without changes