()
| 90 | } |
| 91 | } |
| 92 | buffer() { |
| 93 | if (this.__buffer) return this.__buffer; |
| 94 | let bufferSize = 0; |
| 95 | for (const arg of this.argList) { |
| 96 | const alignment = Encoder.argumentAlignment(arg); |
| 97 | const remainder = bufferSize % alignment; |
| 98 | if (remainder) { |
| 99 | bufferSize += alignment - remainder; |
| 100 | } |
| 101 | bufferSize += Encoder.argumentSize(arg); |
| 102 | } |
| 103 | const buffer = new ArrayBuffer(bufferSize); |
| 104 | const view = new DataView(buffer); |
| 105 | let bufferOffset = 0; |
| 106 | for (const arg of this.argList) { |
| 107 | const alignment = Encoder.argumentAlignment(arg); |
| 108 | const remainder = bufferOffset % alignment; |
| 109 | if (remainder) { |
| 110 | bufferOffset += alignment - remainder; |
| 111 | } |
| 112 | switch (arg.type) { |
| 113 | case 'float': |
| 114 | view.setFloat32(bufferOffset, arg.value, true); |
| 115 | break; |
| 116 | case 'uint64_t': |
| 117 | view.setBigUint64(bufferOffset, arg.value, true); |
| 118 | break; |
| 119 | case 'int64_t': |
| 120 | view.setBigInt64(bufferOffset, arg.value, true); |
| 121 | break; |
| 122 | case 'uint32_t': |
| 123 | view.setUint32(bufferOffset, arg.value, true); |
| 124 | break; |
| 125 | case 'int32_t': |
| 126 | view.setInt32(bufferOffset, arg.value, true); |
| 127 | break; |
| 128 | case 'uint16_t': |
| 129 | view.setUint16(bufferOffset, arg.value, true); |
| 130 | break; |
| 131 | case 'int16_t': |
| 132 | view.setInt16(bufferOffset, arg.value, true); |
| 133 | break; |
| 134 | case 'uint8_t': |
| 135 | view.setUint8(bufferOffset, arg.value); |
| 136 | break; |
| 137 | case 'int8_t': |
| 138 | view.setInt8(bufferOffset, arg.value); |
| 139 | break; |
| 140 | case 'bool': |
| 141 | view.setInt8(bufferOffset, !!arg.value); |
| 142 | break; |
| 143 | case 'bytes': |
| 144 | const buffer_u8 = new Uint8Array(buffer); |
| 145 | if (typeof arg.value == 'string') { |
| 146 | for (let i = 0; i < arg.value.length; ++i) buffer_u8[bufferOffset + i] = arg.value.charCodeAt(i); |
| 147 | } else { |
| 148 | for (let i = 0; i < arg.value.byteLength; ++i) buffer_u8[bufferOffset + i] = arg.value[i]; |
| 149 | } |
no test coverage detected