diff options
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/core/macros.nim | 2 | ||||
-rw-r--r-- | lib/pure/unittest.nim | 21 | ||||
-rwxr-xr-x | lib/system.nim | 46 |
3 files changed, 28 insertions, 41 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index e61575f3e..825979e27 100755 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -230,7 +230,7 @@ proc parseStmt*(s: string): stmt {.magic: "ParseStmtToAst".} ## Compiles the passed string to its AST representation. ## Expects one or more statements. -proc getAst*(macroOrTemplate: expr): expr {.magic: "ExpandMacroToAst".} +proc getAst*(macroOrTemplate: expr): expr {.magic: "ExpandToAst".} ## Obtains the AST nodes returned from a macro or template invocation. ## Example: ## diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim index a5c97ee9b..2322ffd69 100644 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -56,7 +56,7 @@ template test*(name: expr, body: stmt): stmt = finally: TestTeardownIMPL() - echo "[" & $TestStatusIMPL & "] " & name + echo "[" & $TestStatusIMPL & "] " & name & "\n" proc checkpoint*(msg: string) = checkpoints.add(msg) @@ -77,19 +77,8 @@ macro check*(conditions: stmt): stmt = if not Exp: checkpoint(lineInfoLit & ": Check failed: " & expLit) fail() - - # XXX: If we don't create a string literal node below, the compiler - # will SEGFAULT in a rather strange fashion: - # - # rewrite(e, e.toStrLit, e.toStrLit) is ok, but - # - # rewrite(e, e.lineinfo, e.toStrLit) or - # rewrite(e, "anything", e.toStrLit) are not - # - # It may have something to do with the dummyContext hack in - # evals.nim/evalTemplate - # - result = getAst(rewrite(e, newStrLitNode(e.lineinfo), e.toStrLit)) + + result = getAst(rewrite(e, e.lineinfo, e.toStrLit)) case conditions.kind of nnkCall, nnkCommand, nnkMacroStmt: @@ -110,7 +99,7 @@ macro check*(conditions: stmt): stmt = result = getAst(rewrite( op[0], op[1], op[2], - newStrLitNode(op.lineinfo), + op.lineinfo, op.toStrLit, op[1].toStrLit, op[2].toStrLit)) @@ -153,5 +142,5 @@ macro expect*(exp: stmt): stmt = for i in countup(1, expectCall.len - 1): errorTypes.add(expectCall[i]) - result = getAst(expectBody(errorTypes, newStrLitNode(exp.lineinfo), body)) + result = getAst(expectBody(errorTypes, exp.lineinfo, body)) diff --git a/lib/system.nim b/lib/system.nim index b6f5243e5..7a7a1c33b 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -857,28 +857,6 @@ proc insert*[T](x: var seq[T], item: T, i = 0) {.noSideEffect.} = dec(j) x[i] = item -template spliceImpl(x, start, count, elements: expr): stmt = - var - shift = elements.len - count - newLen = x.len + shift - totalShifted = x.len - (start + count) - firstShifted = newLen - totalShifted - - if shift > 0: - setLen(x, newLen) - - for i in countup(firstShifted, newLen - 1): - shallowCopy(x[i], x[i-shift]) - - for c in countup(0, elements.len - 1): - x[start + c] = elements[c] - - if shift < 0: - setLen(x, newLen) - -proc splice*[T](x: var seq[T], start, count: int, elements: openarray[T] = []) = - spliceImpl(x, start, count, elements) - proc repr*[T](x: T): string {.magic: "Repr", noSideEffect.} ## takes any Nimrod variable and returns its string representation. It ## works even for complex data graphs with cycles. This is a great @@ -1943,6 +1921,26 @@ proc `[]`*(s: string, x: TSlice[int]): string {.inline.} = ## slice operation for strings. Negative indexes are supported. result = s.substr(x.a-|s, x.b-|s) +template spliceImpl(x, start, endp, spliced: expr): stmt = + var + count = endp - start + 1 + shift = spliced.len - count + newLen = x.len + shift + totalShifted = x.len - (start + count) + firstShifted = newLen - totalShifted + + if shift > 0: + setLen(x, newLen) + + for i in countdown(newLen - 1, firstShifted): + shallowCopy(x[i], x[i-shift]) + + for c in countup(0, spliced.len - 1): + x[start + c] = spliced[c] + + if shift < 0: + setLen(x, newLen) + proc `[]=`*(s: var string, x: TSlice[int], b: string) = ## slice assignment for strings. Negative indexes are supported. var a = x.a-|s @@ -1950,7 +1948,7 @@ proc `[]=`*(s: var string, x: TSlice[int], b: string) = if L == b.len: for i in 0 .. <L: s[i+a] = b[i] else: - raise newException(EOutOfRange, "differing lengths for slice assignment") + spliceImpl(s, x.a, x.b, b) proc `[]`*[Idx, T](a: array[Idx, T], x: TSlice[int]): seq[T] = ## slice operation for arrays. Negative indexes are NOT supported because @@ -2004,7 +2002,7 @@ proc `[]=`*[T](s: var seq[T], x: TSlice[int], b: openArray[T]) = if L == b.len: for i in 0 .. <L: s[i+a] = b[i] else: - raise newException(EOutOfRange, "differing lengths for slice assignment") + spliceImpl(s, x.a, x.b, b) proc getTypeInfo*[T](x: T): pointer {.magic: "GetTypeInfo".} ## get type information for `x`. Ordinary code should not use this, but |