@@ -47,6 +47,10 @@ export class StrutTypeObjectGenerated<T extends Record<string, StrutAny>> extend
47
47
const entries = Object . entries ( obj ) ;
48
48
let isLookupRequired = false ;
49
49
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
+ */
50
54
if ( parser . isLookupRequired ) isLookupRequired = true ;
51
55
this . fields . push ( { key, parser } ) ;
52
56
}
@@ -61,34 +65,39 @@ export class StrutTypeObjectGenerated<T extends Record<string, StrutAny>> extend
61
65
* This method is slightly faster than `generateObjectAssign` but generates single line return
62
66
*
63
67
* Basic testing shows it to be roughly 20% faster than the other method
68
+ *
69
+ * @see StrutTypeObjectGenerated.generateObjectAssign
64
70
*/
65
71
generateSingleObject ( ) : void {
66
72
const parsers : StrutAny [ ] = [ ] ;
67
73
68
- let body = '"use strict";return {' ;
74
+ let body = '"use strict"; return {' ;
69
75
for ( let i = 0 ; i < this . fields . length ; i ++ ) {
70
76
parsers . push ( this . fields [ i ] . parser ) ;
71
77
body += ` ${ JSON . stringify ( this . fields [ i ] . key ) } : _bp[${ i } ].parse(buf, ctx),` ;
72
78
}
73
79
body += ' };' ;
74
-
75
80
const func = new Function ( '_bp' , 'buf' , 'ctx' , body ) ;
76
81
this . parse = func . bind ( null , parsers ) ;
77
82
}
78
83
79
84
/**
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
82
89
*/
83
90
generateObjectAssign ( ) : void {
84
- let body = '"use strict"; const ret = {};' ;
91
+ const parsers : StrutAny [ ] = [ ] ;
92
+
93
+ let body = '"use strict"; const ret = {};\n' ;
85
94
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` ;
88
97
}
89
98
body += `return ret` ;
90
99
const func = new Function ( '_bp' , 'buf' , 'ctx' , body ) ;
91
- this . parse = func . bind ( null , this . fields ) ;
100
+ this . parse = func . bind ( null , parsers ) ;
92
101
}
93
102
94
103
private _size = - 1 ;
0 commit comments