Made function jumps absolute
This commit is contained in:
parent
620c56237a
commit
ffee77b6fc
|
@ -271,7 +271,6 @@ proc patchJump(self: Compiler, offset: int) =
|
||||||
if jump > 16777215:
|
if jump > 16777215:
|
||||||
self.error("cannot jump more than 16777216 bytecode instructions")
|
self.error("cannot jump more than 16777216 bytecode instructions")
|
||||||
if jump < uint16.high().int:
|
if jump < uint16.high().int:
|
||||||
jump -= 3
|
|
||||||
case OpCode(self.chunk.code[offset]):
|
case OpCode(self.chunk.code[offset]):
|
||||||
of LongJumpForwards:
|
of LongJumpForwards:
|
||||||
self.chunk.code[offset] = JumpForwards.uint8()
|
self.chunk.code[offset] = JumpForwards.uint8()
|
||||||
|
@ -290,7 +289,6 @@ proc patchJump(self: Compiler, offset: int) =
|
||||||
self.chunk.code[offset + 1] = offsetArray[0]
|
self.chunk.code[offset + 1] = offsetArray[0]
|
||||||
self.chunk.code[offset + 2] = offsetArray[1]
|
self.chunk.code[offset + 2] = offsetArray[1]
|
||||||
else:
|
else:
|
||||||
jump -= 4
|
|
||||||
case OpCode(self.chunk.code[offset]):
|
case OpCode(self.chunk.code[offset]):
|
||||||
of JumpForwards:
|
of JumpForwards:
|
||||||
self.chunk.code[offset] = LongJumpForwards.uint8()
|
self.chunk.code[offset] = LongJumpForwards.uint8()
|
||||||
|
@ -773,7 +771,7 @@ proc declareName(self: Compiler, node: Declaration) =
|
||||||
isLet: false))
|
isLet: false))
|
||||||
self.names[^1].valueType = self.inferType(argument.valueType)
|
self.names[^1].valueType = self.inferType(argument.valueType)
|
||||||
self.names[^1].valueType.node = argument.name
|
self.names[^1].valueType.node = argument.name
|
||||||
self.emitByte(StoreVar)
|
self.emitByte(LoadVar)
|
||||||
self.emitBytes(self.names.high().toTriple())
|
self.emitBytes(self.names.high().toTriple())
|
||||||
else:
|
else:
|
||||||
discard # Unreachable
|
discard # Unreachable
|
||||||
|
@ -1181,6 +1179,10 @@ proc varDecl(self: Compiler, node: VarDecl) =
|
||||||
|
|
||||||
proc funDecl(self: Compiler, node: FunDecl) =
|
proc funDecl(self: Compiler, node: FunDecl) =
|
||||||
## Compiles function declarations
|
## Compiles function declarations
|
||||||
|
|
||||||
|
# A function's code is just compiled linearly
|
||||||
|
# and then jumped over
|
||||||
|
let jmp = self.emitJump(Jump)
|
||||||
self.declareName(node)
|
self.declareName(node)
|
||||||
if node.body != nil:
|
if node.body != nil:
|
||||||
if BlockStmt(node.body).code.len() == 0:
|
if BlockStmt(node.body).code.len() == 0:
|
||||||
|
@ -1199,9 +1201,6 @@ proc funDecl(self: Compiler, node: FunDecl) =
|
||||||
# We store the current function
|
# We store the current function
|
||||||
var function = self.currentFunction
|
var function = self.currentFunction
|
||||||
self.currentFunction = node
|
self.currentFunction = node
|
||||||
# A function's code is just compiled linearly
|
|
||||||
# and then jumped over
|
|
||||||
let jmp = self.emitJump(JumpForwards)
|
|
||||||
|
|
||||||
# Since the deferred array is a linear
|
# Since the deferred array is a linear
|
||||||
# sequence of instructions and we want
|
# sequence of instructions and we want
|
||||||
|
|
|
@ -159,7 +159,7 @@ const stackDoubleInstructions* = {}
|
||||||
const argumentDoubleInstructions* = {PopN, }
|
const argumentDoubleInstructions* = {PopN, }
|
||||||
|
|
||||||
# Jump instructions jump at relative or absolute bytecode offsets
|
# Jump instructions jump at relative or absolute bytecode offsets
|
||||||
const jumpInstructions* = {JumpIfFalse, JumpIfFalsePop,
|
const jumpInstructions* = {Jump, LongJump, JumpIfFalse, JumpIfFalsePop,
|
||||||
JumpForwards, JumpBackwards,
|
JumpForwards, JumpBackwards,
|
||||||
LongJumpIfFalse, LongJumpIfFalsePop,
|
LongJumpIfFalse, LongJumpIfFalsePop,
|
||||||
LongJumpForwards, LongJumpBackwards,
|
LongJumpForwards, LongJumpBackwards,
|
||||||
|
|
|
@ -24,7 +24,7 @@ proc getLineEditor: LineEditor
|
||||||
|
|
||||||
# Handy dandy compile-time constants
|
# Handy dandy compile-time constants
|
||||||
const debugLexer = false
|
const debugLexer = false
|
||||||
const debugParser = false
|
const debugParser = true
|
||||||
const debugCompiler = true
|
const debugCompiler = true
|
||||||
const debugSerializer = false
|
const debugSerializer = false
|
||||||
const debugRuntime = false
|
const debugRuntime = false
|
||||||
|
|
Loading…
Reference in New Issue