diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analyzer.js | 15 | ||||
-rw-r--r-- | src/jsifier.js | 6 |
2 files changed, 14 insertions, 7 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'); } }); diff --git a/src/jsifier.js b/src/jsifier.js index 0cdafb5a..a750f805 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -55,7 +55,7 @@ function JSify(data, functionsOnly, givenFunctions) { if (mainPass) { // Handle unparsed types TODO: Batch them - analyzer(intertyper(data.unparsedTypess[0].lines, true)); + analyzer(intertyper(data.unparsedTypess[0].lines, true), true); data.unparsedTypess = null; // Add additional necessary items for the main pass. We can now do this since types are parsed (types can be used through @@ -120,7 +120,7 @@ function JSify(data, functionsOnly, givenFunctions) { dprint('unparsedFunctions','====================\n// Processing function batch of ' + currBaseLineNums.length + ' functions, ' + currFuncLines.length + ' lines, functions left: ' + data.unparsedFunctions.length); if (DEBUG_MEMORY) MemoryDebugger.tick('pre-func'); - JSify(analyzer(intertyper(currFuncLines, true, currBaseLineNums)), true, Functions); + JSify(analyzer(intertyper(currFuncLines, true, currBaseLineNums), true), true, Functions); if (DEBUG_MEMORY) MemoryDebugger.tick('post-func'); } currFuncLines = currBaseLineNums = null; // Do not hold on to anything from inside that loop (JS function scoping..) @@ -1150,7 +1150,7 @@ function JSify(data, functionsOnly, givenFunctions) { print(postParts[0]); // Print out global variables and postsets TODO: batching - JSify(analyzer(intertyper(data.unparsedGlobalss[0].lines, true)), true, Functions); + JSify(analyzer(intertyper(data.unparsedGlobalss[0].lines, true), true), true, Functions); data.unparsedGlobalss = null; print(Functions.generateIndexing()); // done last, as it may rely on aliases set in postsets |