( script: Script, locationData: FullLocationData, logs: LogEntry[], requires: RequireStatement[], sourceTags: SourceTagEntry[], constructorParamLength: number, runs: number = 1000, )
| 163 | } |
| 164 | |
| 165 | export function optimiseBytecode( |
| 166 | script: Script, |
| 167 | locationData: FullLocationData, |
| 168 | logs: LogEntry[], |
| 169 | requires: RequireStatement[], |
| 170 | sourceTags: SourceTagEntry[], |
| 171 | constructorParamLength: number, |
| 172 | runs: number = 1000, |
| 173 | ): OptimiseBytecodeResult { |
| 174 | for (let i = 0; i < runs; i += 1) { |
| 175 | const oldScript = script; |
| 176 | const { |
| 177 | script: newScript, |
| 178 | locationData: newLocationData, |
| 179 | logs: newLogs, |
| 180 | requires: newRequires, |
| 181 | sourceTags: newSourceTags, |
| 182 | } = replaceOps(script, locationData, logs, requires, sourceTags, constructorParamLength, optimisationReplacements); |
| 183 | |
| 184 | // Break on fixed point |
| 185 | if (scriptToAsm(oldScript) === scriptToAsm(newScript)) break; |
| 186 | |
| 187 | script = newScript; |
| 188 | locationData = newLocationData; |
| 189 | logs = newLogs; |
| 190 | requires = newRequires; |
| 191 | sourceTags = newSourceTags; |
| 192 | } |
| 193 | |
| 194 | return { script, locationData, logs, requires, sourceTags: reconcileScopeCleanupTags(script, sourceTags) }; |
| 195 | } |
| 196 | |
| 197 | const SCOPE_CLEANUP_OPCODES = [Op.OP_DROP, Op.OP_NIP, Op.OP_2DROP]; |
| 198 |
no test coverage detected