/**
* @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('