@@ -42,56 +42,14 @@ module.exports = {
4242 code += '}'
4343 return compiler . wrapCode ( code )
4444 } ] ,
45- arrayWithLengthOffset : [ 'parametrizable' , ( compiler , array ) => { // TODO: remove
46- let code = ''
47- if ( array . countType ) {
48- code += 'const { value: count, size: countSize } = ' + compiler . callType ( array . countType ) + '\n'
49- } else if ( array . count ) {
50- code += 'const count = ' + array . count + '\n'
51- code += 'const countSize = 0\n'
52- } else {
53- throw new Error ( 'Array must contain either count or countType' )
54- }
55- code += 'if (count > 0xffffff) throw new Error("array size is abnormally large, not reading: " + count)\n'
56- code += 'const data = []\n'
57- code += 'let size = countSize\n'
58- code += `for (let i = 0; i < count + ${ array . lengthOffset } ; i++) {\n`
59- code += ' const elem = ' + compiler . callType ( array . type , 'offset + size' ) + '\n'
60- code += ' data.push(elem.value)\n'
61- code += ' size += elem.size\n'
62- code += '}\n'
63- code += 'return { value: data, size }'
64- return compiler . wrapCode ( code )
65- } ] ,
66- bitflags : [ 'parametrizable' , ( compiler , { type, flags, shift, big } ) => {
67- let fstr = JSON . stringify ( flags )
68- if ( Array . isArray ( flags ) ) {
69- fstr = '{'
70- for ( const [ k , v ] of Object . entries ( flags ) ) fstr += `"${ v } ": ${ big ? ( 1n << BigInt ( k ) ) : ( 1 << k ) } ` + ( big ? 'n,' : ',' )
71- fstr += '}'
72- } else if ( shift ) {
73- fstr = '{'
74- for ( const key in flags ) fstr += `"${ key } ": ${ 1 << flags [ key ] } ,`
75- fstr += '}'
76- }
77- return compiler . wrapCode ( `
78- const { value: _value, size } = ${ compiler . callType ( type , 'offset' ) }
79- const value = { _value }
80- const flags = ${ fstr }
81- for (const key in flags) {
82- value[key] = (_value & flags[key]) == flags[key]
83- }
84- return { value, size }
85- ` . trim ( ) )
86- } ] ,
8745 registryEntryHolder : [ 'parametrizable' , ( compiler , opts ) => {
8846 return compiler . wrapCode ( `
8947const { value: n, size: nSize } = ${ compiler . callType ( 'varint' ) }
9048if (n !== 0) {
9149 return { value: { ${ opts . baseName } : n - 1 }, size: nSize }
9250} else {
93- const holder = ${ compiler . callType ( opts . otherwise . type ) }
94- return { value: { ${ opts . otherwise . name } : holder.data }, size: nSize + holder.size }
51+ const holder = ${ compiler . callType ( opts . otherwise . type , 'offset + nSize' ) }
52+ return { value: { ${ opts . otherwise . name } : holder.value }, size: nSize + holder.size }
9553}
9654 ` . trim ( ) )
9755 } ] ,
@@ -145,46 +103,14 @@ if (n !== 0) {
145103 code += 'return offset'
146104 return compiler . wrapCode ( code )
147105 } ] ,
148- arrayWithLengthOffset : [ 'parametrizable' , ( compiler , array ) => {
149- let code = ''
150- if ( array . countType ) {
151- code += 'offset = ' + compiler . callType ( 'value.length' , array . countType ) + '\n'
152- } else if ( array . count === null ) {
153- throw new Error ( 'Array must contain either count or countType' )
154- }
155- code += 'for (let i = 0; i < value.length; i++) {\n'
156- code += ' offset = ' + compiler . callType ( 'value[i]' , array . type ) + '\n'
157- code += '}\n'
158- code += 'return offset'
159- return compiler . wrapCode ( code )
160- } ] ,
161- bitflags : [ 'parametrizable' , ( compiler , { type, flags, shift, big } ) => {
162- let fstr = JSON . stringify ( flags )
163- if ( Array . isArray ( flags ) ) {
164- fstr = '{'
165- for ( const [ k , v ] of Object . entries ( flags ) ) fstr += `"${ v } ": ${ big ? ( 1n << BigInt ( k ) ) : ( 1 << k ) } ` + ( big ? 'n,' : ',' )
166- fstr += '}'
167- } else if ( shift ) {
168- fstr = '{'
169- for ( const key in flags ) fstr += `"${ key } ": ${ 1 << flags [ key ] } ,`
170- fstr += '}'
171- }
172- return compiler . wrapCode ( `
173- const flags = ${ fstr }
174- let val = value._value ${ big ? '|| 0n' : '' }
175- for (const key in flags) {
176- if (value[key]) val |= flags[key]
177- }
178- return (ctx.${ type } )(val, buffer, offset)
179- ` . trim ( ) )
180- } ] ,
181106 registryEntryHolder : [ 'parametrizable' , ( compiler , opts ) => {
182107 const baseName = `value.${ opts . baseName } `
183108 const otherwiseName = `value.${ opts . otherwise . name } `
184109 return compiler . wrapCode ( `
185- if (${ baseName } ) {
110+ if (${ baseName } != null ) {
186111 offset = ${ compiler . callType ( `${ baseName } + 1` , 'varint' ) }
187112} else if (${ otherwiseName } ) {
113+ offset += 1
188114 offset = ${ compiler . callType ( `${ otherwiseName } ` , opts . otherwise . type ) }
189115} else {
190116 throw new Error('registryEntryHolder type requires "${ baseName } " or "${ otherwiseName } " fields to be set')
@@ -196,7 +122,7 @@ return offset
196122 const baseName = `value.${ opts . base . name } `
197123 const otherwiseName = `value.${ opts . otherwise . name } `
198124 return compiler . wrapCode ( `
199- if (${ baseName } ) {
125+ if (${ baseName } != null ) {
200126 offset = ${ compiler . callType ( 0 , 'varint' ) }
201127 offset = ${ compiler . callType ( `${ baseName } ` , opts . base . type ) }
202128} else if (${ otherwiseName } ) {
@@ -234,53 +160,15 @@ return offset
234160 code += 'return size'
235161 return compiler . wrapCode ( code )
236162 } ] ,
237- arrayWithLengthOffset : [ 'parametrizable' , ( compiler , array ) => {
238- let code = ''
239- if ( array . countType ) {
240- code += 'let size = ' + compiler . callType ( 'value.length' , array . countType ) + '\n'
241- } else if ( array . count ) {
242- code += 'let size = 0\n'
243- } else {
244- throw new Error ( 'Array must contain either count or countType' )
245- }
246- if ( ! isNaN ( compiler . callType ( 'value[i]' , array . type ) ) ) {
247- code += 'size += value.length * ' + compiler . callType ( 'value[i]' , array . type ) + '\n'
248- } else {
249- code += 'for (let i = 0; i < value.length; i++) {\n'
250- code += ' size += ' + compiler . callType ( 'value[i]' , array . type ) + '\n'
251- code += '}\n'
252- }
253- code += 'return size'
254- return compiler . wrapCode ( code )
255- } ] ,
256- bitflags : [ 'parametrizable' , ( compiler , { type, flags, shift, big } ) => {
257- let fstr = JSON . stringify ( flags )
258- if ( Array . isArray ( flags ) ) {
259- fstr = '{'
260- for ( const [ k , v ] of Object . entries ( flags ) ) fstr += `"${ v } ": ${ big ? ( 1n << BigInt ( k ) ) : ( 1 << k ) } ` + ( big ? 'n,' : ',' )
261- fstr += '}'
262- } else if ( shift ) {
263- fstr = '{'
264- for ( const key in flags ) fstr += `"${ key } ": ${ 1 << flags [ key ] } ,`
265- fstr += '}'
266- }
267- return compiler . wrapCode ( `
268- const flags = ${ fstr }
269- let val = value._value ${ big ? '|| 0n' : '' }
270- for (const key in flags) {
271- if (value[key]) val |= flags[key]
272- }
273- return (ctx.${ type } )(val)
274- ` . trim ( ) )
275- } ] ,
276163 registryEntryHolder : [ 'parametrizable' , ( compiler , opts ) => {
277164 const baseName = `value.${ opts . baseName } `
278165 const otherwiseName = `value.${ opts . otherwise . name } `
279166 return compiler . wrapCode ( `
280167let size = 0
281- if (${ baseName } ) {
168+ if (${ baseName } != null ) {
282169 size += ${ compiler . callType ( `${ baseName } + 1` , 'varint' ) }
283170} else if (${ otherwiseName } ) {
171+ size += 1
284172 size += ${ compiler . callType ( `${ otherwiseName } ` , opts . otherwise . type ) }
285173} else {
286174 throw new Error('registryEntryHolder type requires "${ baseName } " or "${ otherwiseName } " fields to be set')
@@ -293,7 +181,7 @@ return size
293181 const otherwiseName = `value.${ opts . otherwise . name } `
294182 return compiler . wrapCode ( `
295183let size = 0
296- if (${ baseName } ) {
184+ if (${ baseName } != null ) {
297185 size += ${ compiler . callType ( 0 , 'varint' ) }
298186 size += ${ compiler . callType ( `${ baseName } ` , opts . base . type ) }
299187} else if (${ otherwiseName } ) {
0 commit comments