Fixed bugs with globals and added related test
This commit is contained in:
parent
bc0f614143
commit
86231291c4
|
@ -900,9 +900,6 @@ proc prepareAutoFunction(self: BytecodeCompiler, fn: Name, args: seq[tuple[name:
|
||||||
## by declaring a concrete version of it along
|
## by declaring a concrete version of it along
|
||||||
## with its arguments
|
## with its arguments
|
||||||
|
|
||||||
# First we declare the function's generics, if it has any.
|
|
||||||
# This is because the function's return type may in itself
|
|
||||||
# be a generic, so it needs to exist first
|
|
||||||
let idx = self.stackIndex
|
let idx = self.stackIndex
|
||||||
self.stackIndex = 1
|
self.stackIndex = 1
|
||||||
var default: Expression
|
var default: Expression
|
||||||
|
@ -1244,11 +1241,12 @@ method identifier(self: BytecodeCompiler, node: IdentExpr, name: Name = nil, com
|
||||||
if s.depth > 0:
|
if s.depth > 0:
|
||||||
# Loads a regular variable from the current frame
|
# Loads a regular variable from the current frame
|
||||||
self.emitByte(LoadVar, s.ident.token.line)
|
self.emitByte(LoadVar, s.ident.token.line)
|
||||||
# No need to check for -1 here: we already did a nil check above!
|
|
||||||
self.emitBytes(s.position.toTriple(), s.ident.token.line)
|
|
||||||
else:
|
else:
|
||||||
|
# Loads a global variable from an absolute stack
|
||||||
|
# position
|
||||||
self.emitByte(LoadGlobal, s.ident.token.line)
|
self.emitByte(LoadGlobal, s.ident.token.line)
|
||||||
self.emitBytes(s.position.toTriple(), s.ident.token.line)
|
# No need to check for -1 here: we already did a nil check above!
|
||||||
|
self.emitBytes(s.position.toTriple(), s.ident.token.line)
|
||||||
|
|
||||||
|
|
||||||
method assignment(self: BytecodeCompiler, node: ASTNode, compile: bool = true): Type {.discardable.} =
|
method assignment(self: BytecodeCompiler, node: ASTNode, compile: bool = true): Type {.discardable.} =
|
||||||
|
@ -1946,12 +1944,11 @@ proc funDecl(self: BytecodeCompiler, node: FunDecl, name: Name) =
|
||||||
# the end of the module
|
# the end of the module
|
||||||
self.forwarded.add((name, 0))
|
self.forwarded.add((name, 0))
|
||||||
name.valueType.forwarded = true
|
name.valueType.forwarded = true
|
||||||
self.currentFunction = function
|
return
|
||||||
|
if name.isBuiltin:
|
||||||
|
# Builtins are handled at call time
|
||||||
return
|
return
|
||||||
self.currentFunction = name
|
self.currentFunction = name
|
||||||
if self.currentFunction.isBuiltin:
|
|
||||||
self.currentFunction = function
|
|
||||||
return
|
|
||||||
let stackIdx = self.stackIndex
|
let stackIdx = self.stackIndex
|
||||||
self.stackIndex = name.position
|
self.stackIndex = name.position
|
||||||
if not node.isTemplate:
|
if not node.isTemplate:
|
||||||
|
@ -2090,7 +2087,8 @@ proc compile*(self: BytecodeCompiler, ast: seq[Declaration], file: string, lines
|
||||||
else:
|
else:
|
||||||
self.ast = ast
|
self.ast = ast
|
||||||
self.current = 0
|
self.current = 0
|
||||||
self.stackIndex = 1
|
if not incremental:
|
||||||
|
self.stackIndex = 1
|
||||||
self.lines = lines
|
self.lines = lines
|
||||||
self.source = source
|
self.source = source
|
||||||
self.isMainModule = isMainModule
|
self.isMainModule = isMainModule
|
||||||
|
|
|
@ -10,8 +10,8 @@ fn fib(n: int): int {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
print("Computing the value of fib(37)");
|
print("Computing the value of fib(35)");
|
||||||
var x = time.clock();
|
var x = time.clock();
|
||||||
print(fib(37));
|
print(fib(35));
|
||||||
print(time.clock() - x);
|
print(time.clock() - x);
|
||||||
print("Done!");
|
print("Done!");
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
import std;
|
||||||
|
# Seemingly unnecessary, but importing modules
|
||||||
|
# changes the internal stack index in the compiler
|
||||||
|
# so we need to test for that as well
|
||||||
|
import time;
|
||||||
|
|
||||||
|
|
||||||
|
var x = 69420;
|
||||||
|
print(x == 69420);
|
||||||
|
print(testGlobals());
|
Loading…
Reference in New Issue