diff options
author | bptato <nincsnevem662@gmail.com> | 2024-12-12 20:14:10 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-12-12 20:22:38 +0100 |
commit | 8428f0cb34147e32b4b77ee9af06f77b92c82fa5 (patch) | |
tree | 94f12d56da3fdbab8de240721a911d86a29c1449 /src | |
parent | 038ecf98013d7073ad31ec31468603a3b21d90d2 (diff) | |
download | chawan-8428f0cb34147e32b4b77ee9af06f77b92c82fa5.tar.gz |
twtstr: reduce copying in atob
Diffstat (limited to 'src')
-rw-r--r-- | src/html/env.nim | 6 | ||||
-rw-r--r-- | src/server/loader.nim | 6 | ||||
-rw-r--r-- | src/utils/twtstr.nim | 10 |
3 files changed, 12 insertions, 10 deletions
diff --git a/src/html/env.nim b/src/html/env.nim index 7ce0bb4f..311496af 100644 --- a/src/html/env.nim +++ b/src/html/env.nim @@ -228,11 +228,11 @@ func getParent(window: Window): Window {.jsfget: "parent".} = # See twtstr for the actual implementations. proc atob(ctx: JSContext; window: Window; data: string): JSValue {.jsfunc.} = - let r = atob0(data) - if r.isNone: + var s = "" + if (let r = s.atob(data); r.isNone): let ex = newDOMException($r.error, "InvalidCharacterError") return JS_Throw(ctx, ctx.toJS(ex)) - return ctx.toJS(NarrowString(r.get)) + return ctx.toJS(NarrowString(s)) proc btoa(ctx: JSContext; window: Window; data: JSValue): JSValue {.jsfunc.} = diff --git a/src/server/loader.nim b/src/server/loader.nim index 833ff139..45c41f1c 100644 --- a/src/server/loader.nim +++ b/src/server/loader.nim @@ -1011,13 +1011,13 @@ 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"): - let d = atob0(body) # decode from ct end + 1 - if d.isNone: + var d = "" + if d.atob(body).isNone: handle.sendResult(ceInvalidURL, "invalid data URL") handle.close() return ct.setLen(ct.len - ";base64".len) # remove base64 indicator - ctx.loadDataSend(handle, d.get, ct) + ctx.loadDataSend(handle, d, ct) else: ctx.loadDataSend(handle, body, ct) diff --git a/src/utils/twtstr.nim b/src/utils/twtstr.nim index 5fe93507..0fef91d3 100644 --- a/src/utils/twtstr.nim +++ b/src/utils/twtstr.nim @@ -737,9 +737,11 @@ func atob(c: char): uint8 {.inline.} = return 63 return uint8.high -func atob0*(data: string): Result[string, cstring] = - var outs = newStringOfCap(data.len div 4 * 3) - var buf: array[4, uint8] +# 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] = + outs = newStringOfCap(data.len div 4 * 3) + var buf = default(array[4, uint8]) var i = 0 var j = 0 var pad = 0 @@ -784,7 +786,7 @@ func atob0*(data: string): Result[string, cstring] = outs &= char(ob1) elif j != 0: return err("Incorrect number of characters in encoded string") - return ok(outs) + return ok() const AMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" |