Skip to content

Commit 34920ed

Browse files
authored
Fix js string marshaling (#100997)
1 parent 7c365ec commit 34920ed

File tree

3 files changed

+10
-7
lines changed

3 files changed

+10
-7
lines changed

src/mono/browser/browser.proj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@
185185
<EmccExportedRuntimeMethod Include="getValue" />
186186
<EmccExportedRuntimeMethod Include="UTF8ToString" />
187187
<EmccExportedRuntimeMethod Include="UTF8ArrayToString" />
188+
<EmccExportedRuntimeMethod Include="lengthBytesUTF8" />
188189
<EmccExportedRuntimeMethod Include="stringToUTF8Array" />
189190
<EmccExportedRuntimeMethod Include="FS_createPath" />
190191
<EmccExportedRuntimeMethod Include="FS_createDataFile" />

src/mono/browser/runtime/strings.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,20 @@ export function strings_init (): void {
3939

4040
export function stringToUTF8 (str: string): Uint8Array {
4141
if (_text_encoder_utf8 === undefined) {
42-
const buffer = new Uint8Array(str.length * 2);
43-
Module.stringToUTF8Array(str, buffer, 0, str.length * 2);
42+
const len = Module.lengthBytesUTF8(str);
43+
const buffer = new Uint8Array(len);
44+
Module.stringToUTF8Array(str, buffer, 0, len);
4445
return buffer;
4546
}
4647
return _text_encoder_utf8.encode(str);
4748
}
4849

4950
export function stringToUTF8Ptr (str: string): CharPtr {
50-
const bytes = (str.length + 1) * 2;
51-
const ptr = Module._malloc(bytes) as any;
52-
_zero_region(ptr, str.length * 2);
53-
const buffer = localHeapViewU8().subarray(ptr, ptr + bytes);
54-
buffer.set(stringToUTF8(str));
51+
const size = Module.lengthBytesUTF8(str) + 1;
52+
const ptr = Module._malloc(size) as any;
53+
const buffer = localHeapViewU8().subarray(ptr, ptr + size);
54+
Module.stringToUTF8Array(str, buffer, 0, size);
55+
buffer[size - 1] = 0;
5556
return ptr;
5657
}
5758

src/mono/browser/runtime/types/emscripten.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export declare interface EmscriptenModule {
4040
UTF8ToString(ptr: CharPtr, maxBytesToRead?: number): string;
4141
UTF8ArrayToString(u8Array: Uint8Array, idx?: number, maxBytesToRead?: number): string;
4242
stringToUTF8Array(str: string, heap: Uint8Array, outIdx: number, maxBytesToWrite: number): void;
43+
lengthBytesUTF8(str: string): number;
4344
FS_createPath(parent: string, path: string, canRead?: boolean, canWrite?: boolean): string;
4445
FS_createDataFile(parent: string, name: string, data: TypedArray, canRead: boolean, canWrite: boolean, canOwn?: boolean): string;
4546
addFunction(fn: Function, signature: string): number;

0 commit comments

Comments
 (0)