From 3636c74a6a5a47cbaeec3f610ada76f346818637 Mon Sep 17 00:00:00 2001 From: Mattia Giambirtone Date: Tue, 16 Aug 2022 13:11:09 +0200 Subject: [PATCH] WIP for importing the same module multiple times and other failed fixes --- src/frontend/compiler.nim | 11 +++++++---- tests/fib.pn | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/frontend/compiler.nim b/src/frontend/compiler.nim index 67b8454..a1800d4 100644 --- a/src/frontend/compiler.nim +++ b/src/frontend/compiler.nim @@ -1659,7 +1659,7 @@ proc importStmt(self: Compiler, node: ImportStmt) = except IOError: self.error(&"""could not import '{filename}': {getCurrentExceptionMsg()}""") except OSError: - self.error(&"""could not import '{filename}': {getCurrentExceptionMsg()} [errno {osLastError()}]""") + self.error(&"""could not import '{filename}': {getCurrentExceptionMsg()} [errno {osLastError()}]""") proc statement(self: Compiler, node: Statement) = @@ -1987,7 +1987,6 @@ proc beginProgram(self: Compiler, incremental: bool = false): int = self.emitByte(LoadFunction) self.emitBytes(main.codePos.toTriple()) self.emitByte(LoadReturnAddress) - # result = self.chunk.code.len() self.emitBytes(0.toQuad()) self.emitByte(Call) self.emitBytes(0.toTriple()) @@ -2014,7 +2013,7 @@ proc compile*(self: Compiler, ast: seq[Declaration], file: string, lines: seq[tu self.frames = @[0] self.lines = lines self.source = source - let pos = self.beginProgram(incremental=incremental) + let pos = self.beginProgram(incremental) if incremental: for i in countup(1, 2): discard self.chunk.code.pop() @@ -2027,6 +2026,9 @@ proc compile*(self: Compiler, ast: seq[Declaration], file: string, lines: seq[tu proc compileModule(self: Compiler, filename: string) = ## Compiles an imported module into an existing chunk. ## A temporary compiler object is initialized internally + let path = joinPath(splitPath(self.file).head, filename) + if self.modules.containsOrIncl(path): + return var lexer = newLexer() var parser = newParser() var compiler = newCompiler() @@ -2034,7 +2036,8 @@ proc compileModule(self: Compiler, filename: string) = let source = readFile(joinPath(splitPath(self.file).head, filename)) let tokens = lexer.lex(source, filename) let ast = parser.parse(tokens, filename, lexer.getLines(), source) - discard compiler.compile(ast, filename, lexer.getLines(), source, terminateScope=false) + compiler.names.add(self.names[0]) + discard compiler.compile(ast, filename, lexer.getLines(), source, chunk=self.chunk, incremental=true) self.names &= compiler.names self.closedOver &= compiler.closedOver compiler.endScope() \ No newline at end of file diff --git a/tests/fib.pn b/tests/fib.pn index 77e466d..25d5d8d 100644 --- a/tests/fib.pn +++ b/tests/fib.pn @@ -11,6 +11,6 @@ fn fib(n: int): int { print("Computing the value of fib(25)"); var x = clock(); -print(fib(25)); +# print(fib(25)); print(clock() - x); print("Done!");