json-as 1.0.0-alpha.3 → 1.0.0-alpha.4
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/CHANGELOG +14 -0
- package/README.md +31 -19
- package/assembly/__tests__/box.spec.ts +37 -0
- package/assembly/__tests__/date.spec.ts +38 -0
- package/assembly/deserialize/simple/bool.ts +4 -7
- package/assembly/deserialize/simple/date.ts +2 -2
- package/assembly/deserialize/simple/object.ts +3 -1
- package/assembly/index.ts +31 -8
- package/assembly/serialize/simd/string.ts +11 -11
- package/assembly/serialize/simple/array.ts +4 -3
- package/assembly/serialize/simple/float.ts +1 -1
- package/assembly/serialize/simple/integer.ts +7 -2
- package/assembly/test.ts +58 -4
- package/assembly/util/snp.ts +2 -2
- package/modules/as-bs/assembly/index.ts +61 -30
- package/package.json +5 -5
- package/transform/lib/builder.js +1340 -1262
- package/transform/lib/index.js +582 -512
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linker.js +12 -10
- package/transform/lib/types.js +19 -19
- package/transform/lib/util.js +34 -34
- package/transform/lib/visitor.js +529 -526
- package/transform/src/index.ts +22 -16
package/transform/src/index.ts
CHANGED
|
@@ -138,7 +138,6 @@ class JSONTransform extends Visitor {
|
|
|
138
138
|
let SERIALIZE = "__SERIALIZE(ptr: usize): void {\n";
|
|
139
139
|
let INITIALIZE = "@inline __INITIALIZE(): this {\n";
|
|
140
140
|
let DESERIALIZE = "__DESERIALIZE(keyStart: usize, keyEnd: usize, valStart: usize, valEnd: usize, ptr: usize): void {\n switch (<u32>keyEnd - <u32>keyStart) {\n";
|
|
141
|
-
let ALLOCATE = "@inline __ALLOCATE(): void {\n";
|
|
142
141
|
|
|
143
142
|
indent = " ";
|
|
144
143
|
|
|
@@ -224,6 +223,13 @@ class JSONTransform extends Visitor {
|
|
|
224
223
|
if (member.flags.get(PropertyFlags.OmitIf).kind == NodeKind.Function) {
|
|
225
224
|
const arg = member.flags.get(PropertyFlags.OmitIf) as FunctionExpression;
|
|
226
225
|
// @ts-ignore: type
|
|
226
|
+
arg.declaration.signature.parameters[0].type = Node.createNamedType(
|
|
227
|
+
Node.createSimpleTypeName("this", node.range),
|
|
228
|
+
null,
|
|
229
|
+
false,
|
|
230
|
+
node.range
|
|
231
|
+
);
|
|
232
|
+
// @ts-ignore: type
|
|
227
233
|
arg.declaration.signature.returnType.name = Node.createSimpleTypeName("boolean", arg.declaration.signature.returnType.name.range);
|
|
228
234
|
SERIALIZE += indent + `if (!(${toString(member.flags.get(PropertyFlags.OmitIf))})(this)) {\n`;
|
|
229
235
|
} else {
|
|
@@ -272,31 +278,39 @@ class JSONTransform extends Visitor {
|
|
|
272
278
|
indentInc();
|
|
273
279
|
if (memberLen == 2) DESERIALIZE += `${indent}switch (load<u16>(keyStart)) {\n`;
|
|
274
280
|
else if (memberLen == 4) DESERIALIZE += `${indent}switch (load<u32>(keyStart)) {\n`;
|
|
275
|
-
else if (memberLen == 6) DESERIALIZE += `${indent}let code =
|
|
281
|
+
else if (memberLen == 6) DESERIALIZE += `${indent}let code = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n`;
|
|
282
|
+
else if (memberLen == 6) DESERIALIZE += `${indent}let code = load<u64>(keyStart);\n`;
|
|
276
283
|
else DESERIALIZE += toMemCDecl(memberLen, indent);
|
|
277
284
|
for (let i = 0; i < memberGroup.length; i++) {
|
|
278
285
|
const member = memberGroup[i];
|
|
279
286
|
const memberName = member.alias || member.name;
|
|
287
|
+
const dst = this.schemas.find(v => v.name == member.type) ? "ptr + offsetof<this>(\"" + member.name + "\") + 12" : "0";
|
|
280
288
|
if (memberLen == 2) {
|
|
281
289
|
DESERIALIZE += `${indent} case ${memberName.charCodeAt(0)}: { // ${memberName}\n`;
|
|
282
|
-
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
290
|
+
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd, ${dst}), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
283
291
|
DESERIALIZE += `${indent} return;\n`;
|
|
284
292
|
DESERIALIZE += `${indent} }\n`;
|
|
285
293
|
} else if (memberLen == 4) {
|
|
286
294
|
DESERIALIZE += `${indent} case ${toU32(memberName)}: { // ${memberName}\n`;
|
|
287
|
-
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
295
|
+
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd, ${dst}), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
288
296
|
DESERIALIZE += `${indent} return;\n`;
|
|
289
297
|
DESERIALIZE += `${indent} }\n`;
|
|
290
298
|
} else if (memberLen == 6) {
|
|
291
299
|
DESERIALIZE += i == 0 ? indent : "";
|
|
292
300
|
DESERIALIZE += `if (code == ${toU48(memberName)}) { // ${memberName}\n`;
|
|
293
|
-
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
301
|
+
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd, ${dst}), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
302
|
+
DESERIALIZE += `${indent} return;\n`;
|
|
303
|
+
DESERIALIZE += `${indent}}${i < memberGroup.length - 1 ? " else " : "\n"}`;
|
|
304
|
+
} else if (memberLen == 8) {
|
|
305
|
+
DESERIALIZE += i == 0 ? indent : "";
|
|
306
|
+
DESERIALIZE += `if (code == ${toU64(memberName)}) { // ${memberName}\n`;
|
|
307
|
+
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd, ${dst}), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
294
308
|
DESERIALIZE += `${indent} return;\n`;
|
|
295
309
|
DESERIALIZE += `${indent}}${i < memberGroup.length - 1 ? " else " : "\n"}`;
|
|
296
310
|
} else {
|
|
297
311
|
DESERIALIZE += i == 0 ? indent : "";
|
|
298
312
|
DESERIALIZE += `if (${toMemCCheck(memberName)}) { // ${memberName}\n`;
|
|
299
|
-
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
313
|
+
DESERIALIZE += `${indent} store<${member.type}>(ptr, JSON.__deserialize<${member.type}>(valStart, valEnd, ${dst}), offsetof<this>(${JSON.stringify(member.name)}));\n`;
|
|
300
314
|
DESERIALIZE += `${indent} return;\n`;
|
|
301
315
|
DESERIALIZE += `${indent}}${i < memberGroup.length - 1 ? " else " : "\n"}`;
|
|
302
316
|
}
|
|
@@ -321,8 +335,7 @@ class JSONTransform extends Visitor {
|
|
|
321
335
|
SERIALIZE += indent + "bs.offset += 2;\n";
|
|
322
336
|
SERIALIZE += "}";
|
|
323
337
|
|
|
324
|
-
|
|
325
|
-
ALLOCATE += "}";
|
|
338
|
+
SERIALIZE = SERIALIZE.slice(0, 32) + indent + "bs.proposeSize(" + this.schema.byteSize + ");\n" + SERIALIZE.slice(32);
|
|
326
339
|
|
|
327
340
|
INITIALIZE += " return this;\n";
|
|
328
341
|
INITIALIZE += "}";
|
|
@@ -331,46 +344,39 @@ class JSONTransform extends Visitor {
|
|
|
331
344
|
console.log(SERIALIZE);
|
|
332
345
|
console.log(INITIALIZE);
|
|
333
346
|
console.log(DESERIALIZE);
|
|
334
|
-
console.log(ALLOCATE);
|
|
335
347
|
}
|
|
336
348
|
|
|
337
349
|
const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE, node);
|
|
338
350
|
const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
|
|
339
351
|
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
|
|
340
|
-
const ALLOCATE_METHOD = SimpleParser.parseClassMember(ALLOCATE, node);
|
|
341
352
|
|
|
342
353
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_METHOD);
|
|
343
354
|
if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD);
|
|
344
355
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD);
|
|
345
|
-
if (!node.members.find((v) => v.name.text == "__ALLOCATE")) node.members.push(ALLOCATE_METHOD);
|
|
346
356
|
super.visitClassDeclaration(node);
|
|
347
357
|
}
|
|
348
358
|
generateEmptyMethods(node: ClassDeclaration): void {
|
|
349
359
|
let SERIALIZE_RAW_EMPTY = '@inline __SERIALIZE(ptr: usize = changetype<usize>(this)): string {\n return "{}";\n}';
|
|
350
|
-
let SERIALIZE_BS_EMPTY = "@inline __SERIALIZE(ptr: usize: bool): void {\n store<u32>(bs.offset, 8192123);\n bs.offset += 4;\n}";
|
|
360
|
+
let SERIALIZE_BS_EMPTY = "@inline __SERIALIZE(ptr: usize: bool): void {\n bs.proposeSize(4);\n store<u32>(bs.offset, 8192123);\n bs.offset += 4;\n}";
|
|
351
361
|
let INITIALIZE_EMPTY = "@inline __INITIALIZE(): this {\n return this;\n}";
|
|
352
362
|
let DESERIALIZE_EMPTY = "@inline __DESERIALIZE(keyStart: usize, keyEnd: usize, valStart: usize, valEnd: usize, ptr: usize): void {\n return false;\n}";
|
|
353
|
-
let ALLOCATE_EMPTY = "@inline __ALLOCATE(): void {\n bs.ensureSize(4);\n}";
|
|
354
363
|
|
|
355
364
|
if (process.env["JSON_DEBUG"]) {
|
|
356
365
|
console.log(SERIALIZE_RAW_EMPTY);
|
|
357
366
|
console.log(SERIALIZE_BS_EMPTY);
|
|
358
367
|
console.log(INITIALIZE_EMPTY);
|
|
359
368
|
console.log(DESERIALIZE_EMPTY);
|
|
360
|
-
console.log(ALLOCATE_EMPTY);
|
|
361
369
|
}
|
|
362
370
|
|
|
363
371
|
const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
|
|
364
372
|
const SERIALIZE_BS_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_BS_EMPTY, node);
|
|
365
373
|
const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
|
|
366
374
|
const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
|
|
367
|
-
const ALLOCATE_METHOD_EMPTY = SimpleParser.parseClassMember(ALLOCATE_EMPTY, node);
|
|
368
375
|
|
|
369
376
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD_EMPTY);
|
|
370
377
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_BS_METHOD_EMPTY);
|
|
371
378
|
if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD_EMPTY);
|
|
372
379
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD_EMPTY);
|
|
373
|
-
if (!node.members.find((v) => v.name.text == "__ALLOCATE")) node.members.push(ALLOCATE_METHOD_EMPTY);
|
|
374
380
|
}
|
|
375
381
|
// visitCallExpression(node: CallExpression, ref: Node): void {
|
|
376
382
|
// super.visitCallExpression(node, ref);
|