mirror of
https://github.com/irmen/prog8.git
synced 2024-11-25 19:31:36 +00:00
%asminclude now first looks in the same folder as the module it is in
This commit is contained in:
parent
fab5e4b17f
commit
a0f0e7a034
@ -11,6 +11,7 @@ import prog8.functions.NotConstArgumentException
|
|||||||
import prog8.functions.builtinFunctionReturnType
|
import prog8.functions.builtinFunctionReturnType
|
||||||
import prog8.parser.prog8Parser
|
import prog8.parser.prog8Parser
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.nio.file.Path
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
|
|
||||||
@ -456,7 +457,8 @@ class BuiltinFunctionStatementPlaceholder(val name: String, override val positio
|
|||||||
class Module(override val name: String,
|
class Module(override val name: String,
|
||||||
override var statements: MutableList<IStatement>,
|
override var statements: MutableList<IStatement>,
|
||||||
override val position: Position,
|
override val position: Position,
|
||||||
val isLibraryModule: Boolean) : Node, INameScope {
|
val isLibraryModule: Boolean,
|
||||||
|
val importedFrom: Path) : Node, INameScope {
|
||||||
override lateinit var parent: Node
|
override lateinit var parent: Node
|
||||||
|
|
||||||
override fun linkParents(parent: Node) {
|
override fun linkParents(parent: Node) {
|
||||||
@ -1746,8 +1748,8 @@ class RepeatLoop(var body: AnonymousScope,
|
|||||||
|
|
||||||
/***************** Antlr Extension methods to create AST ****************/
|
/***************** Antlr Extension methods to create AST ****************/
|
||||||
|
|
||||||
fun prog8Parser.ModuleContext.toAst(name: String, isLibrary: Boolean) : Module =
|
fun prog8Parser.ModuleContext.toAst(name: String, isLibrary: Boolean, importedFrom: Path) : Module =
|
||||||
Module(name, modulestatement().asSequence().map { it.toAst() }.toMutableList(), toPosition(), isLibrary)
|
Module(name, modulestatement().asSequence().map { it.toAst() }.toMutableList(), toPosition(), isLibrary, importedFrom)
|
||||||
|
|
||||||
|
|
||||||
private fun ParserRuleContext.toPosition() : Position {
|
private fun ParserRuleContext.toPosition() : Position {
|
||||||
|
@ -11,6 +11,7 @@ import prog8.optimizing.same
|
|||||||
import prog8.parser.tryGetEmbeddedResource
|
import prog8.parser.tryGetEmbeddedResource
|
||||||
import prog8.stackvm.Syscall
|
import prog8.stackvm.Syscall
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.nio.file.Path
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
@ -148,7 +149,7 @@ class Compiler(private val options: CompilationOptions) {
|
|||||||
println("\nCreating stackVM code...")
|
println("\nCreating stackVM code...")
|
||||||
|
|
||||||
val namespace = module.definingScope()
|
val namespace = module.definingScope()
|
||||||
val program = IntermediateProgram(module.name, module.loadAddress, heap)
|
val program = IntermediateProgram(module.name, module.loadAddress, heap, module.importedFrom)
|
||||||
|
|
||||||
val translator = StatementTranslator(program, namespace, heap)
|
val translator = StatementTranslator(program, namespace, heap)
|
||||||
translator.process(module)
|
translator.process(module)
|
||||||
@ -224,7 +225,7 @@ private class StatementTranslator(private val prog: IntermediateProgram,
|
|||||||
is Return -> translate(stmt)
|
is Return -> translate(stmt)
|
||||||
is Directive -> {
|
is Directive -> {
|
||||||
when(stmt.directive) {
|
when(stmt.directive) {
|
||||||
"%asminclude" -> translateAsmInclude(stmt.args)
|
"%asminclude" -> translateAsmInclude(stmt.args, prog.importedFrom)
|
||||||
"%asmbinary" -> translateAsmBinary(stmt.args)
|
"%asmbinary" -> translateAsmBinary(stmt.args)
|
||||||
"%breakpoint" -> {
|
"%breakpoint" -> {
|
||||||
prog.line(stmt.position)
|
prog.line(stmt.position)
|
||||||
@ -2229,7 +2230,7 @@ private class StatementTranslator(private val prog: IntermediateProgram,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun translateAsmInclude(args: List<DirectiveArg>) {
|
private fun translateAsmInclude(args: List<DirectiveArg>, importedFrom: Path) {
|
||||||
val scopeprefix = if(args[1].str!!.isNotBlank()) "${args[1].str}\t.proc\n" else ""
|
val scopeprefix = if(args[1].str!!.isNotBlank()) "${args[1].str}\t.proc\n" else ""
|
||||||
val scopeprefixEnd = if(args[1].str!!.isNotBlank()) "\t.pend\n" else ""
|
val scopeprefixEnd = if(args[1].str!!.isNotBlank()) "\t.pend\n" else ""
|
||||||
val filename=args[0].str!!
|
val filename=args[0].str!!
|
||||||
@ -2238,15 +2239,19 @@ private class StatementTranslator(private val prog: IntermediateProgram,
|
|||||||
val resource = tryGetEmbeddedResource(filename.substring(8)) ?: throw IllegalArgumentException("library file '$filename' not found")
|
val resource = tryGetEmbeddedResource(filename.substring(8)) ?: throw IllegalArgumentException("library file '$filename' not found")
|
||||||
resource.bufferedReader().use { it.readText() }
|
resource.bufferedReader().use { it.readText() }
|
||||||
} else {
|
} else {
|
||||||
// TODO: look in directory of parent source file first
|
// first try in the same folder as where the containing file was imported from
|
||||||
File(filename).readText()
|
val sib = importedFrom.resolveSibling(filename)
|
||||||
|
if(sib.toFile().isFile)
|
||||||
|
sib.toFile().readText()
|
||||||
|
else
|
||||||
|
File(filename).readText()
|
||||||
}
|
}
|
||||||
|
|
||||||
prog.instr(Opcode.INLINE_ASSEMBLY, callLabel=scopeprefix+sourcecode+scopeprefixEnd)
|
prog.instr(Opcode.INLINE_ASSEMBLY, callLabel=scopeprefix+sourcecode+scopeprefixEnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun translateAsmBinary(args: List<DirectiveArg>) {
|
private fun translateAsmBinary(args: List<DirectiveArg>) {
|
||||||
TODO("asmbinary not implemented $args")
|
TODO("asmbinary not implemented yet $args")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ import prog8.ast.*
|
|||||||
import prog8.compiler.CompilerException
|
import prog8.compiler.CompilerException
|
||||||
import prog8.compiler.HeapValues
|
import prog8.compiler.HeapValues
|
||||||
import java.io.PrintStream
|
import java.io.PrintStream
|
||||||
|
import java.nio.file.Path
|
||||||
|
|
||||||
|
|
||||||
class IntermediateProgram(val name: String, var loadAddress: Int, val heap: HeapValues) {
|
class IntermediateProgram(val name: String, var loadAddress: Int, val heap: HeapValues, val importedFrom: Path) {
|
||||||
|
|
||||||
class ProgramBlock(val scopedname: String,
|
class ProgramBlock(val scopedname: String,
|
||||||
val shortname: String,
|
val shortname: String,
|
||||||
|
@ -42,7 +42,7 @@ fun importModule(stream: CharStream, moduleName: String, isLibrary: Boolean): Mo
|
|||||||
// tokens.commentTokens().forEach { println(it) }
|
// tokens.commentTokens().forEach { println(it) }
|
||||||
|
|
||||||
// convert to Ast
|
// convert to Ast
|
||||||
val moduleAst = parseTree.toAst(moduleName, isLibrary)
|
val moduleAst = parseTree.toAst(moduleName, isLibrary, Paths.get(stream.sourceName))
|
||||||
importedModules[moduleAst.name] = moduleAst
|
importedModules[moduleAst.name] = moduleAst
|
||||||
|
|
||||||
// process imports
|
// process imports
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
str hoi = "hoi"
|
str hoi = "hoi"
|
||||||
str hoi2 = "hoi2"
|
str hoi2 = "hoi2"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user