Fixed bug with globals and hoisted global declarations
This commit is contained in:
parent
3e9b84fb4f
commit
a7899e8473
|
@ -822,9 +822,13 @@ proc dispatch*(self: var PeonVM) =
|
||||||
# not a great idea)
|
# not a great idea)
|
||||||
self.pushc(self.pop())
|
self.pushc(self.pop())
|
||||||
of LoadVar:
|
of LoadVar:
|
||||||
# Pushes a variable from the call stack
|
# Pushes a local variable from the call stack
|
||||||
# onto the operand stack
|
# onto the operand stack
|
||||||
self.push(self.getc(self.readLong().int))
|
self.push(self.getc(self.readLong().int))
|
||||||
|
of LoadGlobal:
|
||||||
|
# Pushes a global variable from the call stack
|
||||||
|
# onto the operand stack
|
||||||
|
self.push(self.calls[self.readLong().int])
|
||||||
of NoOp:
|
of NoOp:
|
||||||
# Does nothing
|
# Does nothing
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -189,7 +189,8 @@ type
|
||||||
SysClock64, # Pushes the output of a monotonic clock on the stack
|
SysClock64, # Pushes the output of a monotonic clock on the stack
|
||||||
LoadTOS, # Pushes the top of the call stack onto the operand stack
|
LoadTOS, # Pushes the top of the call stack onto the operand stack
|
||||||
DupTop, # Duplicates the top of the operand stack onto the operand stack
|
DupTop, # Duplicates the top of the operand stack onto the operand stack
|
||||||
ReplExit # Exits the VM immediately, leaving its state intact. Used in the REPL
|
ReplExit, # Exits the VM immediately, leaving its state intact. Used in the REPL
|
||||||
|
LoadGlobal # Loads a global variable
|
||||||
|
|
||||||
|
|
||||||
# We group instructions by their operation/operand types for easier handling when debugging
|
# We group instructions by their operation/operand types for easier handling when debugging
|
||||||
|
@ -282,7 +283,7 @@ const constantInstructions* = {LoadInt64, LoadUInt64,
|
||||||
|
|
||||||
# Stack triple instructions operate on the stack at arbitrary offsets and pop arguments off of it in the form
|
# Stack triple instructions operate on the stack at arbitrary offsets and pop arguments off of it in the form
|
||||||
# of 24 bit integers
|
# of 24 bit integers
|
||||||
const stackTripleInstructions* = {StoreVar, LoadVar, }
|
const stackTripleInstructions* = {StoreVar, LoadVar, LoadGlobal}
|
||||||
|
|
||||||
# Stack double instructions operate on the stack at arbitrary offsets and pop arguments off of it in the form
|
# Stack double instructions operate on the stack at arbitrary offsets and pop arguments off of it in the form
|
||||||
# of 16 bit integers
|
# of 16 bit integers
|
||||||
|
|
|
@ -95,7 +95,7 @@ proc compile*(self: BytecodeCompiler, ast: seq[Declaration], file: string, lines
|
||||||
mode: CompileMode = Debug): Chunk
|
mode: CompileMode = Debug): Chunk
|
||||||
proc statement(self: BytecodeCompiler, node: Statement)
|
proc statement(self: BytecodeCompiler, node: Statement)
|
||||||
proc declaration(self: BytecodeCompiler, node: Declaration)
|
proc declaration(self: BytecodeCompiler, node: Declaration)
|
||||||
proc varDecl(self: BytecodeCompiler, node: VarDecl)
|
proc varDecl(self: BytecodeCompiler, node: VarDecl, hoist: bool = false)
|
||||||
proc specialize(self: BytecodeCompiler, typ: Type, args: seq[Expression]): Type {.discardable.}
|
proc specialize(self: BytecodeCompiler, typ: Type, args: seq[Expression]): Type {.discardable.}
|
||||||
proc patchReturnAddress(self: BytecodeCompiler, pos: int)
|
proc patchReturnAddress(self: BytecodeCompiler, pos: int)
|
||||||
proc handleMagicPragma(self: BytecodeCompiler, pragma: Pragma, name: Name)
|
proc handleMagicPragma(self: BytecodeCompiler, pragma: Pragma, name: Name)
|
||||||
|
@ -1233,10 +1233,14 @@ method identifier(self: BytecodeCompiler, node: IdentExpr, name: Name = nil, com
|
||||||
if not s.belongsTo.isNil() and s.belongsTo.valueType.fun.kind == funDecl and FunDecl(s.belongsTo.valueType.fun).isTemplate:
|
if not s.belongsTo.isNil() and s.belongsTo.valueType.fun.kind == funDecl and FunDecl(s.belongsTo.valueType.fun).isTemplate:
|
||||||
discard
|
discard
|
||||||
else:
|
else:
|
||||||
# Loads a regular variable from the current frame
|
if s.depth > 0:
|
||||||
self.emitByte(LoadVar, s.ident.token.line)
|
# Loads a regular variable from the current frame
|
||||||
# No need to check for -1 here: we already did a nil check above!
|
self.emitByte(LoadVar, 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)
|
||||||
|
else:
|
||||||
|
self.emitByte(LoadGlobal, s.ident.token.line)
|
||||||
|
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.} =
|
||||||
|
@ -1860,8 +1864,10 @@ proc statement(self: BytecodeCompiler, node: Statement) =
|
||||||
self.expression(Expression(node))
|
self.expression(Expression(node))
|
||||||
|
|
||||||
|
|
||||||
proc varDecl(self: BytecodeCompiler, node: VarDecl) =
|
proc varDecl(self: BytecodeCompiler, node: VarDecl, hoist: bool = false) =
|
||||||
## Compiles variable declarations
|
## Compiles variable declarations
|
||||||
|
if node.name.depth == 0 and not hoist:
|
||||||
|
return
|
||||||
var typ: Type
|
var typ: Type
|
||||||
# Our parser guarantees that the variable declaration
|
# Our parser guarantees that the variable declaration
|
||||||
# will have a type declaration or a value (or both)
|
# will have a type declaration or a value (or both)
|
||||||
|
@ -2071,6 +2077,11 @@ proc compile*(self: BytecodeCompiler, ast: seq[Declaration], file: string, lines
|
||||||
if not incremental:
|
if not incremental:
|
||||||
self.jumps = @[]
|
self.jumps = @[]
|
||||||
let pos = self.beginProgram()
|
let pos = self.beginProgram()
|
||||||
|
let idx = self.stackIndex
|
||||||
|
for node in ast:
|
||||||
|
if node.kind == varDecl and VarDecl(node).name.depth == 0:
|
||||||
|
self.varDecl(VarDecl(node), hoist=true)
|
||||||
|
self.stackIndex = idx
|
||||||
while not self.done():
|
while not self.done():
|
||||||
self.declaration(Declaration(self.step()))
|
self.declaration(Declaration(self.step()))
|
||||||
self.terminateProgram(pos)
|
self.terminateProgram(pos)
|
||||||
|
|
Loading…
Reference in New Issue