diff options
author | alon@honor <none@none> | 2010-10-11 21:34:41 -0700 |
---|---|---|
committer | alon@honor <none@none> | 2010-10-11 21:34:41 -0700 |
commit | ce832e42fdf6ae0ebe06ce05a883baa0505c63ff (patch) | |
tree | 71c38dcda4c2736a76e148fe43f7198ee8a52725 /src | |
parent | cb9319ec92505750d2e1a17dd230141aba9edcf7 (diff) |
clean up relooper label storage
Diffstat (limited to 'src')
-rw-r--r-- | src/analyzer.js | 14 | ||||
-rw-r--r-- | src/jsifier.js | 20 |
2 files changed, 16 insertions, 18 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 2418170c..40628754 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -365,10 +365,8 @@ function analyzer(data) { operateOnLabels(line, function process(item, id) { if (item[id] in labelIds) { ret.push(item[id]); - assert(!item['old_' + id]); - item['old_' + id] = item[id]; // Save it; we need this later for labels before breaks, when we have multiple entries later dprint('relooping', 'zz ' + id + ' replace ' + item[id] + ' with ' + toLabelId + '; old: ' + item['old_' + id]); - item[id] = toLabelId; + item[id] = toLabelId + '|' + item[id]; } }); return ret; @@ -520,11 +518,11 @@ function analyzer(data) { var nextEntries = keys(entryLabel.outLabels); dprint('relooping', ' Creating simple emulated, outlabels: ' + nextEntries); //if (nextEntries.length == 1) { - // replaceLabelLabels([entryLabel], set(nextEntries), 'BNOPP'); // remove unneeded branch XXX - this is dangerous, as we may + // replaceLabelLabels([entryLabel], set(nextEntries), 'BNOPP|XXX'); // remove unneeded branch XXX - this is dangerous, as we may // // have 1 next entry, but 1 or more B-labels... //} else { nextEntries.forEach(function(nextEntry) { - replaceLabelLabels([entryLabel], set(nextEntry), 'BJSET' + nextEntry); // Just SET __label__ - no break or continue or whatnot + replaceLabelLabels([entryLabel], set(nextEntry), 'BJSET|' + nextEntry); // Just SET __label__ - no break or continue or whatnot }); //} return { @@ -565,7 +563,7 @@ function analyzer(data) { // We will be in a loop, |continue| gets us back to the entry entries.forEach(function(entry) { - replaceLabelLabels(internals, searchable(entries), 'BCONT' + entries[0]); // entries[0] is the name of the loop, see walkBlock + replaceLabelLabels(internals, searchable(entries), 'BCONT|' + entries[0]); // entries[0] is the name of the loop, see walkBlock }); // To get to any of our (not our parents') exit labels, we will break. @@ -573,7 +571,7 @@ function analyzer(data) { var enteredExitLabels = {}; if (externals.length > 0) { entries.forEach(function(entry) { - mergeInto(enteredExitLabels, set(replaceLabelLabels(internals, currExitLabels, 'BREAK' + entries[0]))); // see comment on entries[0] above + mergeInto(enteredExitLabels, set(replaceLabelLabels(internals, currExitLabels, 'BREAK|' + entries[0]))); // see comment on entries[0] above }); enteredExitLabels = keys(enteredExitLabels).map(cleanLabel); dprint('relooping', 'enteredExitLabels: ' + dump(enteredExitLabels)); @@ -660,7 +658,7 @@ function analyzer(data) { // TODO: Move this into BJSET keys(postEntryLabels).forEach(function(post) { - replaceLabelLabels(actualEntryLabel.blockChildren, set(post), 'BREAK' + actualEntries[0]); + replaceLabelLabels(actualEntryLabel.blockChildren, set(post), 'BREAK|' + actualEntries[0]); }); // Create child block actualEntryLabel.block = makeBlock(actualEntryLabel.blockChildren, [actualEntryLabel.blockChildren[0].ident], labelsDict); diff --git a/src/jsifier.js b/src/jsifier.js index 955fa900..38af855e 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -492,12 +492,12 @@ function JSify(data) { return LABEL_IDs[label] = LABEL_ID_COUNTER ++; } - // TODO: remove 'oldLabel', store that inside the label: BXXX|Labeltobreak|Labeltogetto - function makeBranch(label, oldLabel) { + function makeBranch(label) { if (label[0] == 'B') { + var parts = label.split('|'); + var trueLabel = parts[1]; + var oldLabel = parts[2]; var labelSetting = '__label__ = ' + getLabelId(oldLabel) + '; /* ' + cleanLabel(oldLabel) + ' */ '; // TODO: optimize away - var trueLabel = label.substr(5); - assert(oldLabel); if (label[1] == 'R') { return labelSetting + 'break ' + trueLabel + ';'; } else if (label[1] == 'C') { // CONT @@ -517,10 +517,10 @@ function JSify(data) { makeFuncLineZyme('branch', function(item) { //print('branch: ' + dump(item)); if (!item.ident) { - return makeBranch(item.label, item.old_label); + return makeBranch(item.label); } else { - var labelTrue = makeBranch(item.labelTrue, item.old_labelTrue); - var labelFalse = makeBranch(item.labelFalse, item.old_labelFalse); + var labelTrue = makeBranch(item.labelTrue); + var labelFalse = makeBranch(item.labelFalse); if (labelTrue == ';' && labelFalse == ';') return ';'; var head = 'if (' + item.ident + ') { '; var head2 = 'if (!(' + item.ident + ')) { '; @@ -545,11 +545,11 @@ function JSify(data) { first = false; } ret += 'if (' + item.ident + ' == ' + switchLabel.value + ') {\n'; - ret += ' ' + makeBranch(switchLabel.label, switchLabel.old_label) + '\n'; + ret += ' ' + makeBranch(switchLabel.label) + '\n'; ret += '}\n'; }); ret += 'else {\n'; - ret += makeBranch(item.defaultLabel, item.old_defaultLabel) + '\n'; + ret += makeBranch(item.defaultLabel) + '\n'; ret += '}\n'; if (item.value) { ret += ' ' + toNiceIdent(item.value); @@ -573,7 +573,7 @@ function JSify(data) { + '__THREW__ = false } catch(e) { ' + '__THREW__ = true; ' + (EXCEPTION_DEBUG ? 'print("Exception: " + e + " : " + (new Error().stack)); ' : '') - + '} })(); if (!__THREW__) { ' + makeBranch(item.toLabel, item.old_toLabel) + ' } else { ' + makeBranch(item.unwindLabel, item.old_unwindLabel) + ' }'; + + '} })(); if (!__THREW__) { ' + makeBranch(item.toLabel) + ' } else { ' + makeBranch(item.unwindLabel) + ' }'; return ret; }); makeFuncLineZyme('load', function(item) { |