summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-10-16 23:37:52 -0700
committerGitHub <noreply@github.com>2021-10-17 08:37:52 +0200
commitf77dea01fd980734a3ed4acb812575827540aff9 (patch)
tree551a89d58f170d7b1fc7f8e51e6b3bf5144c15cd /compiler
parent162b07d72cbe79bad1ddf99413ba508f07a831b1 (diff)
downloadNim-f77dea01fd980734a3ed4acb812575827540aff9.tar.gz
define `nimVersion` automatically and avoid needing -d:nimVersion140 (#18726)
* define `nimVersion` and avoid needing -d:nimVersion140

* fix changelog
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ast.nim2
-rw-r--r--compiler/ccgexprs.nim4
-rw-r--r--compiler/options.nim18
3 files changed, 21 insertions, 3 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 0a3b1b72d..abd2ff01e 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -656,7 +656,7 @@ type
     mUnaryPlusI, mBitnotI,
     mUnaryPlusF64, mUnaryMinusF64,
     mCharToStr, mBoolToStr,
-    mIntToStr, mInt64ToStr, mFloatToStr, # for -d:nimVersion140
+    mIntToStr, mInt64ToStr, mFloatToStr, # for compiling nimStdlibVersion < 1.5.1 (not bootstrapping)
     mCStrToStr,
     mStrToStr, mEnumToStr,
     mAnd, mOr,
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index ac4a26bd6..fc09fefc3 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -894,7 +894,7 @@ proc genFieldCheck(p: BProc, e: PNode, obj: Rope, field: PSym) =
     let discIndex = rdSetElemLoc(p.config, v, u.t)
     if optTinyRtti in p.config.globalOptions:
       # not sure how to use `genEnumToStr` here
-      if p.config.isDefined("nimVersion140"):
+      if p.config.getStdlibVersion < (1,5,1):
         const code = "{ #raiseFieldError($1); $2} $n"
         linefmt(p, cpsStmts, code, [strLit, raiseInstr(p)])
       else:
@@ -905,7 +905,7 @@ proc genFieldCheck(p: BProc, e: PNode, obj: Rope, field: PSym) =
       let first = p.config.firstOrd(disc.sym.typ)
       let firstLit = int64Literal(cast[int](first))
       let discName = genTypeInfo(p.config, p.module, disc.sym.typ, e.info)
-      if p.config.isDefined("nimVersion140"):
+      if p.config.getStdlibVersion < (1,5,1):
         const code = "{ #raiseFieldError($1); $2} $n"
         linefmt(p, cpsStmts, code, [strLit, raiseInstr(p)])
       else:
diff --git a/compiler/options.nim b/compiler/options.nim
index eafcd816d..d3f868316 100644
--- a/compiler/options.nim
+++ b/compiler/options.nim
@@ -165,6 +165,7 @@ const
                  cmdCtags, cmdBuildindex}
 
 type
+  NimVer* = tuple[major: int, minor: int, patch: int]
   TStringSeq* = seq[string]
   TGCMode* = enum             # the selected GC
     gcUnselected = "unselected"
@@ -346,6 +347,7 @@ type
     outDir*: AbsoluteDir
     jsonBuildFile*: AbsoluteFile
     prefixDir*, libpath*, nimcacheDir*: AbsoluteDir
+    nimStdlibVersion*: NimVer
     dllOverrides, moduleOverrides*, cfileSpecificOptions*: StringTableRef
     projectName*: string # holds a name like 'nim'
     projectPath*: AbsoluteDir # holds a path like /home/alice/projects/nim/compiler/
@@ -389,6 +391,16 @@ type
     cppCustomNamespace*: string
     vmProfileData*: ProfileData
 
+proc parseNimVersion*(a: string): NimVer =
+  # could be moved somewhere reusable
+  if a.len > 0:
+    let b = a.split(".")
+    assert b.len == 3, a
+    template fn(i) = result[i] = b[i].parseInt # could be optimized if needed
+    fn(0)
+    fn(1)
+    fn(2)
+
 proc assignIfDefault*[T](result: var T, val: T, def = default(T)) =
   ## if `result` was already assigned to a value (that wasn't `def`), this is a noop.
   if result == def: result = val
@@ -560,6 +572,12 @@ proc newPartialConfigRef*(): ConfigRef =
 proc cppDefine*(c: ConfigRef; define: string) =
   c.cppDefines.incl define
 
+proc getStdlibVersion*(conf: ConfigRef): NimVer =
+  if conf.nimStdlibVersion == (0,0,0):
+    let s = conf.symbols.getOrDefault("nimVersion", "")
+    conf.nimStdlibVersion = s.parseNimVersion
+  result = conf.nimStdlibVersion
+
 proc isDefined*(conf: ConfigRef; symbol: string): bool =
   if conf.symbols.hasKey(symbol):
     result = true