json-as 0.8.6 → 0.8.7
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.
- package/.github/workflows/nodejs.yml +7 -1
- package/CHANGELOG +4 -1
- package/README.md +26 -16
- package/assembly/__tests__/deserialize.spec.ts +298 -0
- package/assembly/__tests__/serialize.spec.ts +375 -0
- package/assembly/deserialize/array/array.ts +31 -0
- package/assembly/deserialize/array/bool.ts +19 -0
- package/assembly/deserialize/array/float.ts +24 -0
- package/assembly/deserialize/array/integer.ts +24 -0
- package/assembly/deserialize/array/map.ts +27 -0
- package/assembly/deserialize/array/object.ts +27 -0
- package/assembly/deserialize/array/string.ts +29 -0
- package/assembly/deserialize/array.ts +37 -0
- package/assembly/deserialize/bool.ts +18 -0
- package/assembly/deserialize/box.ts +17 -0
- package/assembly/deserialize/date.ts +11 -0
- package/assembly/deserialize/float.ts +9 -0
- package/assembly/deserialize/integer.ts +7 -0
- package/assembly/deserialize/map.ts +182 -0
- package/assembly/deserialize/object.ts +136 -0
- package/assembly/deserialize/string.ts +88 -0
- package/assembly/index.d.ts +7 -1
- package/assembly/index.ts +129 -1
- package/assembly/serialize/array.ts +52 -0
- package/assembly/serialize/bool.ts +4 -0
- package/assembly/serialize/box.ts +10 -0
- package/assembly/serialize/date.ts +4 -0
- package/assembly/serialize/float.ts +4 -0
- package/assembly/serialize/integer.ts +5 -0
- package/assembly/serialize/map.ts +24 -0
- package/assembly/serialize/object.ts +7 -0
- package/assembly/serialize/string.ts +64 -0
- package/assembly/src/sink.ts +286 -0
- package/assembly/src/util.ts +6 -0
- package/assembly/test.ts +34 -16
- package/bench/benchmark.ts +7 -3
- package/bench.js +14 -3
- package/index.ts +1 -1
- package/package.json +6 -8
- package/transform/lib/index.js +301 -183
- package/transform/lib/index.old.js +257 -0
- package/transform/lib/types.js +17 -0
- package/transform/package.json +1 -1
- package/transform/src/index.old.ts +312 -0
- package/transform/src/index.ts +301 -215
- package/transform/tsconfig.json +2 -2
- package/tsconfig.json +94 -102
- package/assembly/__benches__/as-json.ts +0 -88
- package/assembly/__benches__/as-tral.d.ts +0 -1
- package/assembly/__tests__/as-json.spec.ts +0 -673
- package/assembly/__tests__/as-pect.d.ts +0 -1
- package/assembly/src/json.ts +0 -941
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { backSlashCode, backspaceCode as BACKSPACE, carriageReturnCode as CARRIAGE_RETURN, formFeedCode as FORM_FEED, newLineCode as NEWLINE, quoteCode, quoteWord, tabCode as TAB } from "../src/chars";
|
|
2
|
+
import { Sink } from "../src/sink";
|
|
3
|
+
import { unsafeCharCodeAt } from "../src/util";
|
|
4
|
+
|
|
5
|
+
// @ts-ignore: Decorator
|
|
6
|
+
@inline export function serializeString(data: string): string {
|
|
7
|
+
if (data.length === 0) {
|
|
8
|
+
return quoteWord + quoteWord;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let result = Sink.fromString(quoteWord, data.length);
|
|
12
|
+
|
|
13
|
+
let last: i32 = 0;
|
|
14
|
+
for (let i = 0; i < data.length; i++) {
|
|
15
|
+
const char = unsafeCharCodeAt(<string>data, i);
|
|
16
|
+
if (char === quoteCode || char === backSlashCode) {
|
|
17
|
+
result.write(<string>data, last, i);
|
|
18
|
+
result.writeCodePoint(backSlashCode);
|
|
19
|
+
last = i;
|
|
20
|
+
} else if (char < 16) {
|
|
21
|
+
result.write(<string>data, last, i);
|
|
22
|
+
last = i + 1;
|
|
23
|
+
switch (char) {
|
|
24
|
+
case BACKSPACE: {
|
|
25
|
+
result.write("\\b");
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case TAB: {
|
|
29
|
+
result.write("\\t");
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case NEWLINE: {
|
|
33
|
+
result.write("\\n");
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case FORM_FEED: {
|
|
37
|
+
result.write("\\f");
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case CARRIAGE_RETURN: {
|
|
41
|
+
result.write("\\r");
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
default: {
|
|
45
|
+
// all chars 0-31 must be encoded as a four digit unicode escape sequence
|
|
46
|
+
// \u0000 to \u000f handled here
|
|
47
|
+
result.write("\\u000");
|
|
48
|
+
result.write(char.toString(16));
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} else if (char < 32) {
|
|
53
|
+
result.write(<string>data, last, i);
|
|
54
|
+
last = i + 1;
|
|
55
|
+
// all chars 0-31 must be encoded as a four digit unicode escape sequence
|
|
56
|
+
// \u0010 to \u001f handled here
|
|
57
|
+
result.write("\\u00");
|
|
58
|
+
result.write(char.toString(16));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
result.write(<string>data, last);
|
|
62
|
+
result.writeCodePoint(quoteCode);
|
|
63
|
+
return result.toString();
|
|
64
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { itoa_buffered, dtoa_buffered } from "util/number";
|
|
2
|
+
|
|
3
|
+
const MIN_BUFFER_LEN = 32;
|
|
4
|
+
const MIN_BUFFER_SIZE: u32 = MIN_BUFFER_LEN << 1;
|
|
5
|
+
|
|
6
|
+
const NEW_LINE_CHAR: u16 = 0x0A; // \n
|
|
7
|
+
|
|
8
|
+
// @ts-ignore: decorator
|
|
9
|
+
@inline function nextPowerOf2(n: u32): u32 {
|
|
10
|
+
return 1 << 32 - clz(n - 1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class Sink {
|
|
14
|
+
public buffer!: ArrayBuffer;
|
|
15
|
+
public offset: u32 = 0;
|
|
16
|
+
|
|
17
|
+
static withCapacity(capacity: i32): Sink {
|
|
18
|
+
const sink = new Sink();
|
|
19
|
+
sink.buffer = changetype<ArrayBuffer>(__new(
|
|
20
|
+
max<u32>(MIN_BUFFER_SIZE, <u32>capacity << 1),
|
|
21
|
+
idof<ArrayBuffer>())
|
|
22
|
+
);
|
|
23
|
+
return sink;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static fromString(initial: string = "", capacity: i32 = MIN_BUFFER_LEN): Sink {
|
|
27
|
+
const sink = new Sink();
|
|
28
|
+
const size = <u32>initial.length << 1;
|
|
29
|
+
sink.buffer = changetype<ArrayBuffer>(__new(
|
|
30
|
+
max<u32>(size, max<u32>(MIN_BUFFER_SIZE, <u32>capacity << 1)),
|
|
31
|
+
idof<ArrayBuffer>())
|
|
32
|
+
);
|
|
33
|
+
if (size) {
|
|
34
|
+
memory.copy(
|
|
35
|
+
changetype<usize>(sink.buffer),
|
|
36
|
+
changetype<usize>(initial),
|
|
37
|
+
size
|
|
38
|
+
);
|
|
39
|
+
sink.offset += size;
|
|
40
|
+
}
|
|
41
|
+
return sink;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static fromStringLiteral(initial: string = ""): Sink {
|
|
45
|
+
const sink = new Sink();
|
|
46
|
+
const size = <u32>initial.length << 1;
|
|
47
|
+
sink.buffer = changetype<ArrayBuffer>(__new(
|
|
48
|
+
size,
|
|
49
|
+
idof<ArrayBuffer>())
|
|
50
|
+
);
|
|
51
|
+
if (size) {
|
|
52
|
+
memory.copy(
|
|
53
|
+
changetype<usize>(sink.buffer),
|
|
54
|
+
changetype<usize>(initial),
|
|
55
|
+
size
|
|
56
|
+
);
|
|
57
|
+
sink.offset += size;
|
|
58
|
+
}
|
|
59
|
+
return sink;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static fromBuffer(initial: ArrayBuffer, capacity: i32 = MIN_BUFFER_LEN): Sink {
|
|
63
|
+
const sink = new Sink();
|
|
64
|
+
const size = <u32>initial.byteLength;
|
|
65
|
+
sink.buffer = changetype<ArrayBuffer>(__new(
|
|
66
|
+
max<u32>(size, max<u32>(MIN_BUFFER_SIZE, <u32>capacity << 1)),
|
|
67
|
+
idof<ArrayBuffer>())
|
|
68
|
+
);
|
|
69
|
+
if (size) {
|
|
70
|
+
memory.copy(
|
|
71
|
+
changetype<usize>(sink.buffer),
|
|
72
|
+
changetype<usize>(initial),
|
|
73
|
+
size
|
|
74
|
+
);
|
|
75
|
+
sink.offset = size;
|
|
76
|
+
}
|
|
77
|
+
return sink;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
constructor() { }
|
|
81
|
+
|
|
82
|
+
@inline get length(): i32 {
|
|
83
|
+
return this.offset >> 1;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@inline get capacity(): i32 {
|
|
87
|
+
return this.buffer.byteLength >>> 1;
|
|
88
|
+
}
|
|
89
|
+
@inline reset(): void {
|
|
90
|
+
this.offset = 0;
|
|
91
|
+
}
|
|
92
|
+
@inline write(src: string, start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink | null {
|
|
93
|
+
let len = src.length as u32;
|
|
94
|
+
|
|
95
|
+
if (start != 0 || end != i32.MAX_VALUE) {
|
|
96
|
+
let from: i32;
|
|
97
|
+
from = min<i32>(max(start, 0), len);
|
|
98
|
+
end = min<i32>(max(end, 0), len);
|
|
99
|
+
start = min<i32>(from, end);
|
|
100
|
+
end = max<i32>(from, end);
|
|
101
|
+
len = end - start;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (!len) return null;
|
|
105
|
+
|
|
106
|
+
let size = len << 1;
|
|
107
|
+
this.ensureCapacity(size);
|
|
108
|
+
let offset = this.offset;
|
|
109
|
+
|
|
110
|
+
memory.copy(
|
|
111
|
+
changetype<usize>(this.buffer) + offset,
|
|
112
|
+
changetype<usize>(src) + (<usize>start << 1),
|
|
113
|
+
size
|
|
114
|
+
);
|
|
115
|
+
this.offset = offset + size;
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@inline writeLn(src: string = "", start: i32 = 0, end: i32 = i32.MAX_VALUE): Sink {
|
|
120
|
+
let len = src.length as u32;
|
|
121
|
+
if (start != 0 || end != i32.MAX_VALUE) {
|
|
122
|
+
let from: i32;
|
|
123
|
+
from = min<i32>(max(start, 0), len);
|
|
124
|
+
end = min<i32>(max(end, 0), len);
|
|
125
|
+
start = min<i32>(from, end);
|
|
126
|
+
end = max<i32>(from, end);
|
|
127
|
+
len = end - start;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let size = len << 1;
|
|
131
|
+
this.ensureCapacity(size + 2);
|
|
132
|
+
let offset = this.offset;
|
|
133
|
+
let dest = changetype<usize>(this.buffer) + offset;
|
|
134
|
+
if (size) memory.copy(dest, changetype<usize>(src) + (<usize>start << 1), size);
|
|
135
|
+
store<u16>(dest + size, NEW_LINE_CHAR);
|
|
136
|
+
this.offset = offset + (size + 2);
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@inline writeCodePoint(code: i32): Sink {
|
|
141
|
+
let hasSur = <u32>code > 0xFFFF;
|
|
142
|
+
this.ensureCapacity(2 << i32(hasSur));
|
|
143
|
+
|
|
144
|
+
let offset = this.offset;
|
|
145
|
+
let dest = changetype<usize>(this.buffer) + offset;
|
|
146
|
+
|
|
147
|
+
if (!hasSur) {
|
|
148
|
+
store<u16>(dest, <u16>code);
|
|
149
|
+
this.offset = offset + 2;
|
|
150
|
+
} else {
|
|
151
|
+
assert(<u32>code <= 0x10FFFF);
|
|
152
|
+
code -= 0x10000;
|
|
153
|
+
let hi = (code & 0x03FF) | 0xDC00;
|
|
154
|
+
let lo = code >>> 10 | 0xD800;
|
|
155
|
+
store<u32>(dest, lo | hi << 16);
|
|
156
|
+
this.offset = offset + 4;
|
|
157
|
+
}
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@inline writeCodePoint16(code: i32): Sink {
|
|
162
|
+
this.ensureCapacity(2);
|
|
163
|
+
|
|
164
|
+
let offset = this.offset;
|
|
165
|
+
let dest = changetype<usize>(this.buffer) + offset;
|
|
166
|
+
|
|
167
|
+
store<u16>(dest, <u16>code);
|
|
168
|
+
this.offset = offset + 2;
|
|
169
|
+
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@inline writeCodePointUnsafe(code: i32): Sink {
|
|
174
|
+
this.ensureCapacity(2);
|
|
175
|
+
|
|
176
|
+
let offset = this.offset;
|
|
177
|
+
let dest = changetype<usize>(this.buffer) + offset;
|
|
178
|
+
|
|
179
|
+
code -= 0x10000;
|
|
180
|
+
let hi = (code & 0x03FF) | 0xDC00;
|
|
181
|
+
let lo = code >>> 10 | 0xD800;
|
|
182
|
+
store<u32>(dest, lo | hi << 16);
|
|
183
|
+
this.offset = offset + 4;
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@inline writeNumber<T extends number>(value: T): Sink {
|
|
188
|
+
let offset = this.offset;
|
|
189
|
+
if (isInteger<T>()) {
|
|
190
|
+
let maxCapacity = 0;
|
|
191
|
+
// this also include size for sign
|
|
192
|
+
if (sizeof<T>() == 1) {
|
|
193
|
+
maxCapacity = 4 << 1;
|
|
194
|
+
} else if (sizeof<T>() == 2) {
|
|
195
|
+
maxCapacity = 6 << 1;
|
|
196
|
+
} else if (sizeof<T>() == 4) {
|
|
197
|
+
maxCapacity = 11 << 1;
|
|
198
|
+
} else if (sizeof<T>() == 8) {
|
|
199
|
+
maxCapacity = 21 << 1;
|
|
200
|
+
}
|
|
201
|
+
this.ensureCapacity(maxCapacity);
|
|
202
|
+
offset += itoa_buffered(
|
|
203
|
+
changetype<usize>(this.buffer) + offset,
|
|
204
|
+
value
|
|
205
|
+
) << 1;
|
|
206
|
+
} else {
|
|
207
|
+
this.ensureCapacity(32 << 1);
|
|
208
|
+
offset += dtoa_buffered(
|
|
209
|
+
changetype<usize>(this.buffer) + offset,
|
|
210
|
+
value
|
|
211
|
+
) << 1;
|
|
212
|
+
}
|
|
213
|
+
this.offset = offset;
|
|
214
|
+
return this;
|
|
215
|
+
}
|
|
216
|
+
@inline writeNumberUnsafe<T extends number>(value: T): Sink {
|
|
217
|
+
let offset = this.offset;
|
|
218
|
+
if (isInteger<T>()) {
|
|
219
|
+
offset += itoa_buffered(
|
|
220
|
+
changetype<usize>(this.buffer) + offset,
|
|
221
|
+
value
|
|
222
|
+
) << 1;
|
|
223
|
+
} else {
|
|
224
|
+
offset += dtoa_buffered(
|
|
225
|
+
changetype<usize>(this.buffer) + offset,
|
|
226
|
+
value
|
|
227
|
+
) << 1;
|
|
228
|
+
}
|
|
229
|
+
this.offset = offset;
|
|
230
|
+
return this;
|
|
231
|
+
}
|
|
232
|
+
@inline writeIntegerUnsafe<T extends number>(value: T): Sink {
|
|
233
|
+
let offset = this.offset;
|
|
234
|
+
if (isInteger<T>()) {
|
|
235
|
+
offset += itoa_buffered(
|
|
236
|
+
changetype<usize>(this.buffer) + offset,
|
|
237
|
+
value
|
|
238
|
+
) << 1;
|
|
239
|
+
} else {
|
|
240
|
+
offset += dtoa_buffered(
|
|
241
|
+
changetype<usize>(this.buffer) + offset,
|
|
242
|
+
value
|
|
243
|
+
) << 1;
|
|
244
|
+
}
|
|
245
|
+
this.offset = offset;
|
|
246
|
+
return this;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
@inline reserve(capacity: i32, clear: bool = false): void {
|
|
250
|
+
if (clear) this.offset = 0;
|
|
251
|
+
this.buffer = changetype<ArrayBuffer>(__renew(
|
|
252
|
+
changetype<usize>(this.buffer),
|
|
253
|
+
max<u32>(this.offset, max<u32>(MIN_BUFFER_SIZE, <u32>capacity << 1))
|
|
254
|
+
));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
@inline shrink(): void {
|
|
258
|
+
this.buffer = changetype<ArrayBuffer>(__renew(
|
|
259
|
+
changetype<usize>(this.buffer),
|
|
260
|
+
max<u32>(this.offset, MIN_BUFFER_SIZE)
|
|
261
|
+
));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
@inline clear(): void {
|
|
265
|
+
this.reserve(0, true);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@inline toString(): string {
|
|
269
|
+
let size = this.offset;
|
|
270
|
+
if (!size) return "";
|
|
271
|
+
let out = changetype<string>(__new(size, idof<string>()));
|
|
272
|
+
memory.copy(changetype<usize>(out), changetype<usize>(this.buffer), size);
|
|
273
|
+
return out;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
@inline ensureCapacity(deltaBytes: u32): void {
|
|
277
|
+
let buffer = this.buffer;
|
|
278
|
+
let newSize = this.offset + deltaBytes;
|
|
279
|
+
if (newSize > <u32>buffer.byteLength) {
|
|
280
|
+
this.buffer = changetype<ArrayBuffer>(__renew(
|
|
281
|
+
changetype<usize>(buffer),
|
|
282
|
+
nextPowerOf2(newSize)
|
|
283
|
+
));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
package/assembly/src/util.ts
CHANGED
|
@@ -2,6 +2,12 @@ import { StringSink } from "as-string-sink/assembly";
|
|
|
2
2
|
import { isSpace } from "util/string";
|
|
3
3
|
import { backSlashCode, quoteCode } from "./chars";
|
|
4
4
|
|
|
5
|
+
// @ts-ignore: Decorator
|
|
6
|
+
@inline export function isMap<T>(): bool {
|
|
7
|
+
let type = changetype<T>(0);
|
|
8
|
+
return type instanceof Map;
|
|
9
|
+
}
|
|
10
|
+
|
|
5
11
|
// @ts-ignore: Decorator
|
|
6
12
|
@inline export function unsafeCharCodeAt(data: string, pos: i32): i32 {
|
|
7
13
|
return load<u16>(changetype<usize>(data) + ((<usize>pos) << 1));
|
package/assembly/test.ts
CHANGED
|
@@ -1,23 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { JSON } from "./src/json";
|
|
1
|
+
import { JSON } from ".";
|
|
3
2
|
|
|
4
3
|
@json
|
|
5
|
-
class
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
tristateValue: Box<bool> | null = null;
|
|
4
|
+
class Vec3 {
|
|
5
|
+
x: f32 = 0.0;
|
|
6
|
+
y: f32 = 0.0;
|
|
7
|
+
z: f32 = 0.0;
|
|
10
8
|
}
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
@json
|
|
11
|
+
class Player {
|
|
12
|
+
@alias("first name")
|
|
13
|
+
firstName!: string;
|
|
14
|
+
lastName!: string;
|
|
15
|
+
lastActive!: i32[];
|
|
16
|
+
@omitif("this.age < 18")
|
|
17
|
+
age!: i32;
|
|
18
|
+
@omitnull()
|
|
19
|
+
pos!: Vec3 | null;
|
|
20
|
+
isVerified!: boolean;
|
|
15
21
|
}
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
const player: Player = {
|
|
24
|
+
firstName: "Emmet",
|
|
25
|
+
lastName: "West",
|
|
26
|
+
lastActive: [8, 27, 2022],
|
|
27
|
+
age: 13,
|
|
28
|
+
pos: {
|
|
29
|
+
x: 3.4,
|
|
30
|
+
y: 1.2,
|
|
31
|
+
z: 8.3
|
|
32
|
+
},
|
|
33
|
+
isVerified: true
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const stringified = JSON.stringify<Player>(player);
|
|
37
|
+
|
|
38
|
+
const parsed = JSON.parse<Player>(stringified);
|
|
18
39
|
|
|
19
|
-
|
|
20
|
-
console.log(JSON.stringify
|
|
21
|
-
console.log(changetype<usize>(p1).toString())
|
|
22
|
-
const p2 = JSON.parse<Foo>("{\"optionalNumber\":null,\"tristateValue\":false}");
|
|
23
|
-
console.log(JSON.stringify(p2));
|
|
40
|
+
console.log("Stringified: " + stringified);
|
|
41
|
+
console.log("Parsed: " + JSON.stringify(parsed));
|
package/bench/benchmark.ts
CHANGED
|
@@ -26,14 +26,14 @@ bench("Parse Number ATOI", () => {
|
|
|
26
26
|
bench("Parse Number STDLIB", () => {
|
|
27
27
|
blackbox<i32>(i32.parse("12345"));
|
|
28
28
|
});
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
bench("Stringify Object (Vec3)", () => {
|
|
31
31
|
blackbox<string>(JSON.stringify(vec));
|
|
32
|
-
})
|
|
32
|
+
});*/
|
|
33
33
|
|
|
34
34
|
bench("Parse Object (Vec3)", () => {
|
|
35
35
|
blackbox<Vec3>(JSON.parse<Vec3>('{"x":0,"y":0,"z":0}'));
|
|
36
|
-
})
|
|
36
|
+
});/*
|
|
37
37
|
|
|
38
38
|
bench("Stringify Number Array", () => {
|
|
39
39
|
blackbox<string>(JSON.stringify<i32[]>([1, 2, 3]));
|
|
@@ -47,6 +47,10 @@ bench("Stringify String", () => {
|
|
|
47
47
|
blackbox<string>(JSON.stringify(blackbox('Hello "World!')));
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
+
bench("Parse Number ATOI", () => {
|
|
51
|
+
blackbox<i32>(__atoi_fast<i32>("12345"));
|
|
52
|
+
})
|
|
53
|
+
|
|
50
54
|
bench("Parse String", () => {
|
|
51
55
|
blackbox<string>(JSON.parse<string>(blackbox('"Hello "World!"')));
|
|
52
56
|
});
|
package/bench.js
CHANGED
|
@@ -34,7 +34,18 @@ const vec = {
|
|
|
34
34
|
let data;
|
|
35
35
|
|
|
36
36
|
const bench = new Bench({ time: 1000 })
|
|
37
|
-
|
|
37
|
+
/*.add("stringify float", () => {
|
|
38
|
+
data = JSON.stringify(1.2345)
|
|
39
|
+
})
|
|
40
|
+
.add("parse float", () => {
|
|
41
|
+
data = JSON.parse("1.2345")
|
|
42
|
+
})
|
|
43
|
+
.add("stringify iny", () => {
|
|
44
|
+
data = JSON.stringify(12345)
|
|
45
|
+
})
|
|
46
|
+
.add("parse int", () => {
|
|
47
|
+
data = JSON.parse("12345")
|
|
48
|
+
})
|
|
38
49
|
.add("Stringify Object (Vec3)", () => {
|
|
39
50
|
data = JSON.stringify(vec);
|
|
40
51
|
})
|
|
@@ -54,9 +65,9 @@ const bench = new Bench({ time: 1000 })
|
|
|
54
65
|
.add("Stringify String", () => {
|
|
55
66
|
data = JSON.stringify('Hello "World!');
|
|
56
67
|
})
|
|
57
|
-
|
|
68
|
+
*/
|
|
58
69
|
.add("Parse String", () => {
|
|
59
|
-
data = JSON.parse('
|
|
70
|
+
data = JSON.parse('[[],[[]],[[],[[]]]]');
|
|
60
71
|
})
|
|
61
72
|
.todo("unimplemented .add");
|
|
62
73
|
|
package/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { JSON } from "./assembly/
|
|
1
|
+
export { JSON } from "./assembly/index";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.7",
|
|
4
4
|
"description": "JSON encoder/decoder for AssemblyScript",
|
|
5
5
|
"types": "assembly/index.ts",
|
|
6
6
|
"author": "Jairus Tanaka",
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
],
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"scripts": {
|
|
18
|
-
"test": "
|
|
19
|
-
"
|
|
20
|
-
"build:test": "asc assembly/test.ts -o build/test.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 0 --shrinkLevel 0 --noAssert --uncheckedBehavior always
|
|
18
|
+
"test": "wasmtime build/serialize.spec.wasm && wasmtime build/deserialize.spec.wasm",
|
|
19
|
+
"tests:build": "asc assembly/__tests__/serialize.spec.ts -o build/serialize.spec.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 0 --shrinkLevel 0 --noAssert --uncheckedBehavior always & asc assembly/__tests__/deserialize.spec.ts -o build/deserialize.spec.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 0 --shrinkLevel 0 --noAssert --uncheckedBehavior always",
|
|
20
|
+
"build:test": "asc assembly/test.ts -o build/test.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 0 --shrinkLevel 0 --noAssert --uncheckedBehavior always",
|
|
21
21
|
"build:bench": "asc bench/benchmark.ts -o bench/benchmark.wasm --transform ./transform --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime stub",
|
|
22
22
|
"bench:wasmtime": "wasmtime ./bench/benchmark.wasm",
|
|
23
|
-
"bench:
|
|
23
|
+
"bench:wazmer": "wasmer --llvm ./bench/benchmark.wasm",
|
|
24
24
|
"build:transform": "tsc -p ./transform",
|
|
25
25
|
"test:wasmtime": "wasmtime ./build/test.wasm",
|
|
26
26
|
"test:wavm": "wavm run ./build/test.wasm",
|
|
@@ -29,14 +29,12 @@
|
|
|
29
29
|
"prettier": "as-prettier -w ."
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@as-pect/cli": "^8.1.0",
|
|
33
|
-
"@as-tral/cli": "^3.0.2",
|
|
34
32
|
"@assemblyscript/wasi-shim": "^0.1.0",
|
|
35
33
|
"as-bench": "^0.0.0-alpha",
|
|
34
|
+
"as-test": "JairusSW/as-test",
|
|
36
35
|
"assemblyscript": "^0.27.22",
|
|
37
36
|
"assemblyscript-prettier": "^3.0.1",
|
|
38
37
|
"benchmark": "^2.1.4",
|
|
39
|
-
"kati": "^0.6.2",
|
|
40
38
|
"microtime": "^3.1.1",
|
|
41
39
|
"prettier": "^3.1.1",
|
|
42
40
|
"tinybench": "^2.5.1",
|