Co-authored-by: cooldome <ariabushenko@bk.ru>
This commit is contained in:
parent
d3b0132061
commit
f10689d3d4
2 changed files with 29 additions and 6 deletions
|
|
@ -113,7 +113,7 @@ proc fixupCall(p: BProc, le, ri: PNode, d: var TLoc,
|
||||||
|
|
||||||
proc genBoundsCheck(p: BProc; arr, a, b: TLoc)
|
proc genBoundsCheck(p: BProc; arr, a, b: TLoc)
|
||||||
|
|
||||||
proc openArrayLoc(p: BProc, n: PNode): Rope =
|
proc openArrayLoc(p: BProc, formalType: PType, n: PNode): Rope =
|
||||||
var a: TLoc
|
var a: TLoc
|
||||||
|
|
||||||
var q = skipConv(n)
|
var q = skipConv(n)
|
||||||
|
|
@ -149,8 +149,11 @@ proc openArrayLoc(p: BProc, n: PNode): Rope =
|
||||||
of tyOpenArray, tyVarargs, tyUncheckedArray, tyCString:
|
of tyOpenArray, tyVarargs, tyUncheckedArray, tyCString:
|
||||||
result = "($4*)($1)+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dest]
|
result = "($4*)($1)+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dest]
|
||||||
of tyString, tySequence:
|
of tyString, tySequence:
|
||||||
if skipTypes(n.typ, abstractInst).kind == tyVar and
|
let atyp = skipTypes(a.t, abstractInst)
|
||||||
not compileToCpp(p.module):
|
if formalType.skipTypes(abstractInst).kind == tyVar and atyp.kind == tyString and
|
||||||
|
optSeqDestructors in p.config.globalOptions:
|
||||||
|
linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, a)])
|
||||||
|
if atyp.kind == tyVar and not compileToCpp(p.module):
|
||||||
result = "($5*)(*$1)$4+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dataField(p), dest]
|
result = "($5*)(*$1)$4+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dataField(p), dest]
|
||||||
else:
|
else:
|
||||||
result = "($5*)$1$4+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dataField(p), dest]
|
result = "($5*)$1$4+($2), ($3)-($2)+1" % [rdLoc(a), rdLoc(b), rdLoc(c), dataField(p), dest]
|
||||||
|
|
@ -162,8 +165,11 @@ proc openArrayLoc(p: BProc, n: PNode): Rope =
|
||||||
of tyOpenArray, tyVarargs:
|
of tyOpenArray, tyVarargs:
|
||||||
result = "$1, $1Len_0" % [rdLoc(a)]
|
result = "$1, $1Len_0" % [rdLoc(a)]
|
||||||
of tyString, tySequence:
|
of tyString, tySequence:
|
||||||
if skipTypes(n.typ, abstractInst).kind == tyVar and
|
let ntyp = skipTypes(n.typ, abstractInst)
|
||||||
not compileToCpp(p.module):
|
if formalType.skipTypes(abstractInst).kind == tyVar and ntyp.kind == tyString and
|
||||||
|
optSeqDestructors in p.config.globalOptions:
|
||||||
|
linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, a)])
|
||||||
|
if ntyp.kind == tyVar and not compileToCpp(p.module):
|
||||||
var t: TLoc
|
var t: TLoc
|
||||||
t.r = "(*$1)" % [a.rdLoc]
|
t.r = "(*$1)" % [a.rdLoc]
|
||||||
result = "(*$1)$3, $2" % [a.rdLoc, lenExpr(p, t), dataField(p)]
|
result = "(*$1)$3, $2" % [a.rdLoc, lenExpr(p, t), dataField(p)]
|
||||||
|
|
@ -194,7 +200,7 @@ proc genArg(p: BProc, n: PNode, param: PSym; call: PNode): Rope =
|
||||||
result = genArgStringToCString(p, n)
|
result = genArgStringToCString(p, n)
|
||||||
elif skipTypes(param.typ, abstractVar).kind in {tyOpenArray, tyVarargs}:
|
elif skipTypes(param.typ, abstractVar).kind in {tyOpenArray, tyVarargs}:
|
||||||
var n = if n.kind != nkHiddenAddr: n else: n[0]
|
var n = if n.kind != nkHiddenAddr: n else: n[0]
|
||||||
result = openArrayLoc(p, n)
|
result = openArrayLoc(p, param.typ, n)
|
||||||
elif ccgIntroducedPtr(p.config, param, call[0].typ[0]):
|
elif ccgIntroducedPtr(p.config, param, call[0].typ[0]):
|
||||||
initLocExpr(p, n, a)
|
initLocExpr(p, n, a)
|
||||||
result = addrLoc(p.config, a)
|
result = addrLoc(p.config, a)
|
||||||
|
|
|
||||||
|
|
@ -48,3 +48,20 @@ proc `=destroy`(x: var AObj) =
|
||||||
echo "closed"
|
echo "closed"
|
||||||
|
|
||||||
var x = B(io: newStringStream("thestream"))
|
var x = B(io: newStringStream("thestream"))
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# issue #14003
|
||||||
|
|
||||||
|
proc cryptCTR*(nonce: var openArray[char]) =
|
||||||
|
nonce[1] = 'A'
|
||||||
|
|
||||||
|
proc main() =
|
||||||
|
var nonce1 = "0123456701234567"
|
||||||
|
cryptCTR(nonce1)
|
||||||
|
doAssert(nonce1 == "0A23456701234567")
|
||||||
|
var nonce2 = "01234567"
|
||||||
|
cryptCTR(nonce2.toOpenArray(0, nonce2.len-1))
|
||||||
|
doAssert(nonce2 == "0A234567")
|
||||||
|
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue