{"version":3,"sources":["assembly/assembler/class.ts"],"names":["PrimitiveInt","PrimitiveInt16U","PrimitiveInt32U","PrimitiveFloat","PrimitiveString","PrimitiveStringP8N","utilStringToNumber","OSI","instructionByName","FunctionDefinition","ClassDefinitionProperty","ClassDefinitionMethod","typed","ExceptionAST","ExceptionASTNode","ASTNodeArgumentNumber","ASTNodeArgumentString","ASTNodeStatementLine","ASTNodeStatementBlock","ASTNodeStatementInstruction","Assembly","AssemblyAssembler","constructor","reset","assemble","ast","osi","blocks","instructions","_assembleGroupStatements","statements","_assembleAssertNoInstructions","blocksByID","_assembleIdentifierMappedBlocks","blockMetadata","_assembleIdentifierMappedBlocksConsumeOne","blockStrings","_assembleIdentifierMappedBlocksConsumeOneOptional","blockGlobals","blockSymbols","blockSources","blockFunctions","blockClasses","blocksSubroutines","_assembleIdentifierMappedBlocksConsume","_assembleAssertBlockByIdentifierEmpty","assembleMetadata","assembleStrings","assembleGlobals","assembleSymbols","assembleSources","idToOffset","Map","assembleSubroutines","assembleFunctions","assembleClasses","updateOffsets","_assembleAssertArgumentCount","begin","arguments","_assembleAssertNoBlocks","instructionsById","_assembleIdentifierMappedInstructions","version","_assembleIdentifierMappedInstructionsConsumeOne","_assembleAssertInstructionByIdentifierEmpty","header","_assembleDecodeArgument","entries","flags","initVersion","assembleStringP8NTable","stringTable","globalTable","symbolTable","sourceTable","table","blockID","instructionID","strings","_assembleIdentifierMappedInstructionsConsume","str","assembleStringP8NTableEntry","push","instructionsByID","instructionFunctions","functionTable","instruction","assembleFunction","functionDefinitionTable","definition","argIdNode","id","_assembleDecodeArgumentNumber","offset","get","name","argc","symbolToIndex","_assembleSymbolToIndex","classTable","block","assembleClass","classDefinitionTable","instructionProperties","instructionMethods","structure","ClassDefinition","assembleClassProperty","assembleClassMethod","classDefinition","property","argName","symbol","_assembleConvertArgumentToSymbol","classPropertyTable","method","classMethodTable","asts","subroutines","clear","assembleSubroutine","has","assembleSubroutineBody","set","length","subroutine","addNew","assembleInstruction","identifier","text","Instruction","assembleInstructionArguments","i","assembleInstructionArgument","index","iArg","argGet","aArg","iArgNew","argSet","argument","cast","err","msg","message","primitive","stringDecodeNew","_assembleGroupStatementsList","statement","line","r","list","map","delete","_assembleIdentifierMappedInstructionsConsumeOneOptional","container","entry","args","count","l","_assembleAssertArgumentCountRange","min","max","argString","symbolMap","symbolList","value","s"],"mappings":"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","sourcesContent":["import {\n\tPrimitive,\n\tPrimitiveInt,\n\tPrimitiveInt16U,\n\tPrimitiveInt32U,\n\tPrimitiveFloat,\n\tPrimitiveString,\n\tPrimitiveStringP8N,\n\tutilStringToNumber\n} from '@sage-js/core';\nimport {\n\tOSI,\n\tStringP8NTable,\n\tSubroutine,\n\tInstruction,\n\tinstructionByName,\n\tFunctionDefinition,\n\tFunctionDefinitionTable,\n\tClassDefinition,\n\tClassDefinitionTable,\n\tClassDefinitionProperty,\n\tClassDefinitionMethod\n} from '@sage-js/res-osi';\n\nimport {typed} from '../../typed';\nimport {\n\tMapIdentifierToASTNodeStatementInstruction,\n\tMapIdentifierToASTNodeStatementBlock,\n\tMapIdToSubroutineOffset,\n\tSymbolToIndex\n} from '../../types';\nimport {ExceptionAST} from '../../exception/ast/class';\nimport {ExceptionASTNode} from '../../exception/ast/node/class';\nimport {ASTNode} from '../../ast/node/class';\nimport {ASTNodeArgument} from '../../ast/node/argument/class';\nimport {ASTNodeArgumentNumber} from '../../ast/node/argument/number';\nimport {ASTNodeArgumentString} from '../../ast/node/argument/string';\nimport {ASTNodeArguments} from '../../ast/node/arguments';\nimport {ASTNodeFile} from '../../ast/node/file';\nimport {ASTNodeStatements} from '../../ast/node/statements';\nimport {ASTNodeStatementLine} from '../../ast/node/statement/line';\nimport {ASTNodeStatementBlock} from '../../ast/node/statement/block';\nimport {\n\tASTNodeStatementInstruction\n} from '../../ast/node/statement/instruction';\nimport {Assembly} from '../class';\n\n/**\n * AssemblyAssembler constructor.\n */\nexport class AssemblyAssembler extends Assembly {\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Reset any stateful properties.\n\t */\n\tpublic reset() {\n\t\t// Does nothing at present.\n\t}\n\n\t/**\n\t * Assemble AST to OSI.\n\t *\n\t * @param ast AST file.\n\t * @returns OSI instance.\n\t */\n\tpublic assemble(ast: ASTNodeFile) {\n\t\tconst osi = new OSI();\n\n\t\t// Sort top level statements.\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoInstructions(instructions);\n\n\t\t// Sort blocks by identifier.\n\t\tconst blocksByID = this._assembleIdentifierMappedBlocks(blocks);\n\n\t\t// Read the expected ones.\n\t\tconst blockMetadata = this._assembleIdentifierMappedBlocksConsumeOne(\n\t\t\tblocksByID,\n\t\t\t'metadata',\n\t\t\tast\n\t\t);\n\n\t\t// Read the optional ones.\n\t\tconst blockStrings =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'strings'\n\t\t\t);\n\t\tconst blockGlobals =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'globals'\n\t\t\t);\n\t\tconst blockSymbols =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'symbols'\n\t\t\t);\n\t\tconst blockSources =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'sources'\n\t\t\t);\n\t\tconst blockFunctions =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'functions'\n\t\t\t);\n\t\tconst blockClasses =\n\t\t\tthis._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\t\tblocksByID,\n\t\t\t\t'classes'\n\t\t\t);\n\t\tconst blocksSubroutines = this._assembleIdentifierMappedBlocksConsume(\n\t\t\tblocksByID,\n\t\t\t'subroutine'\n\t\t);\n\n\t\t// Make sure no unexpected blocks remain.\n\t\tthis._assembleAssertBlockByIdentifierEmpty(blocksByID);\n\n\t\t// Read the metadata to init the OSI.\n\t\tthis.assembleMetadata(blockMetadata, osi);\n\n\t\t// Assemble the strings tables if present.\n\t\tif (blockStrings) {\n\t\t\tthis.assembleStrings(blockStrings, osi);\n\t\t}\n\t\tif (blockGlobals) {\n\t\t\tthis.assembleGlobals(blockGlobals, osi);\n\t\t}\n\t\tif (blockSymbols) {\n\t\t\tthis.assembleSymbols(blockSymbols, osi);\n\t\t}\n\t\tif (blockSources) {\n\t\t\tthis.assembleSources(blockSources, osi);\n\t\t}\n\n\t\t// Create subroutines with some dummy offsets.\n\t\tconst idToOffset = new Map() as MapIdToSubroutineOffset;\n\t\tthis.assembleSubroutines(blocksSubroutines, osi, idToOffset);\n\n\t\t// Create functions and classes using those dummy offsets.\n\t\tif (blockFunctions) {\n\t\t\tthis.assembleFunctions(blockFunctions, osi, idToOffset);\n\t\t}\n\t\tif (blockClasses) {\n\t\t\tthis.assembleClasses(blockClasses, osi, idToOffset);\n\t\t}\n\n\t\t// Update offsets to their real values.\n\t\tosi.updateOffsets();\n\n\t\treturn osi;\n\t}\n\n\t/**\n\t * Assemble metadata AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleMetadata(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 0);\n\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoBlocks(blocks);\n\n\t\tconst instructionsById =\n\t\t\tthis._assembleIdentifierMappedInstructions(instructions);\n\n\t\tconst version = this._assembleIdentifierMappedInstructionsConsumeOne(\n\t\t\tinstructionsById,\n\t\t\t'version',\n\t\t\tast\n\t\t);\n\n\t\tthis._assembleAssertInstructionByIdentifierEmpty(instructionsById);\n\n\t\tthis._assembleAssertArgumentCount(version.arguments, 2);\n\t\tosi.header.version = this._assembleDecodeArgument(\n\t\t\tosi.header.version,\n\t\t\tversion.arguments.entries[0]\n\t\t);\n\t\tosi.header.flags = this._assembleDecodeArgument(\n\t\t\tosi.header.flags,\n\t\t\tversion.arguments.entries[1]\n\t\t);\n\n\t\tosi.header.initVersion();\n\t}\n\n\t/**\n\t * Assemble string AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleStrings(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis.assembleStringP8NTable(\n\t\t\tast,\n\t\t\tosi.header.stringTable,\n\t\t\t'strings',\n\t\t\t'string'\n\t\t);\n\t}\n\n\t/**\n\t * Assemble globals AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleGlobals(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis.assembleStringP8NTable(\n\t\t\tast,\n\t\t\tosi.header.globalTable,\n\t\t\t'globals',\n\t\t\t'global'\n\t\t);\n\t}\n\n\t/**\n\t * Assemble symbols AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleSymbols(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis.assembleStringP8NTable(\n\t\t\tast,\n\t\t\tosi.header.symbolTable,\n\t\t\t'symbols',\n\t\t\t'symbol'\n\t\t);\n\t}\n\n\t/**\n\t * Assemble sources AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t */\n\tpublic assembleSources(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tthis.assembleStringP8NTable(\n\t\t\tast,\n\t\t\tosi.header.sourceTable,\n\t\t\t'sources',\n\t\t\t'source'\n\t\t);\n\t}\n\n\t/**\n\t * Assemble a generic string AST block into table.\n\t *\n\t * @param ast AST block.\n\t * @param table String table.\n\t * @param blockID Block ID.\n\t * @param instructionID Instruction ID.\n\t */\n\tpublic assembleStringP8NTable(\n\t\tast: ASTNodeStatementBlock,\n\t\ttable: StringP8NTable,\n\t\tblockID: string,\n\t\tinstructionID: string\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 0);\n\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoBlocks(blocks);\n\n\t\tconst instructionsById = this._assembleIdentifierMappedInstructions(\n\t\t\tinstructions\n\t\t);\n\n\t\tconst strings = this._assembleIdentifierMappedInstructionsConsume(\n\t\t\tinstructionsById,\n\t\t\tinstructionID\n\t\t);\n\n\t\tthis._assembleAssertInstructionByIdentifierEmpty(instructionsById);\n\n\t\ttable.entries = [];\n\t\tfor (const str of strings) {\n\t\t\tthis.assembleStringP8NTableEntry(\n\t\t\t\tstr,\n\t\t\t\ttable,\n\t\t\t\tinstructionID\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble a generic string AST instruction into table.\n\t *\n\t * @param ast AST instruction.\n\t * @param table StringP8NTable instance.\n\t * @param instructionID Instruction ID.\n\t */\n\tpublic assembleStringP8NTableEntry(\n\t\tast: ASTNodeStatementInstruction,\n\t\ttable: StringP8NTable,\n\t\tinstructionID: string\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.arguments, 1);\n\t\ttable.entries.push(this._assembleDecodeArgument(\n\t\t\tnew PrimitiveStringP8N(),\n\t\t\tast.arguments.entries[0]\n\t\t));\n\t}\n\n\t/**\n\t * Assemble a functions AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @param idToOffset Maps ID to offset.\n\t */\n\tpublic assembleFunctions(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI,\n\t\tidToOffset: MapIdToSubroutineOffset\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 0);\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoBlocks(blocks);\n\n\t\tconst instructionsByID =\n\t\t\tthis._assembleIdentifierMappedInstructions(instructions);\n\t\tconst instructionFunctions =\n\t\t\tthis._assembleIdentifierMappedInstructionsConsume(\n\t\t\t\tinstructionsByID,\n\t\t\t\t'function'\n\t\t\t);\n\t\tthis._assembleAssertInstructionByIdentifierEmpty(instructionsByID);\n\n\t\tosi.header.functionTable.entries = [];\n\t\tfor (const instruction of instructionFunctions) {\n\t\t\tthis.assembleFunction(\n\t\t\t\tinstruction,\n\t\t\t\tosi.header.functionTable,\n\t\t\t\tidToOffset\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble a function AST instruction into table.\n\t *\n\t * @param ast AST instruction.\n\t * @param functionDefinitionTable FunctionDefinitionTable instance.\n\t * @param idToOffset Maps ID to offset.\n\t */\n\tpublic assembleFunction(\n\t\tast: ASTNodeStatementInstruction,\n\t\tfunctionDefinitionTable: FunctionDefinitionTable,\n\t\tidToOffset: MapIdToSubroutineOffset\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.arguments, 3);\n\t\tconst definition = new FunctionDefinition();\n\n\t\tconst [,, argIdNode] = ast.arguments.entries;\n\t\tconst id = this._assembleDecodeArgumentNumber(argIdNode);\n\t\tconst offset = idToOffset.get(id);\n\t\tif (!offset) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`No subroutine with identifier: ${id}`,\n\t\t\t\targIdNode\n\t\t\t);\n\t\t}\n\n\t\tdefinition.name = this._assembleDecodeArgument(\n\t\t\tdefinition.name,\n\t\t\tast.arguments.entries[0]\n\t\t);\n\t\tdefinition.argc = this._assembleDecodeArgument(\n\t\t\tdefinition.argc,\n\t\t\tast.arguments.entries[1]\n\t\t);\n\t\tdefinition.offset = offset;\n\n\t\tfunctionDefinitionTable.entries.push(definition);\n\t}\n\n\t/**\n\t * Assemble a classes AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @param idToOffset Maps ID to offset.\n\t */\n\tpublic assembleClasses(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI,\n\t\tidToOffset: MapIdToSubroutineOffset\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 0);\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoInstructions(instructions);\n\n\t\tconst blocksByID = this._assembleIdentifierMappedBlocks(blocks);\n\t\tconst blockClasses = this._assembleIdentifierMappedBlocksConsume(\n\t\t\tblocksByID,\n\t\t\t'class'\n\t\t);\n\t\tthis._assembleAssertBlockByIdentifierEmpty(blocksByID);\n\n\t\t// Function to get or add an existing symbol.\n\t\tconst symbolToIndex = this._assembleSymbolToIndex(osi);\n\n\t\tosi.header.classTable.entries = [];\n\t\tfor (const block of blockClasses) {\n\t\t\tthis.assembleClass(\n\t\t\t\tblock,\n\t\t\t\tosi.header.classTable,\n\t\t\t\tidToOffset,\n\t\t\t\tsymbolToIndex\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble a class AST block into table.\n\t *\n\t * @param ast AST block.\n\t * @param classDefinitionTable ClassDefinitionTable instance.\n\t * @param idToOffset Maps ID to offset.\n\t * @param symbolToIndex Get symbol or add.\n\t */\n\tpublic assembleClass(\n\t\tast: ASTNodeStatementBlock,\n\t\tclassDefinitionTable: ClassDefinitionTable,\n\t\tidToOffset: MapIdToSubroutineOffset,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 1);\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoBlocks(blocks);\n\n\t\tconst instructionsByID =\n\t\t\tthis._assembleIdentifierMappedInstructions(instructions);\n\t\tconst instructionProperties =\n\t\t\tthis._assembleIdentifierMappedInstructionsConsume(\n\t\t\t\tinstructionsByID,\n\t\t\t\t'property'\n\t\t\t);\n\t\tconst instructionMethods =\n\t\t\tthis._assembleIdentifierMappedInstructionsConsume(\n\t\t\t\tinstructionsByID,\n\t\t\t\t'method'\n\t\t\t);\n\t\tthis._assembleAssertInstructionByIdentifierEmpty(instructionsByID);\n\n\t\tconst structure = new classDefinitionTable.ClassDefinition();\n\n\t\tconst name = this._assembleDecodeArgument(\n\t\t\tnew PrimitiveStringP8N(),\n\t\t\tast.begin.arguments.entries[0]\n\t\t);\n\n\t\tfor (const instruction of instructionProperties) {\n\t\t\tthis.assembleClassProperty(\n\t\t\t\tinstruction,\n\t\t\t\tstructure,\n\t\t\t\tsymbolToIndex\n\t\t\t);\n\t\t}\n\t\tfor (const instruction of instructionMethods) {\n\t\t\tthis.assembleClassMethod(\n\t\t\t\tinstruction,\n\t\t\t\tstructure,\n\t\t\t\tidToOffset,\n\t\t\t\tsymbolToIndex\n\t\t\t);\n\t\t}\n\n\t\tclassDefinitionTable.entries.push({\n\t\t\tname,\n\t\t\tstructure\n\t\t});\n\t}\n\n\t/**\n\t * Assemble a class property AST instruction into definition.\n\t *\n\t * @param ast AST instruction.\n\t * @param classDefinition Definition instance.\n\t * @param symbolToIndex Get symbol or add.\n\t */\n\tpublic assembleClassProperty(\n\t\tast: ASTNodeStatementInstruction,\n\t\tclassDefinition: ClassDefinition,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.arguments, 1);\n\t\tconst property = new ClassDefinitionProperty();\n\n\t\tconst [argName] = ast.arguments.entries;\n\t\tproperty.symbol = this._assembleConvertArgumentToSymbol(\n\t\t\targName,\n\t\t\tsymbolToIndex\n\t\t);\n\n\t\tclassDefinition.classPropertyTable.entries.push(property);\n\t}\n\n\t/**\n\t * Assemble a class method AST instruction into definition.\n\t *\n\t * @param ast AST instruction.\n\t * @param classDefinition Definition instance.\n\t * @param idToOffset Maps ID to offset.\n\t * @param symbolToIndex Get symbol or add.\n\t */\n\tpublic assembleClassMethod(\n\t\tast: ASTNodeStatementInstruction,\n\t\tclassDefinition: ClassDefinition,\n\t\tidToOffset: MapIdToSubroutineOffset,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.arguments, 2);\n\n\t\tconst method = new ClassDefinitionMethod();\n\n\t\tconst [, argIdNode] = ast.arguments.entries;\n\t\tconst id = this._assembleDecodeArgumentNumber(argIdNode);\n\t\tconst offset = idToOffset.get(id);\n\t\tif (!offset) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`No subroutine with identifier: ${id}`,\n\t\t\t\targIdNode\n\t\t\t);\n\t\t}\n\n\t\tconst [argName] = ast.arguments.entries;\n\t\tmethod.symbol = this._assembleConvertArgumentToSymbol(\n\t\t\targName,\n\t\t\tsymbolToIndex\n\t\t);\n\n\t\tmethod.offset = offset;\n\n\t\tclassDefinition.classMethodTable.entries.push(method);\n\t}\n\n\t/**\n\t * Assemble subroutines AST blocks into OSI.\n\t *\n\t * @param asts AST blocks.\n\t * @param osi OSI instance.\n\t * @param idToOffset Maps ID to offset.\n\t */\n\tpublic assembleSubroutines(\n\t\tasts: ASTNodeStatementBlock[],\n\t\tosi: OSI,\n\t\tidToOffset: MapIdToSubroutineOffset\n\t) {\n\t\tosi.subroutines.clear();\n\t\tosi.subroutines.updateOffsets(new PrimitiveInt32U(0));\n\n\t\tfor (const block of asts) {\n\t\t\tthis.assembleSubroutine(block, osi, idToOffset);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble subroutine AST block into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @param idToOffset Maps ID to offset.\n\t */\n\tpublic assembleSubroutine(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI,\n\t\tidToOffset: MapIdToSubroutineOffset\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.begin.arguments, 1);\n\t\tconst [argIdNode] = ast.begin.arguments.entries;\n\t\tconst id = this._assembleDecodeArgumentNumber(argIdNode);\n\n\t\tif (idToOffset.has(id)) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Duplicate subroutine identifier: ${id}`,\n\t\t\t\targIdNode\n\t\t\t);\n\t\t}\n\n\t\t// Assemble body.\n\t\tconst offset = this.assembleSubroutineBody(ast, osi);\n\n\t\tidToOffset.set(id, offset);\n\t}\n\n\t/**\n\t * Assemble subroutine AST statements into OSI.\n\t *\n\t * @param ast AST block.\n\t * @param osi OSI instance.\n\t * @returns The offset.\n\t */\n\tpublic assembleSubroutineBody(\n\t\tast: ASTNodeStatementBlock,\n\t\tosi: OSI\n\t) {\n\t\tconst {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t} = this._assembleGroupStatements(ast.statements);\n\t\tthis._assembleAssertNoBlocks(blocks);\n\n\t\tif (!instructions.length) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t'Block has no instructions',\n\t\t\t\tast\n\t\t\t);\n\t\t}\n\n\t\tconst {\n\t\t\toffset,\n\t\t\tsubroutine\n\t\t} = osi.subroutines.addNew();\n\t\tfor (const instruction of instructions) {\n\t\t\tthis.assembleInstruction(instruction, subroutine);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\t/**\n\t * Assemble instruction AST instruction into subroutine.\n\t *\n\t * @param ast AST instruction.\n\t * @param subroutine Subroutine instance.\n\t */\n\tpublic assembleInstruction(\n\t\tast: ASTNodeStatementInstruction,\n\t\tsubroutine: Subroutine\n\t) {\n\t\tconst name = ast.identifier.text;\n\t\tconst Instruction = instructionByName(name);\n\t\tif (!Instruction) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Unknown instruction name: ${name}`,\n\t\t\t\tast\n\t\t\t);\n\t\t}\n\t\tconst instruction = new Instruction();\n\t\tthis.assembleInstructionArguments(ast, instruction);\n\t\tsubroutine.instructions.push(instruction);\n\t}\n\n\t/**\n\t * Assemble arguments AST into instruction.\n\t *\n\t * @param ast AST instruction.\n\t * @param instruction Instruction instance.\n\t */\n\tpublic assembleInstructionArguments(\n\t\tast: ASTNodeStatementInstruction,\n\t\tinstruction: Instruction\n\t) {\n\t\tthis._assembleAssertArgumentCount(ast.arguments, instruction.argc);\n\t\tfor (let i = 0; i < instruction.argc; i++) {\n\t\t\tthis.assembleInstructionArgument(ast, instruction, i);\n\t\t}\n\t}\n\n\t/**\n\t * Assemble argument AST into instruction.\n\t *\n\t * @param ast AST instruction.\n\t * @param instruction Instruction instance.\n\t * @param index Argument index.\n\t */\n\tpublic assembleInstructionArgument(\n\t\tast: ASTNodeStatementInstruction,\n\t\tinstruction: Instruction,\n\t\tindex: number\n\t) {\n\t\tconst iArg = instruction.argGet(index);\n\t\tconst aArg = ast.arguments.entries[index];\n\t\tconst iArgNew = this._assembleDecodeArgument(iArg, aArg);\n\t\tinstruction.argSet(index, iArgNew);\n\t}\n\n\t/**\n\t * Decode argument AST into a number.\n\t *\n\t * @param argument AST argument.\n\t * @returns Decoded number.\n\t */\n\tprotected _assembleDecodeArgumentNumber(argument: ASTNodeArgument) {\n\t\tif (!typed.cast(argument, ASTNodeArgumentNumber)) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t'Argument is not a number',\n\t\t\t\targument\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn utilStringToNumber(argument.text);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconst msg = err.message || '';\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Invalid identifier argument: ${msg}`,\n\t\t\t\targument\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Decode argument AST into a primitive.\n\t *\n\t * @param primitive Primitive object to decode new of.\n\t * @param argument AST argument.\n\t * @returns Decoded argument.\n\t */\n\tprotected _assembleDecodeArgument<\n\t\tT extends Primitive\n\t>(\n\t\tprimitive: T,\n\t\targument: ASTNodeArgument\n\t): T {\n\t\tif (typed.cast(primitive, PrimitiveInt)) {\n\t\t\tif (!typed.cast(argument, ASTNodeArgumentNumber)) {\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t'Argument is not a number',\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn primitive.stringDecodeNew(argument.text);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconst msg = err.message || '';\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t`Invalid integer argument: ${msg}`,\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\telse if (typed.cast(primitive, PrimitiveFloat)) {\n\t\t\tif (!typed.cast(argument, ASTNodeArgumentNumber)) {\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t'Argument is not a number',\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn primitive.stringDecodeNew(argument.text);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconst msg = err.message || '';\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t`Invalid float argument: ${msg}`,\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\telse if (typed.cast(primitive, PrimitiveString)) {\n\t\t\tif (!typed.cast(argument, ASTNodeArgumentString)) {\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t'Argument is not a string',\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn primitive.stringDecodeNew(argument.text);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconst msg = err.message || '';\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t`Invalid string argument: ${msg}`,\n\t\t\t\t\targument\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthrow new ExceptionASTNode(\n\t\t\t'Unknown argument type',\n\t\t\targument\n\t\t);\n\t}\n\n\t/**\n\t * Groups a list of statements by type, ignoring the empty lines.\n\t *\n\t * @param asts AST statements list.\n\t * @returns The blocks and instructions.\n\t */\n\tprotected _assembleGroupStatementsList(asts: ASTNodeStatements[]) {\n\t\tconst blocks: ASTNodeStatementBlock[] = [];\n\t\tconst instructions: ASTNodeStatementInstruction[] = [];\n\n\t\tfor (const ast of asts) {\n\t\t\tfor (const statement of ast.entries) {\n\t\t\t\tconst line = typed.cast(statement, ASTNodeStatementLine);\n\t\t\t\tif (line) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst block = typed.cast(statement, ASTNodeStatementBlock);\n\t\t\t\tif (block) {\n\t\t\t\t\tblocks.push(block);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst instruction =\n\t\t\t\t\ttyped.cast(statement, ASTNodeStatementInstruction);\n\t\t\t\tif (instruction) {\n\t\t\t\t\tinstructions.push(instruction);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t\t'Unknown statement type',\n\t\t\t\t\tstatement\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tblocks,\n\t\t\tinstructions\n\t\t};\n\t}\n\n\t/**\n\t * Groups statements by type, ignoring the empty lines.\n\t *\n\t * @param ast AST statements.\n\t * @returns The blocks and instructions.\n\t */\n\tprotected _assembleGroupStatements(ast: ASTNodeStatements) {\n\t\treturn this._assembleGroupStatementsList([ast]);\n\t}\n\n\t/**\n\t * Map instructions by identifier.\n\t *\n\t * @param instructions AST instructions.\n\t * @returns The map.\n\t */\n\tprotected _assembleIdentifierMappedInstructions(\n\t\tinstructions: ASTNodeStatementInstruction[]\n\t) {\n\t\tconst r = new Map() as MapIdentifierToASTNodeStatementInstruction;\n\t\tfor (const instruction of instructions) {\n\t\t\tconst id = instruction.identifier.text;\n\t\t\tconst list = r.get(id) || [];\n\t\t\tlist.push(instruction);\n\t\t\tr.set(id, list);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map blocks by identifier.\n\t *\n\t * @param blocks AST blocks.\n\t * @returns The map.\n\t */\n\tprotected _assembleIdentifierMappedBlocks(\n\t\tblocks: ASTNodeStatementBlock[]\n\t) {\n\t\tconst r = new Map() as MapIdentifierToASTNodeStatementBlock;\n\t\tfor (const block of blocks) {\n\t\t\tconst id = block.begin.identifier.text;\n\t\t\tconst list = r.get(id) || [];\n\t\t\tlist.push(block);\n\t\t\tr.set(id, list);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get and remove instructions from map.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @returns The map.\n\t */\n\tprotected _assembleIdentifierMappedInstructionsConsume(\n\t\tmap: MapIdentifierToASTNodeStatementInstruction,\n\t\tid: string\n\t) {\n\t\tconst r = map.get(id) || [];\n\t\tmap.delete(id);\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get and remove blocks from map.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @returns The map.\n\t */\n\tprotected _assembleIdentifierMappedBlocksConsume(\n\t\tmap: MapIdentifierToASTNodeStatementBlock,\n\t\tid: string\n\t) {\n\t\tconst r = map.get(id) || [];\n\t\tmap.delete(id);\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get and remove an instruction from map, throwing if more than one.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @returns The instruction or null.\n\t */\n\tprotected _assembleIdentifierMappedInstructionsConsumeOneOptional(\n\t\tmap: MapIdentifierToASTNodeStatementInstruction,\n\t\tid: string\n\t) {\n\t\tconst list = map.get(id);\n\t\tif (!list) {\n\t\t\treturn null;\n\t\t}\n\t\tif (list.length !== 1) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Duplicate instruction with identifier ${id}`,\n\t\t\t\tlist[1]\n\t\t\t);\n\t\t}\n\t\tmap.delete(id);\n\t\treturn list[0];\n\t}\n\n\t/**\n\t * Get and remove a block from map, throwing if more than one.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @returns The block or null.\n\t */\n\tprotected _assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\tmap: MapIdentifierToASTNodeStatementBlock,\n\t\tid: string\n\t) {\n\t\tconst list = map.get(id);\n\t\tif (!list) {\n\t\t\treturn null;\n\t\t}\n\t\tif (list.length !== 1) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Duplicate block with identifier ${id}`,\n\t\t\t\tlist[1]\n\t\t\t);\n\t\t}\n\t\tmap.delete(id);\n\t\treturn list[0];\n\t}\n\n\t/**\n\t * Get and remove a block from map, throwing if more than one.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @param container Container element used for throwing exceptions.\n\t * @returns The instruction or null.\n\t */\n\tprotected _assembleIdentifierMappedInstructionsConsumeOne(\n\t\tmap: MapIdentifierToASTNodeStatementInstruction,\n\t\tid: string,\n\t\tcontainer: ASTNode | null\n\t) {\n\t\tconst r = this._assembleIdentifierMappedInstructionsConsumeOneOptional(\n\t\t\tmap,\n\t\t\tid\n\t\t);\n\t\tif (!r) {\n\t\t\tconst msg = `No instruction with identifier ${id}`;\n\t\t\tif (container) {\n\t\t\t\tthrow new ExceptionASTNode(msg, container);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new ExceptionAST(msg);\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get and remove an instruction from map, throwing if more than one.\n\t *\n\t * @param map Map object.\n\t * @param id Identifier string.\n\t * @param container Container element used for throwing exceptions.\n\t * @returns The block or null.\n\t */\n\tprotected _assembleIdentifierMappedBlocksConsumeOne(\n\t\tmap: MapIdentifierToASTNodeStatementBlock,\n\t\tid: string,\n\t\tcontainer: ASTNode | null\n\t) {\n\t\tconst r = this._assembleIdentifierMappedBlocksConsumeOneOptional(\n\t\t\tmap,\n\t\t\tid\n\t\t);\n\t\tif (!r) {\n\t\t\tconst msg = `No block with identifier ${id}`;\n\t\t\tif (container) {\n\t\t\t\tthrow new ExceptionASTNode(msg, container);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new ExceptionAST(msg);\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Assert mapped instructions object is empty.\n\t *\n\t * @param map Map object.\n\t */\n\tprotected _assembleAssertInstructionByIdentifierEmpty(\n\t\tmap: MapIdentifierToASTNodeStatementInstruction\n\t) {\n\t\tfor (const [, entry] of map) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t'Unexpected instruction',\n\t\t\t\tentry[0]\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assert mapped blocks object is empty.\n\t *\n\t * @param map Map object.\n\t */\n\tprotected _assembleAssertBlockByIdentifierEmpty(\n\t\tmap: MapIdentifierToASTNodeStatementBlock\n\t) {\n\t\tfor (const [, entry] of map) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t'Unexpected block',\n\t\t\t\tentry[0]\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assert arguments entry count.\n\t *\n\t * @param args Arguments node.\n\t * @param count Expected count.\n\t */\n\tprotected _assembleAssertArgumentCount(\n\t\targs: ASTNodeArguments,\n\t\tcount: number\n\t) {\n\t\tconst l = args.entries.length;\n\t\tif (l < count) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Too few arguments, expected ${count} found ${l}`,\n\t\t\t\targs\n\t\t\t);\n\t\t}\n\t\telse if (l > count) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Unexpected argument, expected ${count} found ${l}`,\n\t\t\t\targs.entries[count]\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assert arguments entry count range.\n\t *\n\t * @param args Arguments node.\n\t * @param min Expected min.\n\t * @param max Expected max.\n\t */\n\tprotected _assembleAssertArgumentCountRange(\n\t\targs: ASTNodeArguments,\n\t\tmin: number,\n\t\tmax: number\n\t) {\n\t\tconst l = args.entries.length;\n\t\tif (l < min) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Too few arguments, expected ${min}-${max} found ${l}`,\n\t\t\t\targs\n\t\t\t);\n\t\t}\n\t\telse if (l > max) {\n\t\t\tthrow new ExceptionASTNode(\n\t\t\t\t`Unexpected argument, expected ${min}-${max} found ${l}`,\n\t\t\t\targs.entries[max]\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Assert an empty list of instructions.\n\t *\n\t * @param asts Instructions list.\n\t */\n\tprotected _assembleAssertNoInstructions(\n\t\tasts: ASTNodeStatementInstruction[]\n\t) {\n\t\tif (!asts.length) {\n\t\t\treturn;\n\t\t}\n\t\tthrow new ExceptionASTNode(\n\t\t\t'Unexpected instruction',\n\t\t\tasts[0]\n\t\t);\n\t}\n\n\t/**\n\t * Assert an empty list of blocks.\n\t *\n\t * @param asts Blocks list.\n\t */\n\tprotected _assembleAssertNoBlocks(\n\t\tasts: ASTNodeStatementBlock[]\n\t) {\n\t\tif (!asts.length) {\n\t\t\treturn;\n\t\t}\n\t\tthrow new ExceptionASTNode(\n\t\t\t'Unexpected block',\n\t\t\tasts[0]\n\t\t);\n\t}\n\n\t/**\n\t * Convert argument to symbol, adding new if needed.\n\t *\n\t * @param ast Arg node.\n\t * @param symbolToIndex Get symbol or add.\n\t * @returns Decoded symbol.\n\t */\n\tprotected _assembleConvertArgumentToSymbol(\n\t\tast: ASTNodeArgument,\n\t\tsymbolToIndex: SymbolToIndex\n\t) {\n\t\tconst argString = typed.cast(ast, ASTNodeArgumentString);\n\t\tif (argString) {\n\t\t\tconst str = this._assembleDecodeArgument(\n\t\t\t\tnew PrimitiveStringP8N(),\n\t\t\t\targString\n\t\t\t);\n\t\t\treturn symbolToIndex(str);\n\t\t}\n\t\treturn this._assembleDecodeArgument(new PrimitiveInt16U(), ast);\n\t}\n\n\t/**\n\t * Symbol index getter, adding if necessary.\n\t *\n\t * @param osi OSI instance.\n\t * @returns Getter function.\n\t */\n\tprotected _assembleSymbolToIndex(osi: OSI): SymbolToIndex {\n\t\t// Map existing symbol strings to indexes.\n\t\tconst symbolMap = new Map<string, PrimitiveInt16U>();\n\t\tconst symbolList = osi.header.symbolTable.entries;\n\t\tfor (let i = 0; i < symbolList.length; i++) {\n\t\t\tconst symbol = symbolList[i];\n\t\t\tsymbolMap.set(symbol.value, new PrimitiveInt16U(i));\n\t\t}\n\n\t\t// Function to get or add an existing symbol.\n\t\treturn s => {\n\t\t\tlet index = symbolMap.get(s.value);\n\t\t\tif (!index) {\n\t\t\t\tindex = new PrimitiveInt16U(symbolList.length);\n\t\t\t\tsymbolMap.set(s.value, index);\n\t\t\t\tsymbolList.push(s);\n\t\t\t}\n\t\t\treturn index;\n\t\t};\n\t}\n}\n"],"file":"class.mjs","sourceRoot":"../../../src"}