WIP for importing the same module multiple times and other failed fixes
This commit is contained in:
parent
13b432b2d2
commit
3636c74a6a
|
@ -1659,7 +1659,7 @@ proc importStmt(self: Compiler, node: ImportStmt) =
|
||||||
except IOError:
|
except IOError:
|
||||||
self.error(&"""could not import '{filename}': {getCurrentExceptionMsg()}""")
|
self.error(&"""could not import '{filename}': {getCurrentExceptionMsg()}""")
|
||||||
except OSError:
|
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) =
|
proc statement(self: Compiler, node: Statement) =
|
||||||
|
@ -1987,7 +1987,6 @@ proc beginProgram(self: Compiler, incremental: bool = false): int =
|
||||||
self.emitByte(LoadFunction)
|
self.emitByte(LoadFunction)
|
||||||
self.emitBytes(main.codePos.toTriple())
|
self.emitBytes(main.codePos.toTriple())
|
||||||
self.emitByte(LoadReturnAddress)
|
self.emitByte(LoadReturnAddress)
|
||||||
# result = self.chunk.code.len()
|
|
||||||
self.emitBytes(0.toQuad())
|
self.emitBytes(0.toQuad())
|
||||||
self.emitByte(Call)
|
self.emitByte(Call)
|
||||||
self.emitBytes(0.toTriple())
|
self.emitBytes(0.toTriple())
|
||||||
|
@ -2014,7 +2013,7 @@ proc compile*(self: Compiler, ast: seq[Declaration], file: string, lines: seq[tu
|
||||||
self.frames = @[0]
|
self.frames = @[0]
|
||||||
self.lines = lines
|
self.lines = lines
|
||||||
self.source = source
|
self.source = source
|
||||||
let pos = self.beginProgram(incremental=incremental)
|
let pos = self.beginProgram(incremental)
|
||||||
if incremental:
|
if incremental:
|
||||||
for i in countup(1, 2):
|
for i in countup(1, 2):
|
||||||
discard self.chunk.code.pop()
|
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) =
|
proc compileModule(self: Compiler, filename: string) =
|
||||||
## Compiles an imported module into an existing chunk.
|
## Compiles an imported module into an existing chunk.
|
||||||
## A temporary compiler object is initialized internally
|
## 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 lexer = newLexer()
|
||||||
var parser = newParser()
|
var parser = newParser()
|
||||||
var compiler = newCompiler()
|
var compiler = newCompiler()
|
||||||
|
@ -2034,7 +2036,8 @@ proc compileModule(self: Compiler, filename: string) =
|
||||||
let source = readFile(joinPath(splitPath(self.file).head, filename))
|
let source = readFile(joinPath(splitPath(self.file).head, filename))
|
||||||
let tokens = lexer.lex(source, filename)
|
let tokens = lexer.lex(source, filename)
|
||||||
let ast = parser.parse(tokens, filename, lexer.getLines(), source)
|
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.names &= compiler.names
|
||||||
self.closedOver &= compiler.closedOver
|
self.closedOver &= compiler.closedOver
|
||||||
compiler.endScope()
|
compiler.endScope()
|
|
@ -11,6 +11,6 @@ fn fib(n: int): int {
|
||||||
|
|
||||||
print("Computing the value of fib(25)");
|
print("Computing the value of fib(25)");
|
||||||
var x = clock();
|
var x = clock();
|
||||||
print(fib(25));
|
# print(fib(25));
|
||||||
print(clock() - x);
|
print(clock() - x);
|
||||||
print("Done!");
|
print("Done!");
|
||||||
|
|
Loading…
Reference in New Issue