Skip to content

Commit f9810ce

Browse files
pkeljeromesimeon
authored andcommitted
Improve String constant allocation.
- Make explicit, that be transfer bytes of an UTF8 string. - Allocate a single, correctly sized buffer on the runtime side.
1 parent ed5142f commit f9810ce

File tree

2 files changed

+16
-19
lines changed

2 files changed

+16
-19
lines changed

compiler/wasm/wasm_translate.ml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,15 @@ module Constants = struct
286286
; i32_const' 5 (* string *)
287287
; eq i32
288288
; if_
289-
[ i32_const' 0
290-
; new_ [] "EjStringBuilder"
291-
; local_set foreign_ptr
292-
(* load length / characters to be processed *)
293-
; local_get local_ptr
289+
[ (* load length / characters to be processed *)
290+
local_get local_ptr
294291
; load ctx.ctx.memory ~offset:8 i32
295292
; local_set n
293+
(* initialize buffer in runtime *)
294+
; i32_const' 0
295+
; local_get n
296+
; new_ [i32] "EjStringBuilderUTF8"
297+
; local_set foreign_ptr
296298
(* initialize moving pointer *)
297299
; local_get local_ptr
298300
; i32_const' 12
@@ -304,7 +306,7 @@ module Constants = struct
304306
; if_
305307
[ local_get foreign_ptr (* for release *)
306308
; local_get foreign_ptr (* for finalize *)
307-
; call (foreign ~params:[i32] ~result:[i32] "EjStringBuilder#finalize")
309+
; call (foreign ~params:[i32] ~result:[i32] "EjStringBuilderUTF8#finalize")
308310
; local_set foreign_ptr (* for return *)
309311
; call (foreign ~params:[i32] ~result:[] "__release")
310312
; local_get foreign_ptr
@@ -316,9 +318,9 @@ module Constants = struct
316318
; local_set n
317319
; local_get foreign_ptr
318320
; local_get local_ptr
321+
(* TODO: speed up string constant allocation by copying words. *)
319322
; load ctx.ctx.memory ~pack:U8 i32
320-
; call (foreign ~params:[i32; i32] ~result:[i32] "EjStringBuilder#append")
321-
; drop
323+
; call (foreign ~params:[i32; i32] ~result:[] "EjStringBuilderUTF8#putByte")
322324
; local_get local_ptr
323325
; i32_const' 1
324326
; add i32

runtimes/assemblyscript/assembly/index.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,19 @@ export class EjString extends EjValue {
3838
}
3939
export const IdEjString = idof<EjString>()
4040

41-
export class EjStringBuilder {
42-
private buf: Array<i32>
41+
export class EjStringBuilderUTF8 {
42+
private buf: Uint8Array
4343
private pos: i32
44-
constructor() {
44+
constructor(n: i32) {
4545
this.pos = 0;
46-
this.buf = new Array<i32>(32);
46+
this.buf = new Uint8Array(n);
4747
}
48-
append(val: i32): EjStringBuilder {
49-
if (this.pos >= this.buf.length) {
50-
this.buf = this.buf.concat(new Array(this.buf.length * 2));
51-
}
48+
putByte(val: u8): void {
5249
this.buf[this.pos] = val;
5350
this.pos++;
54-
return this;
5551
}
5652
finalize(): EjString {
57-
let buf = this.buf.slice(0, this.pos);
58-
let str = String.fromCharCodes(buf);
53+
let str = String.UTF8.decode(this.buf.buffer);
5954
return new EjString(str);
6055
}
6156
}

0 commit comments

Comments
 (0)