forked from mirrors/gecko-dev
		
	 7469d83745
			
		
	
	
		7469d83745
		
	
	
	
	
		
			
			Pulls out the CppFiltParser work into a worker to run in the background and avoid the jank induced by the final convertSymsMapToExpectedSymFormat call. Profiling shows that after this change there is virtually no jank when asking the geckoProfiler API for symbols. MozReview-Commit-ID: CAKMvjLa4dl --HG-- extra : rebase_source : de9202687ca8ffbfa5216f73fe57e97ffdbea8ef
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
| /* vim: set sts=2 sw=2 et tw=80: */
 | |
| /* eslint-env worker */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| importScripts("resource:///modules/ParseSymbols.jsm");
 | |
| 
 | |
| class WorkerCppFiltParser {
 | |
|   constructor(length) {
 | |
|     this._decoder = new TextDecoder();
 | |
|     this._index = 0;
 | |
|     this._approximateLength = 0;
 | |
|     this._results = new Array(length);
 | |
|   }
 | |
| 
 | |
|   consume(arrayBuffer) {
 | |
|     const data = this._decoder.decode(arrayBuffer, {stream: true});
 | |
|     const lineRegex = /.*\n?/g;
 | |
|     const buffer = this._currentLine + data;
 | |
| 
 | |
|     let match;
 | |
|     while ((match = lineRegex.exec(buffer))) {
 | |
|       let [line] = match;
 | |
|       if (line[line.length - 1] === "\n") {
 | |
|         this._processLine(line);
 | |
|       } else {
 | |
|         this._currentLine = line;
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   finish() {
 | |
|     this._processLine(this._currentLine);
 | |
|     return {symsArray: this._results, approximateLength: this._approximateLength};
 | |
|   }
 | |
| 
 | |
|   _processLine(line) {
 | |
|     const trimmed = line.trimRight();
 | |
|     this._approximateLength += trimmed.length;
 | |
|     this._results[this._index++] = trimmed;
 | |
|   }
 | |
| }
 | |
| 
 | |
| let cppFiltParser;
 | |
| onmessage = async e => {
 | |
|   try {
 | |
|     if (!cppFiltParser) {
 | |
|       cppFiltParser = new WorkerCppFiltParser();
 | |
|     }
 | |
|     if (e.data.finish) {
 | |
|       const {symsArray, approximateLength} = cppFiltParser.finish();
 | |
|       const result = ParseSymbols.convertSymsArrayToExpectedSymFormat(symsArray, approximateLength);
 | |
| 
 | |
|       postMessage({result}, result.map(r => r.buffer));
 | |
|       close();
 | |
|     } else {
 | |
|       cppFiltParser.consume(e.data.buffer);
 | |
|     }
 | |
|   } catch (error) {
 | |
|     postMessage({error: error.toString()});
 | |
|   }
 | |
| };
 |