diff options
author | partouf <partouf@gmail.com> | 2017-11-28 21:22:53 +0100 |
---|---|---|
committer | partouf <partouf@gmail.com> | 2017-11-28 21:22:53 +0100 |
commit | 2446ea582b2b4374682ec9ada7752dfc3e157df9 (patch) | |
tree | 7318fb8b940634ad830ba576b7f7fb39821bf392 /lib/compilers/pascal.js | |
parent | a0c863587ad0f0558ef31fcb41b72c92bfac2cde (diff) | |
download | compiler-explorer-2446ea582b2b4374682ec9ada7752dfc3e157df9.tar.gz compiler-explorer-2446ea582b2b4374682ec9ada7752dfc3e157df9.zip |
separate demangler into support library
Diffstat (limited to 'lib/compilers/pascal.js')
-rw-r--r-- | lib/compilers/pascal.js | 184 |
1 files changed, 1 insertions, 183 deletions
diff --git a/lib/compilers/pascal.js b/lib/compilers/pascal.js index 862825378..d5eb507e0 100644 --- a/lib/compilers/pascal.js +++ b/lib/compilers/pascal.js @@ -25,195 +25,13 @@ var Compile = require('../base-compiler'), logger = require('../logger').logger, + PascalDemangler = require('../pascal-support').demangler, utils = require('../utils'), fs = require("fs"), path = require("path"); -class PascalDemangler { - constructor() { - this.symbolcache = {}; - this.sortedsymbolcache = []; - this.fixedsymbols = {}; - this.ignoredsymbols = []; - - this.initBasicSymbols(); - } - - initBasicSymbols() { - this.fixedsymbols.OUTPUT_$$_init = 'unit_initialization'; - this.fixedsymbols.OUTPUT_$$_finalize = 'unit_finalization'; - this.fixedsymbols.OUTPUT_$$_init_implicit = 'unit_initialization_implicit'; - this.fixedsymbols.OUTPUT_$$_finalize_implicit ='unit_finalization_implicit'; - this.fixedsymbols.OUTPUT_init = 'unit_initialization'; - this.fixedsymbols.OUTPUT_finalize = 'unit_finalization'; - this.fixedsymbols.OUTPUT_init_implicit = 'unit_initialization_implicit'; - this.fixedsymbols.OUTPUT_finalize_implicit = 'unit_finalization_implicit'; - - this.ignoredsymbols = [ - ".L", - "VMT_$", "INIT_$", "INIT$_$", "FINALIZE$_$", "RTTI_$", - "VMT_OUTPUT_", "INIT$_OUTPUT", "RTTI_OUTPUT_", "FINALIZE$_OUTPUT", - "_$", - "DEBUGSTART_$", "DEBUGEND_$", "DBG_$", "DBG2_$", "DBGREF_$", - "DEBUGSTART_OUTPUT", "DEBUGEND_OUTPUT", "DBG_OUTPUT_", "DBG2_OUTPUT_", "DBGREF_OUTPUT_" - ]; - } - - shouldIgnoreSymbol(text) { - for (var k in this.ignoredsymbols) { - if (text.startsWith(this.ignoredsymbols[k])) { - return true; - } - } - - return false; - } - - composeReadableMethodSignature(unitname, classname, methodname, params) { - var signature = ""; - - if (classname != "") signature = classname.toLowerCase() + "."; - - signature = signature + methodname.toLowerCase(); - signature = signature + "(" + params.toLowerCase() + ")"; - - return signature; - } - - demangle(text) { - if (text.endsWith(':')) { - if (this.shouldIgnoreSymbol(text)) { - return false; - } - - text = text.substr(0, text.length - 1); - - for (var k in this.fixedsymbols) { - if (text == k) { - text = text.replace(k, this.fixedsymbols[k]); - this.symbolcache[k] = this.fixedsymbols[k]; - return this.fixedsymbols[k]; - } - } - - var unmangledglobalvar; - if (text.startsWith("U_$OUTPUT_$$_")) { - unmangledglobalvar = text.substr(13).toLowerCase(); - this.symbolcache[text] = unmangledglobalvar; - return unmangledglobalvar; - } else if (text.startsWith("U_OUTPUT_")) { - unmangledglobalvar = text.substr(9).toLowerCase(); - this.symbolcache[text] = unmangledglobalvar; - return unmangledglobalvar; - } - - var idx, paramtype = "", signature = "", phase = 0; - var unitname = "", classname = "", methodname = "", params = "", resulttype = ""; - - idx = text.indexOf("$_$"); - if (idx != -1) { - unitname = text.substr(0, idx - 1); - classname = text.substr(idx + 3, text.indexOf("_$_", idx + 2) - idx - 3); - } - - signature = ""; - idx = text.indexOf("_$$_"); - if (idx != -1) { - if (unitname == "") unitname = text.substr(0, idx - 1); - signature = text.substr(idx + 3); - } - - if (unitname == "") { - idx = text.indexOf("OUTPUT_"); - if (idx != -1) { - unitname = "OUTPUT"; - - idx = text.indexOf("_$__"); - if (idx != -1) { - classname = text.substr(7, idx - 7); - signature = text.substr(idx + 3); - } else { - signature = text.substr(6); - } - } - } - - if (signature != "") { - for (idx = 1; idx < signature.length; idx++) { - if (signature[idx] == '$') { - if (phase == 0) phase = 1; - else if (phase == 1) { - if (paramtype == "") phase = 2; - else if (params != "") { - params = params + "," + paramtype; - paramtype = ""; - } else if (params == "") { - params = paramtype; - paramtype = ""; - } - } - } else { - if (phase == 0) methodname = methodname + signature[idx]; - else if (phase == 1) paramtype = paramtype + signature[idx]; - else if (phase == 2) resulttype = resulttype + signature[idx]; - } - } - - if (paramtype != "") { - if (params != "") params = params + "," + paramtype; - else params = paramtype; - } - } - - this.symbolcache[text] = this.composeReadableMethodSignature(unitname, classname, methodname, params); - return this.symbolcache[text]; - } - - return false; - } - - addDemangleToCache(text) { - this.demangle(text); - } - - buildOrderedCache() { - this.sortedsymbolcache = []; - for (var symbol in this.symbolcache) { - this.sortedsymbolcache.push([symbol, this.symbolcache[symbol]]); - } - - this.sortedsymbolcache = this.sortedsymbolcache.sort(function(a, b) { - return b[0].length - a[0].length; - }); - - this.symbolcache = {}; - } - - demangleIfNeeded(text) { - if (text.includes('$')) { - if (this.shouldIgnoreSymbol(text)) { - return text; - } - - for (var idx in this.sortedsymbolcache) { - text = text.replace(this.sortedsymbolcache[idx][0], this.sortedsymbolcache[idx][1]); - } - - return text; - } else { - return text; - } - } -} - function compileFPC(info, env) { var demangler = new PascalDemangler(); - - if (info === undefined) { - // for unittest - return demangler; - } - var compiler = new Compile(info, env); compiler.supportsOptOutput = false; |