discard """
output: '''(repo: "", package: "meo", ext: "")
doing shady stuff...
3
6
(@[1], @[2])
192.168.0.1
192.168.0.1
192.168.0.1
192.168.0.1'''
cmd: '''nim c --gc:arc --expandArc:newTarget --expandArc:delete --expandArc:p1 --expandArc:tt --hint:Performance:off --assertions:off --expandArc:extractConfig $file'''
nimout: '''--expandArc: newTarget
var
splat
:tmp
:tmp_1
:tmp_2
splat = splitFile(path)
:tmp = splat.dir
wasMoved(splat.dir)
:tmp_1 = splat.name
wasMoved(splat.name)
:tmp_2 = splat.ext
wasMoved(splat.ext)
result = (
let blitTmp = :tmp
blitTmp,
let blitTmp_1 = :tmp_1
blitTmp_1,
let blitTmp_2 = :tmp_2
blitTmp_2)
`=destroy`(splat)
-- end of expandArc ------------------------
--expandArc: delete
var
sibling
saved
`=copy`(sibling, target.parent.left)
`=copy`(saved, sibling.right)
`=copy`(sibling.right, saved.left)
`=sink`(sibling.parent, saved)
`=destroy`(sibling)
-- end of expandArc ------------------------
--expandArc: p1
var
lresult
lvalue
lnext
_
lresult = @[123]
_ = (
let blitTmp = lresult
blitTmp, ";")
lvalue = _[0]
lnext = _[1]
result.value = move lvalue
`=destroy`(lnext)
`=destroy_1`(lvalue)
-- end of expandArc ------------------------
--expandArc: tt
var
it_cursor
a
:tmpD
:tmpD_1
:tmpD_2
try:
it_cursor = x
a = (
wasMoved(:tmpD)
`=copy`(:tmpD, it_cursor.key)
:tmpD,
wasMoved(:tmpD_1)
`=copy`(:tmpD_1, it_cursor.val)
:tmpD_1)
echo [
:tmpD_2 = `$`(a)
:tmpD_2]
finally:
`=destroy`(:tmpD_2)
`=destroy_1`(a)
-- end of expandArc ------------------------
--expandArc: extractConfig
var lan_ip
try:
lan_ip = ""
block :tmp:
var line
var i = 0
let L = len(txt)
block :tmp_1:
while i < L:
var splitted
try:
line = txt[i]
splitted = split(line, " ", -1)
if splitted[0] == "opt":
`=copy`(lan_ip, splitted[1])
echo [lan_ip]
echo [splitted[1]]
inc(i, 1)
finally:
`=destroy`(splitted)
finally:
`=destroy_1`(lan_ip)
-- end of expandArc ------------------------'''
"""
import os
type Target = tuple[repo, package, ext: string]
proc newTarget*(path: string): Target =
let splat = path.splitFile
result = (repo: splat.dir, package: splat.name, ext: splat.ext)
echo newTarget("meo")
type
Node = ref object
left, right, parent: Node
value: int
proc delete(target: var Node) =
var sibling = target.parent.left # b3
var saved = sibling.right # b3.right -> r4
sibling.right = saved.left # b3.right -> r4.left = nil
sibling.parent = saved # b3.parent -> r5 = r4
#[after this proc:
b 5
/ \
b 3 b 6
]#
#[before:
r 5
/ \
b 3 b 6 - to delete
/ \
empty r 4
]#
proc main =
var five = Node(value: 5)
var six = Node(value: 6)
six.parent = five
five.right = six
var three = Node(value: 3)
three.parent = five
five.left = three
var four = Node(value: 4)
four.parent = three
three.right = four
echo "doing shady stuff..."
delete(six)
# need both of these echos
echo five.left.value
echo five.right.value
main()
type
Maybe = object
value: seq[int]
proc p1(): Maybe =
let lresult = @[123]
var lvalue: seq[int]
var lnext: string
(lvalue, lnext) = (lresult, ";")
result.value = move lvalue
proc tissue15130 =
doAssert p1().value == @[123]
tissue15130()
type
KeyValue = tuple[key, val: seq[int]]
proc tt(x: KeyValue) =
var it = x
let a = (it.key, it.val)
echo a
proc encodedQuery =
var query: seq[KeyValue]
query.add (key: @[1], val: @[2])
for elem in query:
elem.tt()
encodedQuery()
# bug #15147
proc s(input: string): (string, string) =
result = (";", "")
proc charmatch(input: string): (string, string) =
result = ("123", input[0 .. input.high])
proc plus(input: string) =
var
lvalue, rvalue: string # cursors
lnext: string # must be cursor!!!
rnext: string # cursor
let lresult = charmatch(input)
(lvalue, lnext) = lresult
let rresult = s(lnext)
(rvalue, rnext) = rresult
plus("123;")
func substrEq(s: string, pos: int, substr: string): bool =
var i = 0
var length = substr.len
while i < length and pos+i < s.len and s[pos+i] == substr[i]:
inc i
return i == length
template stringHasSep(s: string, index: int, sep: string): bool =
s.substrEq(index, sep)
template splitCommon(s, sep, maxsplit, sepLen) =
var last = 0
var splits = maxsplit
while last <= len(s):
var first = last
while last < len(s) and not stringHasSep(s, last, sep):
inc(last)
if splits == 0: last = len(s)
yield substr(s, first, last-1)
if splits == 0: break
dec(splits)
inc(last, sepLen)
iterator split(s: string, sep: string, maxsplit = -1): string =
splitCommon(s, sep, maxsplit, sep.len)
template accResult(iter: untyped) =
result = @[]
for x in iter: add(result, x)
func split*(s: string, sep: string, maxsplit = -1): seq[string] =
accResult(split(s, sep, maxsplit))
let txt = @["opt 192.168.0.1", "static_lease 192.168.0.1"]
# bug #17033
proc extractConfig() =
var lan_ip = ""
for line in txt:
let splitted = line.split(" ")
if splitted[0] == "opt":
lan_ip = splitted[1] # "borrow" is conditional and inside a loop.
# Not good enough...
# we need a flag that live-ranges are disjoint
echo lan_ip
echo splitted[1] # Without this line everything works
extractConfig()