commit
0059f16dfb
5 changed files with 59 additions and 42 deletions
|
|
@ -55,6 +55,8 @@ proc enumToString*(enums: openArray[enum]): string =
|
||||||
slightly. The `dumpLisp` macro in this module now outputs an
|
slightly. The `dumpLisp` macro in this module now outputs an
|
||||||
indented proper Lisp, devoid of commas.
|
indented proper Lisp, devoid of commas.
|
||||||
|
|
||||||
|
- In `strutils` empty strings now no longer matched as substrings anymore.
|
||||||
|
|
||||||
### Language additions
|
### Language additions
|
||||||
|
|
||||||
- Vm suport for float32<->int32 and float64<->int64 casts was added.
|
- Vm suport for float32<->int32 and float64<->int64 casts was added.
|
||||||
|
|
|
||||||
|
|
@ -509,7 +509,7 @@ proc genWhileStmt(p: BProc, t: PNode) =
|
||||||
# for closure support weird loop bodies are generated:
|
# for closure support weird loop bodies are generated:
|
||||||
if loopBody.len == 2 and loopBody.sons[0].kind == nkEmpty:
|
if loopBody.len == 2 and loopBody.sons[0].kind == nkEmpty:
|
||||||
loopBody = loopBody.sons[1]
|
loopBody = loopBody.sons[1]
|
||||||
genComputedGoto(p, loopBody) # TODO foobar
|
genComputedGoto(p, loopBody)
|
||||||
else:
|
else:
|
||||||
p.breakIdx = startBlock(p, "while (1) {$n")
|
p.breakIdx = startBlock(p, "while (1) {$n")
|
||||||
p.blocks[p.breakIdx].isLoop = true
|
p.blocks[p.breakIdx].isLoop = true
|
||||||
|
|
@ -874,14 +874,15 @@ proc genTryCpp(p: BProc, t: PNode, d: var TLoc) =
|
||||||
|
|
||||||
discard pop(p.nestedTryStmts)
|
discard pop(p.nestedTryStmts)
|
||||||
|
|
||||||
if not catchAllPresent and t[^1].kind == nkFinally:
|
if t[^1].kind == nkFinally:
|
||||||
|
# c++ does not have finally, therefore code needs to be generated twice
|
||||||
|
if not catchAllPresent:
|
||||||
# finally requires catch all presence
|
# finally requires catch all presence
|
||||||
startBlock(p, "catch (...) {$n")
|
startBlock(p, "catch (...) {$n")
|
||||||
genSimpleBlock(p, t[^1][0])
|
genStmts(p, t[^1][0])
|
||||||
line(p, cpsStmts, ~"throw;$n")
|
line(p, cpsStmts, ~"throw;$n")
|
||||||
endBlock(p)
|
endBlock(p)
|
||||||
|
|
||||||
if t[^1].kind == nkFinally:
|
|
||||||
genSimpleBlock(p, t[^1][0])
|
genSimpleBlock(p, t[^1][0])
|
||||||
|
|
||||||
proc genTry(p: BProc, t: PNode, d: var TLoc) =
|
proc genTry(p: BProc, t: PNode, d: var TLoc) =
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# The Nim Compiler
|
||||||
|
#
|
||||||
|
# See the file "copying.txt", included in this
|
||||||
|
# distribution, for details about the copyright.
|
||||||
|
#
|
||||||
|
## code owner: Arne Döring
|
||||||
|
## e-mail: arne.doering@gmx.net
|
||||||
|
|
||||||
proc align(address, alignment: BiggestInt): BiggestInt =
|
proc align(address, alignment: BiggestInt): BiggestInt =
|
||||||
result = (address + (alignment - 1)) and not (alignment - 1)
|
result = (address + (alignment - 1)) and not (alignment - 1)
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,10 @@ const
|
||||||
HighRegisterPressure = 40
|
HighRegisterPressure = 40
|
||||||
|
|
||||||
proc bestEffort(c: PCtx): TLineInfo =
|
proc bestEffort(c: PCtx): TLineInfo =
|
||||||
(if c.prc == nil: c.module.info else: c.prc.sym.info)
|
if c.prc != nil and c.prc.sym != nil:
|
||||||
|
c.prc.sym.info
|
||||||
|
else:
|
||||||
|
c.module.info
|
||||||
|
|
||||||
proc getTemp(cc: PCtx; tt: PType): TRegister =
|
proc getTemp(cc: PCtx; tt: PType): TRegister =
|
||||||
let typ = tt.skipTypesOrNil({tyStatic})
|
let typ = tt.skipTypesOrNil({tyStatic})
|
||||||
|
|
|
||||||
|
|
@ -1525,6 +1525,8 @@ proc rfind*(s, sub: string, start: int = -1): int {.noSideEffect.} =
|
||||||
## backwards to 0.
|
## backwards to 0.
|
||||||
##
|
##
|
||||||
## Searching is case-sensitive. If `sub` is not in `s`, -1 is returned.
|
## Searching is case-sensitive. If `sub` is not in `s`, -1 is returned.
|
||||||
|
if sub.len == 0:
|
||||||
|
return -1
|
||||||
let realStart = if start == -1: s.len else: start
|
let realStart = if start == -1: s.len else: start
|
||||||
for i in countdown(realStart-sub.len, 0):
|
for i in countdown(realStart-sub.len, 0):
|
||||||
for j in 0..sub.len-1:
|
for j in 0..sub.len-1:
|
||||||
|
|
@ -1632,11 +1634,7 @@ proc replace*(s, sub: string, by = ""): string {.noSideEffect,
|
||||||
result = ""
|
result = ""
|
||||||
let subLen = sub.len
|
let subLen = sub.len
|
||||||
if subLen == 0:
|
if subLen == 0:
|
||||||
for c in s:
|
result = s
|
||||||
add result, by
|
|
||||||
add result, c
|
|
||||||
add result, by
|
|
||||||
return
|
|
||||||
elif subLen == 1:
|
elif subLen == 1:
|
||||||
# when the pattern is a single char, we use a faster
|
# when the pattern is a single char, we use a faster
|
||||||
# char-based search that doesn't need a skip table:
|
# char-based search that doesn't need a skip table:
|
||||||
|
|
@ -1691,7 +1689,8 @@ proc replaceWord*(s, sub: string, by = ""): string {.noSideEffect,
|
||||||
initSkipTable(a, sub)
|
initSkipTable(a, sub)
|
||||||
var i = 0
|
var i = 0
|
||||||
let last = s.high
|
let last = s.high
|
||||||
let sublen = max(sub.len, 1)
|
let sublen = sub.len
|
||||||
|
if sublen > 0:
|
||||||
while true:
|
while true:
|
||||||
var j = find(a, s, sub, i, last)
|
var j = find(a, s, sub, i, last)
|
||||||
if j < 0: break
|
if j < 0: break
|
||||||
|
|
@ -1722,15 +1721,18 @@ proc multiReplace*(s: string, replacements: varargs[(string, string)]): string {
|
||||||
result = newStringOfCap(s.len)
|
result = newStringOfCap(s.len)
|
||||||
var i = 0
|
var i = 0
|
||||||
var fastChk: set[char] = {}
|
var fastChk: set[char] = {}
|
||||||
for tup in replacements: fastChk.incl(tup[0][0]) # Include first character of all replacements
|
for sub, by in replacements.items:
|
||||||
|
if sub.len > 0:
|
||||||
|
# Include first character of all replacements
|
||||||
|
fastChk.incl sub[0]
|
||||||
while i < s.len:
|
while i < s.len:
|
||||||
block sIteration:
|
block sIteration:
|
||||||
# Assume most chars in s are not candidates for any replacement operation
|
# Assume most chars in s are not candidates for any replacement operation
|
||||||
if s[i] in fastChk:
|
if s[i] in fastChk:
|
||||||
for tup in replacements:
|
for sub, by in replacements.items:
|
||||||
if s.continuesWith(tup[0], i):
|
if sub.len > 0 and s.continuesWith(sub, i):
|
||||||
add result, tup[1]
|
add result, by
|
||||||
inc(i, tup[0].len)
|
inc(i, sub.len)
|
||||||
break sIteration
|
break sIteration
|
||||||
# No matching replacement found
|
# No matching replacement found
|
||||||
# copy current character from s
|
# copy current character from s
|
||||||
|
|
@ -2612,7 +2614,7 @@ when isMainModule:
|
||||||
doAssert "-lda-ldz -ld abc".replaceWord("-ld") == "-lda-ldz abc"
|
doAssert "-lda-ldz -ld abc".replaceWord("-ld") == "-lda-ldz abc"
|
||||||
|
|
||||||
doAssert "-lda-ldz -ld abc".replaceWord("") == "-lda-ldz -ld abc"
|
doAssert "-lda-ldz -ld abc".replaceWord("") == "-lda-ldz -ld abc"
|
||||||
doAssert "oo".replace("", "abc") == "abcoabcoabc"
|
doAssert "oo".replace("", "abc") == "oo"
|
||||||
|
|
||||||
type MyEnum = enum enA, enB, enC, enuD, enE
|
type MyEnum = enum enA, enB, enC, enuD, enE
|
||||||
doAssert parseEnum[MyEnum]("enu_D") == enuD
|
doAssert parseEnum[MyEnum]("enu_D") == enuD
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue