diff options
author | Sebastian <s_rath@xpresso24.com> | 2019-10-03 00:04:51 -0400 |
---|---|---|
committer | Austin Morton <austinpmorton@gmail.com> | 2019-10-30 19:51:38 -0400 |
commit | 78b3381c84a238cc8be48e5685d74ceec5b36765 (patch) | |
tree | ec05ec7a8b33b653b7ac289da401d3eb636e10c1 /lib/compilers/python.js | |
parent | 568f906322377817c400f09f0e7212e8ba800a11 (diff) | |
download | compiler-explorer-78b3381c84a238cc8be48e5685d74ceec5b36765.tar.gz compiler-explorer-78b3381c84a238cc8be48e5685d74ceec5b36765.zip |
* Add Python support (#1612)
Diffstat (limited to 'lib/compilers/python.js')
-rw-r--r-- | lib/compilers/python.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/compilers/python.js b/lib/compilers/python.js new file mode 100644 index 000000000..15f42d0b8 --- /dev/null +++ b/lib/compilers/python.js @@ -0,0 +1,86 @@ +// Copyright (c) 2019, Sebastian Rath +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +const BaseCompiler = require('../base-compiler'), + argumentParsers = require("./argument-parsers"), + path = require('path'); + +class PythonCompiler extends BaseCompiler { + + constructor(compilerInfo, env) { + super(compilerInfo, env); + this.compiler.demangler = null; + this.demanglerClass = null; + } + + // eslint-disable-next-line no-unused-vars + processAsm(result, filters) { + const lineRe = /^\s{0,4}([0-9]+)(.*)/; + + const bytecodeLines = result.asm.split("\n"); + + var bytecodeResult = []; + var lastLineNo = null; + var sourceLoc = null; + + bytecodeLines.forEach(line => { + var match = line.match(lineRe); + + if (match) { + const lineno = parseInt(match[1]); + sourceLoc = {line: lineno, file: null}; + lastLineNo = lineno; + } else if (!line) { + sourceLoc = {line: null, file: null}; + lastLineNo = null; + } else { + sourceLoc = {line: lastLineNo, file: null}; + } + + bytecodeResult.push({text: line, source: sourceLoc}); + }); + + return bytecodeResult; + } + + getDisasmScriptPath() { + const script = this.compilerProps('disasmScript'); + + return script || path.resolve(__dirname, '..', '..', 'etc', 'scripts', 'dis_all.py'); + } + + optionsForFilter(filters, outputFilename) { + return ['-I', + this.getDisasmScriptPath(), + '--outputfile', + outputFilename, + '--inputfile']; + } + + getArgumentParser() { + return argumentParsers.Base; + } +} + +module.exports = PythonCompiler; |