aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/asm-cl.js18
-rw-r--r--lib/asm.js35
-rw-r--r--lib/base-compiler.js6
-rw-r--r--lib/compilers/CL.js2
-rwxr-xr-xtest/filter-tests.js10
5 files changed, 41 insertions, 30 deletions
diff --git a/lib/asm-cl.js b/lib/asm-cl.js
index b701a789a..72bc9b06f 100644
--- a/lib/asm-cl.js
+++ b/lib/asm-cl.js
@@ -24,7 +24,7 @@
var _ = require('underscore-node');
var logger = require('./logger').logger;
-var expandTabs = require('./utils').expandTabs;
+var utils = require('./utils');
var sourceTag = /^;\s*([0-9]+)\s*:/;
var ignoreAll = /^\s*include listing\.inc$/;
@@ -118,7 +118,7 @@ function ClParser(filters) {
ClParser.prototype._add = function (obj) {
if (obj.text === "") return;
if (this.currentLabel) obj.label = this.currentLabel;
- obj.text = expandTabs(obj.text);
+ obj.text = utils.expandTabs(obj.text);
if (this.filters.binary && this.opcoder.hasOpcodes()) {
obj.opcodes = this.opcoder.opcodes;
obj.address = this.opcoder.offset;
@@ -241,6 +241,18 @@ ClParser.prototype.get = function () {
.value();
};
+function AsmParser(compilerProps) {
+}
+
+AsmParser.prototype.process = function (asm, filters) {
+ var parser = new ClParser(filters);
+ utils.eachLine(asm, function (line) {
+ parser.addLine(line);
+ });
+ return parser.get();
+};
+
module.exports = {
- ClParser: ClParser
+ ClParser: ClParser,
+ AsmParser: AsmParser
}; \ No newline at end of file
diff --git a/lib/asm.js b/lib/asm.js
index 03f66d5ef..35a31e6e2 100644
--- a/lib/asm.js
+++ b/lib/asm.js
@@ -22,10 +22,10 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
-(function () {
- var _ = require('underscore-node');
- var asmCl = require('./asm-cl');
- var utils = require('./utils');
+var _ = require('underscore-node');
+var utils = require('./utils');
+
+function AsmParser(compilerProps) {
var labelFind = /[.a-zA-Z_][a-zA-Z0-9$_.]*/g;
var dataDefn = /\.(string|asciz|ascii|[1248]?byte|short|word|long|quad|value|zero)/;
var fileFind = /^\s*\.file\s+(\d+)\s+"([^"]+)".*/;
@@ -104,7 +104,6 @@
}
function processAsm(asm, filters) {
- if (asm.match(/^; Listing generated by Microsoft/)) return processClAsm(asm, filters);
if (filters.binary) return processBinaryAsm(asm, filters);
var result = [];
@@ -184,12 +183,6 @@
var binaryHideFuncRe = null;
var maxAsmLines = 500;
- function initialise(compilerProps) {
- var pattern = compilerProps('binaryHideFuncRe');
- binaryHideFuncRe = new RegExp(pattern);
- maxAsmLines = compilerProps('maxLinesOfAsm', maxAsmLines);
- }
-
function isUserFunction(func) {
return !func.match(binaryHideFuncRe);
}
@@ -257,15 +250,15 @@
return result;
}
- function processClAsm(asm, filters) {
- var parser = new asmCl.ClParser(filters);
- utils.eachLine(asm, function (line) {
- parser.addLine(line);
- });
- return parser.get();
+ if (compilerProps) {
+ binaryHideFuncRe = new RegExp(compilerProps('binaryHideFuncRe'));
+ maxAsmLines = compilerProps('maxLinesOfAsm', maxAsmLines);
}
+ this.process = function (asm, filters) {
+ return processAsm(asm, filters);
+ };
+}
- exports.processAsm = processAsm;
- exports.initialise = initialise;
-
-}).call(this);
+module.exports = {
+ AsmParser: AsmParser
+};
diff --git a/lib/base-compiler.js b/lib/base-compiler.js
index 10cc779c6..67fcf8acc 100644
--- a/lib/base-compiler.js
+++ b/lib/base-compiler.js
@@ -37,9 +37,7 @@ quote = require('shell-quote'),
function Compile(compiler, env) {
this.compiler = compiler;
this.env = env;
- // TODO: make `asm` an object instead of a big fat global. Then CL can instantiate
- // a completely different ASM here instead of a dodgy regexp to choose its parser.
- asm.initialise(env.compilerProps);
+ this.asm = new asm.AsmParser(env.compilerProps);
}
Compile.prototype.newTempDir = function () {
@@ -171,7 +169,7 @@ Compile.prototype.compile = function (source, options, filters) {
result.dirPath = undefined;
}
if (result.okToCache) {
- result.asm = asm.processAsm(result.asm, filters);
+ result.asm = self.asm.process(result.asm, filters);
} else {
result.asm = {text: result.asm};
}
diff --git a/lib/compilers/CL.js b/lib/compilers/CL.js
index 693e6044d..10fc27b93 100644
--- a/lib/compilers/CL.js
+++ b/lib/compilers/CL.js
@@ -23,9 +23,11 @@
// POSSIBILITY OF SUCH DAMAGE.
var Compile = require('../base-compiler');
+var asm = require('../asm-cl');
function compileCl(info, env) {
var compile = new Compile(info, env);
+ compile.asm = new asm.AsmParser(env.compilerProps);
info.supportsFiltersInBinary = true;
if (process.platform == "linux") {
var wine = env.gccProps("wine");
diff --git a/test/filter-tests.js b/test/filter-tests.js
index 67244d341..ea0f7f16c 100755
--- a/test/filter-tests.js
+++ b/test/filter-tests.js
@@ -23,12 +23,18 @@
// POSSIBILITY OF SUCH DAMAGE.
var fs = require('fs'), assert = require('assert');
-var asm = require('../lib/asm.js');
+var asm = require('../lib/asm');
+var asmCl = require('../lib/asm-cl');
var should = require('chai').should();
function processAsm(filename, filters) {
var file = fs.readFileSync(filename, 'utf-8');
- return asm.processAsm(file, filters);
+ var parser;
+ if (file.indexOf('Microsoft') >= 0)
+ parser = new asmCl.AsmParser();
+ else
+ parser = new asm.AsmParser();
+ return parser.process(file, filters);
}
var cases = fs.readdirSync(__dirname + '/cases')