See More

/** * @license * Copyright 2010 The Emscripten Authors * SPDX-License-Identifier: MIT */ // Various tools for parsing LLVM. Utilities of various sorts, that are // specific to Emscripten (and hence not in utility.js). const FOUR_GB = 4 * 1024 * 1024 * 1024; let currentlyParsedFilename = ''; // Does simple 'macro' substitution, using Django-like syntax, // {{{ code }}} will be replaced with |eval(code)|. // NOTE: Be careful with that ret check. If ret is |0|, |ret ? ret.toString() : ''| would result in ''! function processMacros(text) { return text.replace(/{{{([^}]|}(?!}))+}}}/g, (str) => { str = str.substr(3, str.length - 6); try { const ret = eval(str); return ret !== null ? ret.toString() : ''; } catch (ex) { ex.stack = 'In the following macro:\n\n' + str + '\n\n' + ex.stack; throw ex; } }); } // Simple #if/else/endif preprocessing for a file. Checks if the // ident checked is true in our global. // Also handles #include x.js (similar to C #include ) // Param filenameHint can be passed as a description to identify the file that is being processed, used // to locate errors for reporting and for html files to stop expansion between . function preprocess(text, filenameHint) { if (EXPORT_ES6 && USE_ES6_IMPORT_META) { // `eval`, Terser and Closure don't support module syntax; to allow it, // we need to temporarily replace `import.meta` usages with placeholders // during preprocess phase, and back after all the other ops. // See also: `phase_final_emitting` in emcc.py. text = text.replace(/\bimport\.meta\b/g, 'EMSCRIPTEN$IMPORT$META'); } const IGNORE = 0; const SHOW = 1; // This state is entered after we have shown one of the block of an if/elif/else sequence. // Once we enter this state we dont show any blocks or evaluate any // conditions until the sequence ends. const IGNORE_ALL = 2; const showStack = []; const showCurrentLine = () => showStack.every((x) => x == SHOW); currentlyParsedFilename = filenameHint; const fileExt = (filenameHint) ? filenameHint.split('.').pop().toLowerCase() : ''; const isHtml = (fileExt === 'html' || fileExt === 'htm') ? true : false; let inStyle = false; const lines = text.split('\n'); let ret = ''; let emptyLine = false; try { for (let i = 0; i < lines.length; i++) { let line = lines[i]; try { if (line[line.length - 1] === '\r') { line = line.substr(0, line.length - 1); // Windows will have '\r' left over from splitting over '\r\n' } if (isHtml && line.includes('