//"use strict";
// LLVM assembly => internal intermediate representation, which is ready
// to be processed by the later stages.
var fastPaths = 0, slowPaths = 0;
var tokenCache = {};
['=', 'i32', 'label', ';', '4', '0', '1', '2', '255', 'align', 'i8*', 'i8', 'i16', 'getelementptr', 'inbounds', 'unnamed_addr', 'x', 'load', 'preds', 'br', 'i32*', 'i1', 'store', '<label>', 'constant', 'c', 'private', 'null', 'internal', 'to', 'bitcast', 'define', 'nounwind', 'nocapture', '%this', 'call', '...'].forEach(function(text) { tokenCache[text] = { text: text } });
//var tokenCacheMisses = {};
// Line tokenizer
function tokenize(text, lineNum) {
var tokens = [];
var quotes = 0;
var lastToken = null;
// Note: '{' is not an encloser, as its use in functions is split over many lines
var enclosers = {
'[': 0,
']': '[',
'(': 0,
')': '(',
'<': 0,
'>': '<'
};
var totalEnclosing = 0;
function makeToken(text) {
if (text.length == 0) return;
// merge certain tokens
if (lastToken && /^\**$/.test(text)) {
lastToken.text += text;
return;
}
var cached = tokenCache[text];
if (cached) {
//assert(cached.text === text);
tokens.push(cached);
lastToken = cached;
return;
}
//tokenCacheMisses[text] = (misses[text] || 0) + 1;
var token = {
text: text
};
if (text[0] in enclosers) {
token.item = tokenize(text.substr(1, text.length-2));
token.type = text[0];
}
// merge certain tokens
if (lastToken && isType(lastToken.text) && isFunctionDef(token)) {
if (lastToken.text in tokenCache) {
// create a copy of the cached value
lastToken = tokens[tokens.length-1] = { text: lastToken.text };
}
lastToken.text += ' ' + text;
} else if (lastToken && text[0] == '}') { // }, }*, etc.
var openBrace = tokens.length-1;
while (tokens[openBrace].text.substr(-1) != '{') openBrace --;
token = combineTokens(tokens.slice(openBrace+1));
tokens.splice(openBrace, tokens.length-openBrace+1);
tokens.push(token);
token.type = '{';
token.text = '{ ' + token.text + ' }';
var pointingLevelsToAdd = pointingLevels(text