diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-01-04 17:40:55 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-01-04 17:40:55 -0800 |
commit | 2383468ecdd046517db9a83be1514878d446094e (patch) | |
tree | 599f099e736dd51a684259c49aed0dbea3a0312a /src/analyzer.js | |
parent | e1375560afb1768b26725ffb86d6b03457411e28 (diff) |
fix bug with investigating types in the main pass, and in rare cases defining types with incorrect data because of that
Diffstat (limited to 'src/analyzer.js')
-rw-r--r-- | src/analyzer.js | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 1e03a1d6..974dd67d 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -22,7 +22,9 @@ var SIDE_EFFECT_CAUSERS = set('call', 'invoke'); // Analyzer -function analyzer(data) { +function analyzer(data, sidePass) { + var mainPass = !sidePass; + // Substrate var substrate = new Substrate('Analyzer'); @@ -46,6 +48,7 @@ function analyzer(data) { var temp = splitter(item.items, function(item) { return item.intertype == 'type' }); item.items = temp.leftIn; temp.splitOut.forEach(function(type) { + //dprint('types', 'adding defined type: ' + type.name_); Types.types[type.name_] = type; if (QUANTUM_SIZE === 1) { Types.fatTypes[type.name_] = copy(type); @@ -175,10 +178,14 @@ function analyzer(data) { // Typevestigator substrate.addActor('Typevestigator', { processItem: function(data) { - for (var type in Types.needAnalysis) { - if (type) addType(type, data); + if (sidePass) { // Do not investigate in the main pass - it is only valid to start to do so in the first side pass, + // which handles type definitions, and later. Doing so before the first side pass will result in + // making bad guesses about types which are actually defined + for (var type in Types.needAnalysis) { + if (type) addType(type, data); + } + Types.needAnalysis = {}; } - Types.needAnalysis = {}; this.forwardItem(data, 'Typeanalyzer'); } }); |