about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-12-12 20:14:10 +0100
committerbptato <nincsnevem662@gmail.com>2024-12-12 20:22:38 +0100
commit8428f0cb34147e32b4b77ee9af06f77b92c82fa5 (patch)
tree94f12d56da3fdbab8de240721a911d86a29c1449 /src
parent038ecf98013d7073ad31ec31468603a3b21d90d2 (diff)
downloadchawan-8428f0cb34147e32b4b77ee9af06f77b92c82fa5.tar.gz
twtstr: reduce copying in atob
Diffstat (limited to 'src')
-rw-r--r--src/html/env.nim6
-rw-r--r--src/server/loader.nim6
-rw-r--r--src/utils/twtstr.nim10
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+/"