Size: a a a

2021 February 13

A

Alexander in ru.nim.talks
У меня другая проблема, что мув-семантика после раста знакома довольно хорошо вроде как, но никак не начну расставлять в коде move и lint
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
Victor
Собирал так:
nim c -r --gc:arc --opt:size --checks:off --assertions:off --debuginfo:off --stackTrace:off --lineTrace:off test.nim
я навернео сам issue создам, пока просто не хочу создавать, а хочу до конца упростить
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
а так да, там память таки повреждается
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
если с -d:useMalloc компилить, сразу заметно
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
пока
import strutils

let txt = """opt  router  192.168.0.1
static_lease  11:22:33:44:55:66  192.168.0.1"""

proc extractConfig() =
 var lan_ip = ""

 for line in txt.splitLines():
   let splitted = line.split("  ")
   if (splitted[0] == "opt") and (splitted[1] == "router"):
     lan_ip = splitted[2]
   echo lan_ip
   echo splitted[2] # Without this line everything works

echo "Running"
extractConfig()
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
ещё кстати есть "скрытая" опция компилятора, которая покажет, как выглядит код после почти всех стадий компиляции (и после ARC тоже) до перехода в бекенд
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
для процедуры или модуля
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
--expandArc
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
--expandArc:extractConfig к примеру
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
MIT/Yardanico (alt)
пока
import strutils

let txt = """opt  router  192.168.0.1
static_lease  11:22:33:44:55:66  192.168.0.1"""

proc extractConfig() =
 var lan_ip = ""

 for line in txt.splitLines():
   let splitted = line.split("  ")
   if (splitted[0] == "opt") and (splitted[1] == "router"):
     lan_ip = splitted[2]
   echo lan_ip
   echo splitted[2] # Without this line everything works

echo "Running"
extractConfig()
вот так выглядит код внутри процедуры extractConfig после всех обработок компилятором
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
дошёл до
import strutils

let txt = @["opt 192.168.0.1", "static_lease 192.168.0.1"]

proc extractConfig() =
 var lan_ip = ""

 for line in txt:
   let splitted = line.split(" ")
   if splitted[0] == "opt":
     lan_ip = splitted[1]
   echo lan_ip
   echo splitted[1] # Without this line everything works

extractConfig()
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
в принципе уже можно оформлять (с)
источник

V

Victor in ru.nim.talks
MIT/Yardanico (alt)
и да, не нужно делать var data = xxx и потом return data, можно просто через result :)
ОК, спасибо
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
а баг вот в чём
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
это вот как выглядит код после всех обработок
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
дело в том, что на строке 13 lan_ip_cursor = splitted[1]
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
т.е. lan_ip не копирует в себя строку, а просто берёт указатель (cursor inference, оптимизация такая)
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
но при этом splitted в конце каждой итерации цикла уничтожается на строке 20
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
и поэтому в следующей итерации цикла lan_ip_cursor будет указывать на освобождённую память (splitted прошлого цикла уже уничтожили же)
источник