Ensuring calls are gcsafe (still not working)
@@ -33,9 +33,11 @@ stdlib,
min_global, niftylogger -var NIMOPTIONS* = "" -var MINMODULES* = newSeq[string](0) -var MMM*: MinModuleManager +var NIMOPTIONS* {.threadvar.}: string +NIMOPTIONS = "" +var MINMODULES* {.threadvar.}: seq[string] +MINMODULES = newSeq[string](0) +var MMM* {.threadvar.}: MinModuleManager if logging.getHandlers().len == 0: newNiftyLogger().addHandler()
@@ -2,7 +2,7 @@ import
std/os, minline -var HOME*: string +var HOME* {.threadvar.}: string if defined(windows): HOME = getenv("USERPROFILE") if not defined(windows):
@@ -152,7 +152,7 @@
proc close*(i: In) = i.parser.close(); -proc push*(i: In, val: MinValue) +proc push*(i: In, val: MinValue) {.gcsafe} proc call*(i: In, q: var MinValue): MinValue = var i2 = newMinInterpreter("<call>")@@ -192,7 +192,7 @@ if not val.obj.isNil:
v.obj = val.obj return v -proc apply*(i: In, op: MinOperator, sym = "") {.effectsOf: op.} = +proc apply*(i: In, op: MinOperator, sym = "") {.gcsafe, effectsOf: op.} = if op.kind == minProcOp: if not op.mdl.isNil and not op.mdl.scope.isNil and not i.scope.hasParent op.mdl.scope: # Capture closures at module level@@ -265,7 +265,7 @@ column: i.currSym.column,
outerSym: i.currSym.symVal, docComment: i.currSym.docComment) -proc push*(i: In, val: MinValue) = +proc push*(i: In, val: MinValue) {.gcsafe} = if val.kind == minSymbol: i.debug(val) if not i.evaluating:
@@ -106,7 +106,7 @@ parent*: ref MinScope
symbols*: CritBitTree[MinOperator] sigils*: CritBitTree[MinOperator] kind*: MinScopeKind - MinOperatorProc* = proc (i: In) {.closure.} + MinOperatorProc* = proc (i: In) {.gcsafe, closure.} MinOperatorKind* = enum minProcOp minValOp@@ -705,8 +705,7 @@ d = d & ";" & a.objType
d = d.strip & "}" return d -proc setSymbol*(scope: ref MinScope, key: string, value: MinOperator, - override = false, define = false): bool {.discardable.} +proc setSymbol*(scope: ref MinScope, key: string, value: MinOperator, override = false, define = false): bool {.discardable, gcsafe.} proc parseMinValue*(p: var MinParser, i: In): MinValue = case p.token@@ -1015,8 +1014,7 @@ return d.val.qVal[0]
elif d.kind == minValOp and d.val.kind == minDictionary: return d.val -proc getSymbolFromPath(scope: ref MinScope, keys: var seq[ - string]): MinOperator +proc getSymbolFromPath(scope: ref MinScope, keys: var seq[string]): MinOperator {.gcsafe.} proc isNull*(op: MinOperator): bool = return op.kind == minValOp and op.val.kind == minNull@@ -1024,7 +1022,7 @@
proc isUnknown*(op: MinOperator): bool = return op.kind == minValOp and op.val.kind == minUnknown -proc getSymbol*(scope: ref MinScope, key: string): MinOperator = +proc getSymbol*(scope: ref MinScope, key: string): MinOperator {.gcsafe} = debug "getSymbol: $#" % [key] if scope.symbols.hasKey(key): return scope.symbols[key]@@ -1037,7 +1035,7 @@ debug("Unable to retrieve symbol '$1' (not found)." % key)
return MinOperator(kind: minValOp, val: MinValue(kind: minUnknown)) return scope.parent.getSymbol(key) -proc getSymbolFromPath(scope: ref MinScope, keys: var seq[string]): MinOperator = +proc getSymbolFromPath(scope: ref MinScope, keys: var seq[string]): MinOperator {.gcsafe} = let sym = keys[0] keys.delete(0) let d = scope.getSymbol(sym)@@ -1051,9 +1049,9 @@ else:
debug("Symbol '$1' is not a dictionary." % sym) return MinOperator(kind: minValOp, val: MinValue(kind: minNull)) -proc delSymbolFromPath(scope: ref MinScope, keys: var seq[string]): bool +proc delSymbolFromPath(scope: ref MinScope, keys: var seq[string]): bool {.gcsafe.} -proc delSymbol*(scope: ref MinScope, key: string): bool {.discardable.} = +proc delSymbol*(scope: ref MinScope, key: string): bool {.discardable, gcsafe.} = if scope.symbols.hasKey(key): if scope.symbols[key].sealed: raiseInvalid("Symbol '$1' is sealed." % key)@@ -1064,8 +1062,7 @@ var keys = key.split(".")
return delSymbolFromPath(scope, keys) return false -proc delSymbolFromPath(scope: ref MinScope, keys: var seq[ - string]): bool = +proc delSymbolFromPath(scope: ref MinScope, keys: var seq[string]): bool {.gcsafe.} = let sym = keys[0] keys.delete(0) let d = scope.getSymbol(sym)@@ -1078,12 +1075,9 @@ return dict.scope.delSymbol(keys[0])
else: raiseInvalid("Symbol '$1' is not a dictionary." % sym) -proc setSymbolFromPath(scope: ref MinScope, keys: var seq[ - string], value: MinOperator, override = false, - define = false): bool {.discardable.} +proc setSymbolFromPath(scope: ref MinScope, keys: var seq[string], value: MinOperator, override = false, define = false): bool {.discardable, gcsafe.} -proc setSymbol*(scope: ref MinScope, key: string, value: MinOperator, - override = false, define = false): bool {.discardable.} = +proc setSymbol*(scope: ref MinScope, key: string, value: MinOperator, override = false, define = false): bool {.discardable, gcsafe.} = result = false # check if a symbol already exists in current scope debug "setSymbol: $#" % [key]@@ -1108,9 +1102,7 @@ result = scope.parent.setSymbol(key, value, override, define)
else: debug "setSymbol: failure to set: $# = $#" % [key, $value] -proc setSymbolFromPath(scope: ref MinScope, keys: var seq[ - string], value: MinOperator, override = false, - define = false): bool {.discardable.} = +proc setSymbolFromPath(scope: ref MinScope, keys: var seq[string], value: MinOperator, override = false, define = false): bool {.discardable, gcsafe.} = let sym = keys[0] keys.delete(0) let d = scope.getSymbol(sym)@@ -1142,7 +1134,7 @@ return scope.parent.hasSigil(key)
else: return false -proc delSigil*(scope: ref MinScope, key: string): bool {.discardable.} = +proc delSigil*(scope: ref MinScope, key: string): bool {.discardable, gcsafe.} = if scope.sigils.hasKey(key): if scope.sigils[key].sealed: raiseInvalid("Sigil '$1' is sealed." % key)
@@ -179,10 +179,10 @@ return res.newVal
# Validators -proc validate*(i: In, value: MinValue, t: string, generics: var CritBitTree[string]): bool +proc validate*(i: In, value: MinValue, t: string, generics: var CritBitTree[string]): bool {.gcsafe.} -proc validateValueType*(i: var MinInterpreter, element: string, value: MinValue, - generics: var CritBitTree[string], vTypes: var seq[string], c: int): bool = +proc validateValueType*(i: var MinInterpreter, element: string, value: MinValue, + generics: var CritBitTree[string], vTypes: var seq[string], c: int): bool {.gcsafe.}= vTypes.add value.typeName let ors = element.split("|") for to in ors:@@ -207,14 +207,13 @@ if andr:
result = true break -proc validateValueType*(i: var MinInterpreter, element: string, - value: MinValue): bool = +proc validateValueType*(i: var MinInterpreter, element: string, value: MinValue): bool {.gcsafe.} = var g: CritBitTree[string] var s = newSeq[string](0) var c = 0 return i.validateValueType(element, value, g, s, c) -proc basicValidate*(i: In, value: MinValue, t: string): bool = +proc basicValidate*(i: In, value: MinValue, t: string): bool {.gcsafe.} = case t: of "bool": return value.isBool@@ -269,8 +268,7 @@ return res.boolVal
else: raiseInvalid("Unknown type '$#'" % t) -proc validate*(i: In, value: MinValue, t: string, generics: var CritBitTree[ - string]): bool = +proc validate*(i: In, value: MinValue, t: string, generics: var CritBitTree[string]): bool {.gcsafe.}= if generics.hasKey(t): let ts = generics[t].split("|") for tp in ts:
@@ -74,7 +74,7 @@
const HELPFILE = "../../help.json".slurp let HELP = HELPFILE.parseJson - def.symbol("from-json") do (i: In): + def.symbol("from-json") do (i: In) {.gcsafe.}: let vals = i.expect("str") let s = vals[0] i.push i.fromJson(s.getString.parseJson)@@ -1772,7 +1772,7 @@ let q = vals[0]
let reg = re(vals[1].strVal) let s_find = vals[2].strVal var i2 = i.copy(i.filename) - let repFn = proc(match: RegexMatch): string {.closure.} = + let repFn = proc(match: RegexMatch): string {.closure, gcsafe.} = var ss = newSeq[MinValue](0) ss.add match.match.newVal for s in match.captures: