{"version":3,"sources":["assembly/disassembler/structured.ts"],"names":["ExceptionInvalid","ASTNodeStatementLine","ASTNodeFile","SourceFile","AssemblyDisassembler","AssemblyDisassemblerStructured","constructor","disassemble","osi","subroutineReferenceCount","disassembles","mapper","_disassemblesStructuredFileMapperDefault","generator","_disassemblesStructuredFileMapperGenerator","add","file","args","entries","statements","length","push","subRefs","Map","entry","subroutines","itter","set","subroutine","subRefsGet","sub","get","subRefsAdd","parents","mapClassParents","metadata","disassembleMetadata","strings","disassembleStrings","globals","disassembleGlobals","symbols","disassembleSymbols","sources","disassembleSources","funcs","header","functionTable","i","definition","subroutinePtr","function","disassembleStructuredFunction","mapClassStructuresToNames","_disassembleMapClassStructuresToNames","classes","classTable","parent","subroutinesPtr","class","disassembleStructuredClass","refs","disassembleStructuredSubroutine","list","functionDefinition","index","offset","ast","_disassembleCreateStatementBlock","enableIndexComments","_disassembleSetComment","begin","comment","argEntries","arguments","_disassembleCreateArgumentFromString","name","_disassembleCreateArgumentFromInt","argc","getByOffset","stringEncode","disassembleStructuredSubroutineBody","classDefinition","structure","comments","extend","extends","extendName","join","property","classPropertyTable","disassembleClassProperty","subroutinesOut","method","classMethodTable","_disassembleCreateStatementLine","disassembleStructuredClassMethod","symbolTable","nameArg","_disassembleConvertSymbolToArgumentComment","symbol","arg","subroutineEntry","r","addressComment","mapSourceRange","instructions","instruction","disassembleInstruction","sourceRangeComments","_disassembleMapSourceRangeComment","insts","map","source","values","def"],"mappings":"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","sourcesContent":["import {\n\tOSI,\n\tFunctionDefinition,\n\tClassDefinitionMethod,\n\tIClassDefinitionTableEntry,\n\tISubroutineTableEntry,\n\tSubroutine\n} from '@sage-js/res-osi';\n\nimport {\n\tIDisassemblyStructuredFileMapper,\n\tMapClassStructuresToNames,\n\tMapSourceRange,\n\tMapSubroutineReferenceCount\n} from '../../types';\nimport {ExceptionInvalid} from '../../exception/invalid';\nimport {ASTNodeStatement} from '../../ast/node/statement/class';\nimport {ASTNodeStatementLine} from '../../ast/node/statement/line';\nimport {ASTNodeFile} from '../../ast/node/file';\nimport {SourceFile} from '../../sourcefile';\n\nimport {AssemblyDisassembler} from './class';\n\n/**\n * AssemblyDisassemblerStructured constructor.\n */\nexport class AssemblyDisassemblerStructured extends AssemblyDisassembler {\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Disassemble OSI to AST.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineReferenceCount Map subroutine references count.\n\t * @returns AST file.\n\t */\n\tpublic disassemble(\n\t\tosi: OSI,\n\t\tsubroutineReferenceCount: MapSubroutineReferenceCount[] | null = null\n\t) {\n\t\treturn this.disassembles(osi, null, subroutineReferenceCount)[0];\n\t}\n\n\t/**\n\t * Disassemble OSI to AST.\n\t * Supply a mapper object to disassemble multiple different AST files.\n\t * Otherwise a single AST file is returned in the list.\n\t *\n\t * @param osi OSI instance.\n\t * @param mapper Mapper object or null.\n\t * @param subroutineReferenceCount Map subroutine references count.\n\t * @returns AST file.\n\t */\n\tpublic disassembles(\n\t\tosi: OSI,\n\t\tmapper: IDisassemblyStructuredFileMapper | null = null,\n\t\tsubroutineReferenceCount: MapSubroutineReferenceCount[] | null = null\n\t) {\n\t\t// File mapper.\n\t\tmapper = mapper || this._disassemblesStructuredFileMapperDefault();\n\n\t\t// File generator.\n\t\tconst generator = this._disassemblesStructuredFileMapperGenerator();\n\n\t\t// Add section to file.\n\t\tconst add = (file: ASTNodeFile, args: ASTNodeStatement[]) => {\n\t\t\tconst {entries} = file.statements;\n\t\t\tif (entries.length) {\n\t\t\t\tentries.push(new ASTNodeStatementLine());\n\t\t\t}\n\t\t\tentries.push(...args);\n\t\t};\n\n\t\t// Subroutine reference counter code.\n\t\tconst subRefs = new Map() as MapSubroutineReferenceCount;\n\t\tfor (const entry of osi.subroutines.itter()) {\n\t\t\tsubRefs.set(entry.subroutine, 0);\n\t\t}\n\t\tconst subRefsGet = (sub: Subroutine) => subRefs.get(sub) || 0;\n\t\tconst subRefsAdd = (sub: Subroutine) => {\n\t\t\tsubRefs.set(sub, subRefsGet(sub) + 1);\n\t\t};\n\n\t\t// Map out parents, that may not have been transformed yet.\n\t\tconst parents = osi.mapClassParents();\n\n\t\t// Disassemble metadata and the different string tables.\n\t\tadd(\n\t\t\tgenerator.file(mapper.metadata(osi)),\n\t\t\tthis.disassembleMetadata(osi)\n\t\t);\n\t\tadd(\n\t\t\tgenerator.file(mapper.strings(osi)),\n\t\t\tthis.disassembleStrings(osi)\n\t\t);\n\t\tadd(\n\t\t\tgenerator.file(mapper.globals(osi)),\n\t\t\tthis.disassembleGlobals(osi)\n\t\t);\n\t\tadd(\n\t\t\tgenerator.file(mapper.symbols(osi)),\n\t\t\tthis.disassembleSymbols(osi)\n\t\t);\n\t\tadd(\n\t\t\tgenerator.file(mapper.sources(osi)),\n\t\t\tthis.disassembleSources(osi)\n\t\t);\n\n\t\t// Disassemble function.\n\t\tconst funcs = osi.header.functionTable.entries;\n\t\tfor (let i = 0; i < funcs.length; i++) {\n\t\t\tconst definition = funcs[i];\n\t\t\tconst subroutinePtr: Subroutine[] = [];\n\t\t\tadd(\n\t\t\t\tgenerator.file(mapper.function(osi, definition, i)),\n\t\t\t\tthis.disassembleStructuredFunction(\n\t\t\t\t\tosi,\n\t\t\t\t\tdefinition,\n\t\t\t\t\ti,\n\t\t\t\t\tsubroutinePtr\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst [subroutine] = subroutinePtr;\n\t\t\tsubRefsAdd(subroutine);\n\t\t}\n\n\t\t// Disassemble classes.\n\t\tconst mapClassStructuresToNames =\n\t\t\tthis._disassembleMapClassStructuresToNames(osi);\n\t\tconst classes = osi.header.classTable.entries;\n\t\tfor (let i = 0; i < classes.length; i++) {\n\t\t\tconst definition = classes[i];\n\t\t\tconst parent = parents.get(definition) || null;\n\t\t\tconst subroutinesPtr: Subroutine[][] = [];\n\t\t\tadd(\n\t\t\t\tgenerator.file(mapper.class(osi, definition, i)),\n\t\t\t\tthis.disassembleStructuredClass(\n\t\t\t\t\tosi,\n\t\t\t\t\tdefinition,\n\t\t\t\t\ti,\n\t\t\t\t\tmapClassStructuresToNames,\n\t\t\t\t\tparent,\n\t\t\t\t\tsubroutinesPtr\n\t\t\t\t)\n\t\t\t);\n\t\t\tfor (const subroutine of subroutinesPtr[0]) {\n\t\t\t\tsubRefsAdd(subroutine);\n\t\t\t}\n\t\t}\n\n\t\t// Disassemble any unreferenced subroutines.\n\t\tfor (const entry of osi.subroutines.itter()) {\n\t\t\tconst {subroutine} = entry;\n\t\t\tconst refs = subRefsGet(subroutine);\n\n\t\t\t// Skip those that are already referenced.\n\t\t\tif (refs) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Disassemble any unreferenced subroutines.\n\t\t\tadd(\n\t\t\t\tgenerator.file(mapper.subroutine(osi, entry)),\n\t\t\t\tthis.disassembleStructuredSubroutine(osi, entry)\n\t\t\t);\n\t\t}\n\n\t\t// Pass out the subroutine references map, if requested.\n\t\tif (subroutineReferenceCount) {\n\t\t\tsubroutineReferenceCount[0] = subRefs;\n\t\t}\n\n\t\t// Assemble all the generated files into a list.\n\t\treturn generator.list();\n\t}\n\n\t/**\n\t * Encode OSI AST function.\n\t *\n\t * @param osi OSI instance.\n\t * @param functionDefinition Function definition.\n\t * @param index Table index.\n\t * @param subroutine Consumed subroutine pointer out.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStructuredFunction(\n\t\tosi: OSI,\n\t\tfunctionDefinition: FunctionDefinition,\n\t\tindex: number,\n\t\tsubroutine: Subroutine[] | null = null\n\t): ASTNodeStatement[] {\n\t\tconst {offset} = functionDefinition;\n\t\tconst ast = this._disassembleCreateStatementBlock('function');\n\t\tif (this.enableIndexComments) {\n\t\t\tthis._disassembleSetComment(ast.begin.comment, `${index}`);\n\t\t}\n\n\t\tconst argEntries = ast.begin.arguments.entries;\n\t\targEntries.push(\n\t\t\tthis._disassembleCreateArgumentFromString(functionDefinition.name)\n\t\t);\n\n\t\targEntries.push(\n\t\t\tthis._disassembleCreateArgumentFromInt(functionDefinition.argc)\n\t\t);\n\n\t\tconst sub = osi.subroutines.getByOffset(offset);\n\t\tif (!sub) {\n\t\t\tthrow new ExceptionInvalid(\n\t\t\t\t`No subroutine at offset: ${offset.stringEncode(16)}`\n\t\t\t);\n\t\t}\n\n\t\tast.statements.entries.push(\n\t\t\t...this.disassembleStructuredSubroutineBody(osi, sub)\n\t\t);\n\n\t\tif (subroutine) {\n\t\t\tsubroutine[0] = sub.subroutine;\n\t\t}\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST class.\n\t *\n\t * @param osi OSI instance.\n\t * @param classDefinition Class definition.\n\t * @param index Table index.\n\t * @param mapClassStructuresToNames Class structures to names.\n\t * @param parent Parent definition or null.\n\t * @param subroutines Consumed subroutines pointer out.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStructuredClass(\n\t\tosi: OSI,\n\t\tclassDefinition: IClassDefinitionTableEntry,\n\t\tindex: number,\n\t\tmapClassStructuresToNames: MapClassStructuresToNames,\n\t\tparent: IClassDefinitionTableEntry | null,\n\t\tsubroutines: Subroutine[][] | null = null\n\t): ASTNodeStatement[] {\n\t\tconst {name, structure} = classDefinition;\n\n\t\tconst comments = this.enableIndexComments ? [`${index}`] : [];\n\n\t\tconst extend = structure.extends;\n\t\tconst extendName = extend ?\n\t\t\tmapClassStructuresToNames.get(extend) || null : null;\n\n\t\t// If a parent was mapped out but not transformed then comment it.\n\t\tif (parent && !extend) {\n\t\t\tconst name = parent.name.stringEncode();\n\t\t\tcomments.push(`extends ${name}`);\n\t\t}\n\n\t\tconst ast = this._disassembleCreateStatementBlock('class');\n\t\tthis._disassembleSetComment(ast.begin.comment, comments.join(', '));\n\n\t\tast.begin.arguments.entries.push(\n\t\t\tthis._disassembleCreateArgumentFromString(name)\n\t\t);\n\n\t\tif (extendName) {\n\t\t\tast.begin.arguments.entries.push(\n\t\t\t\tthis._disassembleCreateArgumentFromString(extendName)\n\t\t\t);\n\t\t}\n\n\t\tconst {entries} = ast.statements;\n\n\t\tfor (const property of structure.classPropertyTable.entries) {\n\t\t\tentries.push(...this.disassembleClassProperty(\n\t\t\t\tosi,\n\t\t\t\tproperty\n\t\t\t));\n\t\t}\n\n\t\tconst subroutinesOut: Subroutine[] | null = subroutines ? [] : null;\n\n\t\tconst subroutine: Subroutine[] = [];\n\t\tfor (const method of structure.classMethodTable.entries) {\n\t\t\t// Add blank line between each block.\n\t\t\tif (entries.length) {\n\t\t\t\tentries.push(this._disassembleCreateStatementLine());\n\t\t\t}\n\t\t\tentries.push(...this.disassembleStructuredClassMethod(\n\t\t\t\tosi,\n\t\t\t\tmethod,\n\t\t\t\tsubroutine\n\t\t\t));\n\t\t\tif (subroutinesOut) {\n\t\t\t\tsubroutinesOut.push(subroutine[0]);\n\t\t\t}\n\t\t}\n\t\tif (subroutines && subroutinesOut) {\n\t\t\tsubroutines[0] = subroutinesOut;\n\t\t}\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST class property.\n\t *\n\t * @param osi OSI instance.\n\t * @param method Class method.\n\t * @param subroutine Consumed subroutine pointer out.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStructuredClassMethod(\n\t\tosi: OSI,\n\t\tmethod: ClassDefinitionMethod,\n\t\tsubroutine: Subroutine[] | null = null\n\t): ASTNodeStatement[] {\n\t\tconst symbols = osi.header.symbolTable.entries;\n\t\tconst {offset} = method;\n\t\tconst comments = [];\n\n\t\tconst ast = this._disassembleCreateStatementBlock('method');\n\n\t\tconst nameArg = this._disassembleConvertSymbolToArgumentComment(\n\t\t\tsymbols,\n\t\t\tmethod.symbol\n\t\t);\n\t\tast.begin.arguments.entries.push(nameArg.arg);\n\t\tif (nameArg.comment !== null) {\n\t\t\tcomments.push(nameArg.comment);\n\t\t}\n\n\t\tthis._disassembleSetComment(ast.begin.comment, comments.join(', '));\n\n\t\tconst sub = osi.subroutines.getByOffset(offset);\n\t\tif (!sub) {\n\t\t\tthrow new ExceptionInvalid(\n\t\t\t\t`No subroutine at offset: ${offset.stringEncode(16)}`\n\t\t\t);\n\t\t}\n\n\t\tast.statements.entries.push(\n\t\t\t...this.disassembleStructuredSubroutineBody(osi, sub)\n\t\t);\n\n\t\tif (subroutine) {\n\t\t\tsubroutine[0] = sub.subroutine;\n\t\t}\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST subroutine.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineEntry Subroutine entry.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStructuredSubroutine(\n\t\tosi: OSI,\n\t\tsubroutineEntry: ISubroutineTableEntry\n\t): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementBlock('subroutine');\n\n\t\tast.statements.entries.push(\n\t\t\t...this.disassembleStructuredSubroutineBody(osi, subroutineEntry)\n\t\t);\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST subroutine body.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineEntry Subroutine entry.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStructuredSubroutineBody(\n\t\tosi: OSI,\n\t\tsubroutineEntry: ISubroutineTableEntry\n\t): ASTNodeStatement[] {\n\t\tconst {offset, subroutine} = subroutineEntry;\n\n\t\tconst r: ASTNodeStatement[] = [];\n\n\t\tconst addressComment = this._disassembleCreateStatementLine();\n\t\tthis._disassembleSetComment(\n\t\t\taddressComment.comment,\n\t\t\t`address: ${offset.stringEncode(16)}`\n\t\t);\n\t\tr.push(addressComment);\n\n\t\tconst mapSourceRange = new Map() as MapSourceRange;\n\n\t\t// Loop over the instructions.\n\t\tconst instructions: ASTNodeStatement[][] = [];\n\t\tfor (const instruction of subroutine.instructions) {\n\t\t\tinstructions.push(this.disassembleInstruction(\n\t\t\t\tosi,\n\t\t\t\tinstruction,\n\t\t\t\tsubroutineEntry,\n\t\t\t\tmapSourceRange\n\t\t\t));\n\t\t}\n\n\t\tconst sourceRangeComments = this._disassembleMapSourceRangeComment(\n\t\t\tosi,\n\t\t\tmapSourceRange\n\t\t);\n\n\t\tr.push(...sourceRangeComments);\n\n\t\tfor (const insts of instructions) {\n\t\t\tr.push(...insts);\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Takes a mapper object and returns AST file generators.\n\t *\n\t * @returns Generator methods.\n\t */\n\tprotected _disassemblesStructuredFileMapperGenerator() {\n\t\tconst map = new Map<string, ASTNodeFile>();\n\t\tconst file = (name: string) => {\n\t\t\tlet ast = map.get(name) || null;\n\t\t\tif (!ast) {\n\t\t\t\tast = new ASTNodeFile();\n\t\t\t\tast.source.file = new SourceFile('', name);\n\t\t\t\tmap.set(name, ast);\n\t\t\t}\n\t\t\treturn ast;\n\t\t};\n\n\t\tconst list = () => [...map.values()];\n\t\treturn {list, file};\n\t}\n\n\t/**\n\t * Default file mapper instance.\n\t *\n\t * @returns Mapper instance.\n\t */\n\tprotected _disassemblesStructuredFileMapperDefault():\n\tIDisassemblyStructuredFileMapper {\n\t\treturn {\n\t\t\tmetadata: osi => '',\n\t\t\tstrings: osi => '',\n\t\t\tglobals: osi => '',\n\t\t\tsymbols: osi => '',\n\t\t\tsources: osi => '',\n\t\t\tfunction: (osi, def, index) => '',\n\t\t\tclass: (osi, def, index) => '',\n\t\t\tsubroutine: (osi, def) => ''\n\t\t};\n\t}\n}\n"],"file":"structured.mjs","sourceRoot":"../../../src"}