about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/config/config.nim4
-rw-r--r--src/config/history.nim2
-rw-r--r--src/css/match.nim13
-rw-r--r--src/css/selectorparser.nim34
-rw-r--r--src/html/catom.nim6
-rw-r--r--src/html/dom.nim41
-rw-r--r--src/html/env.nim2
-rw-r--r--src/server/headers.nim2
-rw-r--r--src/server/loader.nim2
-rw-r--r--src/types/cell.nim7
-rw-r--r--src/types/formdata.nim2
-rw-r--r--src/types/path.nim7
-rw-r--r--src/types/url.nim4
-rw-r--r--src/utils/twtstr.nim3
14 files changed, 67 insertions, 62 deletions
diff --git a/src/config/config.nim b/src/config/config.nim
index 178c1f58..c73ac5e4 100644
--- a/src/config/config.nim
+++ b/src/config/config.nim
@@ -212,10 +212,10 @@ converter toStr*(p: ChaPathResolved): string {.inline.} =
 proc fromJS(ctx: JSContext; val: JSValue; res: var ChaPathResolved): Opt[void] =
   return ctx.fromJS(val, string(res))
 
-proc `[]=`(a: var ActionMap; b, c: string) =
+proc `[]=`(a: var ActionMap; b: string; c: sink string) =
   a.t[b] = c
 
-proc `[]`*(a: ActionMap; b: string): string =
+proc `[]`*(a: ActionMap; b: string): lent string =
   a.t[b]
 
 proc contains*(a: ActionMap; b: string): bool =
diff --git a/src/config/history.nim b/src/config/history.nim
index 03912c07..34da7762 100644
--- a/src/config/history.nim
+++ b/src/config/history.nim
@@ -22,7 +22,7 @@ type
 func newHistoryEntry(s: string): HistoryEntry =
   return HistoryEntry(s: s)
 
-proc add(hist: History; entry: HistoryEntry) =
+proc add(hist: History; entry: sink HistoryEntry) =
   let old = hist.map.getOrDefault(entry.s)
   if old != nil:
     if hist.first == old:
diff --git a/src/css/match.nim b/src/css/match.nim
index 737dd1d6..bb1acd9c 100644
--- a/src/css/match.nim
+++ b/src/css/match.nim
@@ -219,13 +219,14 @@ func matches*(element: Element; cxsel: ComplexSelector;
   var mdepends = DependencyInfo.default
   for i in countdown(cxsel.high, 0):
     var match = mtFalse
-    case cxsel[i].ct
+    let csel = cxsel[i]
+    case csel.ct
     of ctNone:
-      match = e.matches(cxsel[i], mdepends)
+      match = e.matches(csel, mdepends)
     of ctDescendant:
       e = e.parentElement
       while e != nil:
-        case e.matches(cxsel[i], mdepends)
+        case e.matches(csel, mdepends)
         of mtFalse: discard
         of mtTrue:
           match = mtTrue
@@ -235,19 +236,19 @@ func matches*(element: Element; cxsel: ComplexSelector;
     of ctChild:
       e = e.parentElement
       if e != nil:
-        match = e.matches(cxsel[i], mdepends)
+        match = e.matches(csel, mdepends)
     of ctNextSibling:
       let prev = e.previousElementSibling
       if prev != nil:
         e = prev
-        match = e.matches(cxsel[i], mdepends)
+        match = e.matches(csel, mdepends)
     of ctSubsequentSibling:
       let parent = e.parentNode
       for j in countdown(e.index - 1, 0):
         let child = parent.childList[j]
         if child of Element:
           let child = Element(child)
-          case child.matches(cxsel[i], mdepends)
+          case child.matches(csel, mdepends)
           of mtTrue:
             e = child
             match = mtTrue
diff --git a/src/css/selectorparser.nim b/src/css/selectorparser.nim
index 70da9119..e1dffcea 100644
--- a/src/css/selectorparser.nim
+++ b/src/css/selectorparser.nim
@@ -45,11 +45,11 @@ type
     failed: bool
     nested: bool
 
-  RelationType* {.size: sizeof(int) div 2.} = enum
-    rtExists, rtEquals, rtToken, rtBeginDash,
-    rtStartsWith, rtEndsWith, rtContains
+  RelationType* = enum
+    rtExists, rtEquals, rtToken, rtBeginDash, rtStartsWith, rtEndsWith,
+    rtContains
 
-  RelationFlag* {.size: sizeof(int) div 2.} = enum
+  RelationFlag* = enum
     rfNone, rfI, rfS
 
   SelectorRelation* = object
@@ -111,28 +111,29 @@ proc parseSelectorList(cvals: seq[CSSComponentValue]; factory: CAtomFactory;
 proc parseComplexSelector(state: var SelectorParser): ComplexSelector
 func `$`*(cxsel: ComplexSelector): string
 
-iterator items*(sels: CompoundSelector): Selector {.inline.} =
-  for it in sels.sels:
+iterator items*(csel: CompoundSelector): lent Selector {.inline.} =
+  for it in csel.sels:
     yield it
 
-func `[]`*(sels: CompoundSelector; i: int): Selector {.inline.} =
-  return sels.sels[i]
+func `[]`*(csel: CompoundSelector; i: int): lent Selector {.inline.} =
+  return csel.sels[i]
 
-func `[]`*(sels: CompoundSelector; i: BackwardsIndex): Selector {.inline.} =
-  return sels.sels[i]
+func `[]`*(csel: CompoundSelector; i: BackwardsIndex): lent Selector
+    {.inline.} =
+  return csel[csel.sels.len - int(i)]
 
-func len*(sels: CompoundSelector): int {.inline.} =
-  return sels.sels.len
+func len*(csel: CompoundSelector): int {.inline.} =
+  return csel.sels.len
 
-proc add*(sels: var CompoundSelector; sel: Selector) {.inline.} =
-  sels.sels.add(sel)
+proc add*(csel: var CompoundSelector; sel: sink Selector) {.inline.} =
+  csel.sels.add(sel)
 
 func `[]`*(cxsel: ComplexSelector; i: int): lent CompoundSelector {.inline.} =
   return cxsel.csels[i]
 
-func `[]`*(cxsel: ComplexSelector; i: BackwardsIndex): CompoundSelector
+func `[]`*(cxsel: ComplexSelector; i: BackwardsIndex): lent CompoundSelector
     {.inline.} =
-  return cxsel.csels[i]
+  return cxsel[cxsel.csels.len - int(i)]
 
 func `[]`*(cxsel: var ComplexSelector; i: BackwardsIndex): var CompoundSelector
     {.inline.} =
@@ -209,6 +210,7 @@ func `$`*(sel: Selector): string =
     return "::" & $sel.elem
 
 func `$`*(sels: CompoundSelector): string =
+  result = ""
   for sel in sels:
     result &= $sel
 
diff --git a/src/html/catom.nim b/src/html/catom.nim
index 64e3cd2c..2c89ca8a 100644
--- a/src/html/catom.nim
+++ b/src/html/catom.nim
@@ -177,7 +177,7 @@ func hash*(atom: CAtom): Hash {.borrow.}
 when defined(debug):
   func `$`*(a: CAtom): string {.borrow.}
 
-func toAtom(factory: var CAtomFactoryObj; s: string;
+func toAtom(factory: var CAtomFactoryObj; s: sink string;
     isInit: static bool = false): CAtom =
   let h = s.hash()
   let i = h and (factory.strMap.len - 1)
@@ -245,7 +245,7 @@ func containsIgnoreCase*(factory: CAtomFactory; aa: openArray[CAtom];
       return true
   return false
 
-func toAtom*(factory: CAtomFactory; s: string): CAtom =
+func toAtom*(factory: CAtomFactory; s: sink string): CAtom =
   return factory[].toAtom(s)
 
 func toAtom*(factory: CAtomFactory; tagType: TagType): CAtom =
@@ -256,7 +256,7 @@ func toAtom*(factory: CAtomFactory; attrType: StaticAtom): CAtom =
   assert attrType != atUnknown
   return CAtom(attrType)
 
-func toAtomLower*(factory: CAtomFactory; s: string): CAtom =
+func toAtomLower*(factory: CAtomFactory; s: sink string): CAtom =
   return factory.lowerMap[int32(factory.toAtom(s))]
 
 func containsIgnoreCase*(factory: CAtomFactory; aa: openArray[CAtom];
diff --git a/src/html/dom.nim b/src/html/dom.nim
index b723207d..8bad0c88 100644
--- a/src/html/dom.nim
+++ b/src/html/dom.nim
@@ -527,8 +527,8 @@ func attrb*(element: Element; s: CAtom): bool
 func serializeFragment(res: var string; node: Node)
 func value*(option: HTMLOptionElement): string
 proc append*(parent, node: Node)
-proc attr*(element: Element; name: CAtom; value: string)
-proc attr*(element: Element; name: StaticAtom; value: string)
+proc attr*(element: Element; name: CAtom; value: sink string)
+proc attr*(element: Element; name: StaticAtom; value: sink string)
 proc baseURL*(document: Document): URL
 proc delAttr(element: Element; i: int; keep = false)
 proc getImageId(window: Window): int
@@ -1105,16 +1105,16 @@ template document*(element: Element): Document =
 proc toAtom*(window: Window; atom: StaticAtom): CAtom =
   return window.factory.toAtom(atom)
 
-proc toAtom*(window: Window; s: string): CAtom =
+proc toAtom*(window: Window; s: sink string): CAtom =
   return window.factory.toAtom(s)
 
 proc toStr*(window: Window; atom: CAtom): lent string =
   return window.factory.toStr(atom)
 
-proc toAtom*(document: Document; s: string): CAtom =
+proc toAtom*(document: Document; s: sink string): CAtom =
   return document.factory.toAtom(s)
 
-proc toAtomLower*(document: Document; s: string): CAtom =
+proc toAtomLower*(document: Document; s: sink string): CAtom =
   return document.factory.toAtomLower(s)
 
 proc toAtom*(document: Document; at: StaticAtom): CAtom =
@@ -3525,14 +3525,14 @@ func getSrc*(this: HTMLElement): tuple[src, contentType: string] =
       return (src, el.attr(satType))
   return ("", "")
 
-func newText*(document: Document; data: string): Text =
+func newText*(document: Document; data: sink string): Text =
   return Text(
     internalDocument: document,
     data: data,
     index: -1
   )
 
-func newText(ctx: JSContext; data = ""): Text {.jsctor.} =
+func newText(ctx: JSContext; data: sink string = ""): Text {.jsctor.} =
   let window = ctx.getGlobal()
   return window.document.newText(data)
 
@@ -3543,8 +3543,8 @@ func newCDATASection(document: Document; data: string): CDATASection =
     index: -1
   )
 
-func newProcessingInstruction(document: Document; target, data: string):
-    ProcessingInstruction =
+func newProcessingInstruction(document: Document; target: string;
+    data: sink string): ProcessingInstruction =
   return ProcessingInstruction(
     internalDocument: document,
     target: target,
@@ -3559,14 +3559,14 @@ func newDocumentFragment(ctx: JSContext): DocumentFragment {.jsctor.} =
   let window = ctx.getGlobal()
   return window.document.newDocumentFragment()
 
-func newComment(document: Document; data: string): Comment =
+func newComment(document: Document; data: sink string): Comment =
   return Comment(
     internalDocument: document,
     data: data,
     index: -1
   )
 
-func newComment(ctx: JSContext; data: string = ""): Comment {.jsctor.} =
+func newComment(ctx: JSContext; data: sink string = ""): Comment {.jsctor.} =
   let window = ctx.getGlobal()
   return window.document.newComment(data)
 
@@ -3716,8 +3716,8 @@ proc newXMLDocument(ctx: JSContext): XMLDocument =
   document.implementation = DOMImplementation(document: document)
   return document
 
-func newDocumentType*(document: Document; name, publicId, systemId: string):
-    DocumentType =
+func newDocumentType*(document: Document;
+    name, publicId, systemId: sink string): DocumentType =
   return DocumentType(
     internalDocument: document,
     name: name,
@@ -4412,21 +4412,22 @@ func findAttrOrNext(element: Element; qualName: CAtom): int =
       return -(i + 1)
   return -(element.attrs.len + 1)
 
-proc attr*(element: Element; name: CAtom; value: string) =
-  let i = element.findAttrOrNext(name)
+proc attr*(element: Element; name: CAtom; value: sink string) =
+  var i = element.findAttrOrNext(name)
   if i >= 0:
     element.attrs[i].value = value
     element.invalidateCollections()
     element.invalidate()
   else:
+    i = -(i + 1)
     element.attrs.insert(AttrData(
       qualifiedName: name,
       localName: name,
       value: value
-    ), -(i + 1))
-  element.reflectAttr(name, some(value))
+    ), i)
+  element.reflectAttr(name, some(element.attrs[i].value))
 
-proc attr*(element: Element; name: StaticAtom; value: string) =
+proc attr*(element: Element; name: StaticAtom; value: sink string) =
   element.attr(element.document.toAtom(name), value)
 
 proc attrns*(element: Element; localName: CAtom; prefix: NamespacePrefix;
@@ -4469,7 +4470,7 @@ proc attrulgz(element: Element; name: StaticAtom; value: uint32) =
   if value > 0:
     element.attrul(name, value)
 
-proc setAttribute(element: Element; qualifiedName, value: string):
+proc setAttribute(element: Element; qualifiedName: string; value: sink string):
     Err[DOMException] {.jsfunc.} =
   ?qualifiedName.validateName()
   let qualifiedName = if element.namespace == Namespace.HTML and
@@ -4481,7 +4482,7 @@ proc setAttribute(element: Element; qualifiedName, value: string):
   return ok()
 
 proc setAttributeNS(element: Element; namespace, qualifiedName,
-    value: string): Err[DOMException] {.jsfunc.} =
+    value: sink string): Err[DOMException] {.jsfunc.} =
   ?qualifiedName.validateQName()
   let ps = qualifiedName.until(':')
   let prefix = if ps.len < qualifiedName.len: ps else: ""
diff --git a/src/html/env.nim b/src/html/env.nim
index fd443bfd..d4735a01 100644
--- a/src/html/env.nim
+++ b/src/html/env.nim
@@ -260,7 +260,7 @@ func getParent(window: Window): Window {.jsrfget: "parent".} =
 
 # See twtstr for the actual implementations.
 proc atob(ctx: JSContext; window: Window; data: string): JSValue {.jsfunc.} =
-  var s = ""
+  var s: string
   if (let r = s.atob(data); r.isNone):
     return JS_ThrowDOMException(ctx, $r.error, "InvalidCharacterError")
   return ctx.toJS(NarrowString(s))
diff --git a/src/server/headers.nim b/src/server/headers.nim
index 633e81ae..67bf739c 100644
--- a/src/server/headers.nim
+++ b/src/server/headers.nim
@@ -250,7 +250,7 @@ func newHeaders*(table: Table[string, string]): Headers =
 func clone*(headers: Headers): Headers =
   return Headers(table: headers.table)
 
-proc add*(headers: Headers; k, v: string) =
+proc add*(headers: Headers; k: string; v: sink string) =
   let k = k.toHeaderCase()
   headers.table.withValue(k, p):
     p[].add(v)
diff --git a/src/server/loader.nim b/src/server/loader.nim
index 13bdc276..13d4e5d6 100644
--- a/src/server/loader.nim
+++ b/src/server/loader.nim
@@ -1047,7 +1047,7 @@ proc loadData(ctx: LoaderContext; handle: InputHandle; request: Request) =
   let sd = ct.len + 1 # data start
   let body = percentDecode(url.pathname.toOpenArray(sd, url.pathname.high))
   if ct.endsWith(";base64"):
-    var d = ""
+    var d: string
     if d.atob(body).isNone:
       handle.sendResult(ceInvalidURL, "invalid data URL")
       handle.close()
diff --git a/src/types/cell.nim b/src/types/cell.nim
index d8aab32d..25036068 100644
--- a/src/types/cell.nim
+++ b/src/types/cell.nim
@@ -40,13 +40,14 @@ proc `[]=`*(grid: var FixedGrid; i: BackwardsIndex; cell: FixedCell) =
 proc `[]`*(grid: var FixedGrid; i: int): var FixedCell = grid.cells[i]
 proc `[]`*(grid: var FixedGrid; i: BackwardsIndex): var FixedCell =
   grid.cells[i]
-proc `[]`*(grid: FixedGrid; i: int): FixedCell = grid.cells[i]
-proc `[]`*(grid: FixedGrid; i: BackwardsIndex): FixedCell = grid.cells[i]
+proc `[]`*(grid: FixedGrid; i: int): lent FixedCell = grid.cells[i]
+proc `[]`*(grid: FixedGrid; i: BackwardsIndex): lent FixedCell =
+  return grid.cells[grid.cells.len - int(i)]
 
 proc len*(grid: FixedGrid): int = grid.cells.len
 proc high*(grid: FixedGrid): int = grid.cells.high
 
-iterator items*(grid: FixedGrid): FixedCell {.inline.} =
+iterator items*(grid: FixedGrid): lent FixedCell {.inline.} =
   for cell in grid.cells:
     yield cell
 
diff --git a/src/types/formdata.nim b/src/types/formdata.nim
index 711ca4dc..75be9750 100644
--- a/src/types/formdata.nim
+++ b/src/types/formdata.nim
@@ -46,7 +46,7 @@ proc sread*(reader: var BufferedReader; part: var FormDataEntry) =
   else:
     reader.sread(part.value)
 
-iterator items*(this: FormData): FormDataEntry {.inline.} =
+iterator items*(this: FormData): lent FormDataEntry {.inline.} =
   for entry in this.entries:
     yield entry
 
diff --git a/src/types/path.nim b/src/types/path.nim
index 4bf14adc..dba83a26 100644
--- a/src/types/path.nim
+++ b/src/types/path.nim
@@ -242,12 +242,13 @@ func flatEnough(a, b, c0, c1: Vector2D): bool =
   let vy = 3 * c1.y - a.y - 2 * b.y
   return max(ux * ux, vx * vx) + max(uy * uy, vy * vy) <= 0.02
 
-iterator items*(pl: PathLines): LineSegment {.inline.} =
+iterator items*(pl: PathLines): lent LineSegment {.inline.} =
   for line in pl.lines:
     yield line
 
-func `[]`*(pl: PathLines; i: int): LineSegment = pl.lines[i]
-func `[]`*(pl: PathLines; i: BackwardsIndex): LineSegment = pl.lines[i]
+func `[]`*(pl: PathLines; i: int): lent LineSegment = pl.lines[i]
+func `[]`*(pl: PathLines; i: BackwardsIndex): lent LineSegment =
+  return pl.lines[pl.lines.len - int(i)]
 func len*(pl: PathLines): int = pl.lines.len
 
 iterator quadraticLines(a, b, c: Vector2D): Line {.inline.} =
diff --git a/src/types/url.nim b/src/types/url.nim
index 0c460bbd..a2bb3f82 100644
--- a/src/types/url.nim
+++ b/src/types/url.nim
@@ -1102,7 +1102,7 @@ proc update(params: URLSearchParams) =
   else:
     params.url.search = "?" & serializedQuery
 
-proc append(params: URLSearchParams; name, value: string) {.jsfunc.} =
+proc append(params: URLSearchParams; name, value: sink string) {.jsfunc.} =
   params.list.add((name, value))
   params.update()
 
@@ -1133,7 +1133,7 @@ proc has(params: URLSearchParams; name: string; value = none(string)): bool
         return true
   return false
 
-proc set(params: URLSearchParams; name, value: string) {.jsfunc.} =
+proc set(params: URLSearchParams; name: string; value: sink string) {.jsfunc.} =
   for param in params.list.mitems:
     if param.name == name:
       param.value = value
diff --git a/src/utils/twtstr.nim b/src/utils/twtstr.nim
index 7c905aa3..9f5df832 100644
--- a/src/utils/twtstr.nim
+++ b/src/utils/twtstr.nim
@@ -767,8 +767,7 @@ func atob(c: char): uint8 {.inline.} =
   return uint8.high
 
 # Warning: this overrides outs.
-# (it should really be out string, just can't use out because of 1.6.14)
-func atob*(outs: var string; data: string): Err[cstring] =
+func atob*(outs: out string; data: string): Err[cstring] =
   outs = newStringOfCap(data.len div 4 * 3)
   var buf = array[4, uint8].default
   var i = 0