| const readWasm = require("../lib/read-wasm"); |
| |
| /** |
| * Provide the JIT with a nice shape / hidden class. |
| */ |
| function Mapping() { |
| this.generatedLine = 0; |
| this.generatedColumn = 0; |
| this.lastGeneratedColumn = null; |
| this.source = null; |
| this.originalLine = null; |
| this.originalColumn = null; |
| this.name = null; |
| } |
| |
| let cachedWasm = null; |
| |
| module.exports = function wasm() { |
| if (cachedWasm) { |
| return cachedWasm; |
| } |
| |
| const callbackStack = []; |
| |
| cachedWasm = readWasm().then(buffer => { |
| return WebAssembly.instantiate(buffer, { |
| env: { |
| mapping_callback( |
| generatedLine, |
| generatedColumn, |
| |
| hasLastGeneratedColumn, |
| lastGeneratedColumn, |
| |
| hasOriginal, |
| source, |
| originalLine, |
| originalColumn, |
| |
| hasName, |
| name |
| ) { |
| const mapping = new Mapping(); |
| // JS uses 1-based line numbers, wasm uses 0-based. |
| mapping.generatedLine = generatedLine + 1; |
| mapping.generatedColumn = generatedColumn; |
| |
| if (hasLastGeneratedColumn) { |
| // JS uses inclusive last generated column, wasm uses exclusive. |
| mapping.lastGeneratedColumn = lastGeneratedColumn - 1; |
| } |
| |
| if (hasOriginal) { |
| mapping.source = source; |
| // JS uses 1-based line numbers, wasm uses 0-based. |
| mapping.originalLine = originalLine + 1; |
| mapping.originalColumn = originalColumn; |
| |
| if (hasName) { |
| mapping.name = name; |
| } |
| } |
| |
| callbackStack[callbackStack.length - 1](mapping); |
| }, |
| |
| start_all_generated_locations_for() { console.time("all_generated_locations_for"); }, |
| end_all_generated_locations_for() { console.timeEnd("all_generated_locations_for"); }, |
| |
| start_compute_column_spans() { console.time("compute_column_spans"); }, |
| end_compute_column_spans() { console.timeEnd("compute_column_spans"); }, |
| |
| start_generated_location_for() { console.time("generated_location_for"); }, |
| end_generated_location_for() { console.timeEnd("generated_location_for"); }, |
| |
| start_original_location_for() { console.time("original_location_for"); }, |
| end_original_location_for() { console.timeEnd("original_location_for"); }, |
| |
| start_parse_mappings() { console.time("parse_mappings"); }, |
| end_parse_mappings() { console.timeEnd("parse_mappings"); }, |
| |
| start_sort_by_generated_location() { console.time("sort_by_generated_location"); }, |
| end_sort_by_generated_location() { console.timeEnd("sort_by_generated_location"); }, |
| |
| start_sort_by_original_location() { console.time("sort_by_original_location"); }, |
| end_sort_by_original_location() { console.timeEnd("sort_by_original_location"); }, |
| } |
| }); |
| }).then(Wasm => { |
| return { |
| exports: Wasm.instance.exports, |
| withMappingCallback: (mappingCallback, f) => { |
| callbackStack.push(mappingCallback); |
| try { |
| f(); |
| } finally { |
| callbackStack.pop(); |
| } |
| } |
| }; |
| }).then(null, e => { |
| cachedWasm = null; |
| throw e; |
| }); |
| |
| return cachedWasm; |
| }; |