Skip to content

Commit 3a7bfab

Browse files
committed
feat: make the two object generators more similar
1 parent 7c9e590 commit 3a7bfab

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

src/__benchmark__/benchmark.array.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ for (let i = 0; i < n; i++) {
2020
}
2121

2222
for (let i = 0; i < 25_000; i++) {
23-
PointsParser.read(buf);
23+
PointsParser.raw(buf);
2424
}

src/object.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ export class StrutTypeObjectGenerated<T extends Record<string, StrutAny>> extend
4747
const entries = Object.entries(obj);
4848
let isLookupRequired = false;
4949
for (const [key, parser] of entries) {
50+
/**
51+
* Determine if any sub objects need a reference to the current object during parsing as it is slightly slower
52+
* try and avoid it if possible
53+
*/
5054
if (parser.isLookupRequired) isLookupRequired = true;
5155
this.fields.push({ key, parser });
5256
}
@@ -61,34 +65,39 @@ export class StrutTypeObjectGenerated<T extends Record<string, StrutAny>> extend
6165
* This method is slightly faster than `generateObjectAssign` but generates single line return
6266
*
6367
* Basic testing shows it to be roughly 20% faster than the other method
68+
*
69+
* @see StrutTypeObjectGenerated.generateObjectAssign
6470
*/
6571
generateSingleObject(): void {
6672
const parsers: StrutAny[] = [];
6773

68-
let body = '"use strict";return {';
74+
let body = '"use strict"; return {';
6975
for (let i = 0; i < this.fields.length; i++) {
7076
parsers.push(this.fields[i].parser);
7177
body += ` ${JSON.stringify(this.fields[i].key)}: _bp[${i}].parse(buf, ctx),`;
7278
}
7379
body += ' };';
74-
7580
const func = new Function('_bp', 'buf', 'ctx', body);
7681
this.parse = func.bind(null, parsers);
7782
}
7883

7984
/**
80-
* This method is slightly slower object creation than `generateSingleObject` but will work with any object name
81-
* including horrible names like `'` or `"'\``
85+
* This method is slightly slower object creation than `generateSingleObject`
86+
* It is needed when sub objects want to reference the object being parsed
87+
*
88+
* @see StrutTypeObjectGenerated.generateSingleObject
8289
*/
8390
generateObjectAssign(): void {
84-
let body = '"use strict"; const ret = {};';
91+
const parsers: StrutAny[] = [];
92+
93+
let body = '"use strict"; const ret = {};\n';
8594
for (let i = 0; i < this.fields.length; i++) {
86-
body += `const _bp_${i} = _bp[${i}];\n`;
87-
body += `ret[_bp_${i}.key] = _bp_${i}.parser.parse(buf, ctx, ret)\n`;
95+
parsers.push(this.fields[i].parser);
96+
body += `ret[${JSON.stringify(this.fields[i].key)}] = _bp[${i}].parse(buf, ctx, ret)\n`;
8897
}
8998
body += `return ret`;
9099
const func = new Function('_bp', 'buf', 'ctx', body);
91-
this.parse = func.bind(null, this.fields);
100+
this.parse = func.bind(null, parsers);
92101
}
93102

94103
private _size = -1;

0 commit comments

Comments
 (0)