diff options
-rw-r--r-- | src/config/config.nim | 4 | ||||
-rw-r--r-- | src/config/history.nim | 2 | ||||
-rw-r--r-- | src/css/match.nim | 13 | ||||
-rw-r--r-- | src/css/selectorparser.nim | 34 | ||||
-rw-r--r-- | src/html/catom.nim | 6 | ||||
-rw-r--r-- | src/html/dom.nim | 41 | ||||
-rw-r--r-- | src/html/env.nim | 2 | ||||
-rw-r--r-- | src/server/headers.nim | 2 | ||||
-rw-r--r-- | src/server/loader.nim | 2 | ||||
-rw-r--r-- | src/types/cell.nim | 7 | ||||
-rw-r--r-- | src/types/formdata.nim | 2 | ||||
-rw-r--r-- | src/types/path.nim | 7 | ||||
-rw-r--r-- | src/types/url.nim | 4 | ||||
-rw-r--r-- | src/utils/twtstr.nim | 3 |
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 |