The Lambda Lab
/
projects
/
forth.jl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improved error reporting.
[forth.jl.git]
/
src
/
forth.jl
diff --git
a/src/forth.jl
b/src/forth.jl
index
01b39a2
..
3882a53
100644
(file)
--- a/
src/forth.jl
+++ b/
src/forth.jl
@@
-1,6
+1,6
@@
module forth
module forth
-import Base.REPLCompletions
+import Base.REPLCompletions
, Base.invokelatest
# VM mem size
size_mem = 1000000 # 1 mega-int
# VM mem size
size_mem = 1000000 # 1 mega-int
@@
-123,7
+123,7
@@
function callPrim(addr::Int64)
if addr >=0 || -addr>length(primitives)
error("Attempted to execute non-existent primitive at address $addr.")
else
if addr >=0 || -addr>length(primitives)
error("Attempted to execute non-existent primitive at address $addr.")
else
-
primitives[-addr](
)
+
invokelatest(primitives[-addr]
)
end
end
getPrimName(addr::Int64) = primNames[-addr]
end
end
getPrimName(addr::Int64) = primNames[-addr]
@@
-501,7
+501,7
@@
end)
XOR_CFA = defPrimWord("XOR", () -> begin
b = popPS()
a = popPS()
XOR_CFA = defPrimWord("XOR", () -> begin
b = popPS()
a = popPS()
- pushPS(
a $ b
)
+ pushPS(
xor(a, b)
)
return NEXT
end)
return NEXT
end)
@@
-677,8
+677,12
@@
READ_LINE_CFA = defPrimWord("READ-LINE", () -> begin
maxSize = popPS()
addr = popPS()
maxSize = popPS()
addr = popPS()
+ if !(fid in keys(openFiles))
+ error(string("Invalid FID ", fid, "."))
+ end
+
fh = openFiles[fid]
fh = openFiles[fid]
- line = readline(fh)
+ line = readline(fh
, chomp=false
)
eofFlag = endswith(line, '\n') ? 0 : -1
line = chomp(line)
eofFlag = endswith(line, '\n') ? 0 : -1
line = chomp(line)
@@
-1127,7
+1131,7
@@
end, flags=F_IMMED)
HIDDEN_CFA = defPrimWord("HIDDEN", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
HIDDEN_CFA = defPrimWord("HIDDEN", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
- mem[lenAndFlagsAddr] =
mem[lenAndFlagsAddr] $ F_HIDDEN
+ mem[lenAndFlagsAddr] =
xor(mem[lenAndFlagsAddr], F_HIDDEN)
return NEXT
end)
return NEXT
end)
@@
-1147,7
+1151,7
@@
SEMICOLON_CFA = defWord(";",
IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
IMMEDIATE_CFA = defPrimWord("IMMEDIATE", () -> begin
lenAndFlagsAddr = mem[mem[CURRENT]+1] + 1
- mem[lenAndFlagsAddr] =
mem[lenAndFlagsAddr] $ F_IMMED
+ mem[lenAndFlagsAddr] =
xor(mem[lenAndFlagsAddr], F_IMMED)
return NEXT
end, flags=F_IMMED)
return NEXT
end, flags=F_IMMED)
@@
-1336,6
+1340,7
@@
function run(fileName=nothing; initialize=true)
jmp = callPrim(jmp)
catch ex
jmp = callPrim(jmp)
catch ex
+ println(string("Error in primitive '", getPrimName(jmp), "' at address ", jmp))
showerror(STDOUT, ex)
println()
showerror(STDOUT, ex)
println()