Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/mono/browser/runtime/marshal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import WasmEnableThreads from "consts:wasmEnableThreads";

import { js_owned_gc_handle_symbol, teardown_managed_proxy } from "./gc-handles";
import { Module, loaderHelpers, mono_assert, runtimeHelpers } from "./globals";
import { getF32, getF64, getI16, getI32, getI64Big, getU16, getU32, getU8, setF32, setF64, setI16, setI32, setI64Big, setU16, setU32, setU8, localHeapViewF64, localHeapViewI32, localHeapViewU8, _zero_region, forceThreadMemoryViewRefresh, setB8, getB8 } from "./memory";
import { getF32, getF64, getI16, getI32, getI64Big, getU16, getU32, getU8, setF32, setF64, setI16, setI32, setI64Big, setU16, setU32, setU8, localHeapViewF64, localHeapViewI32, localHeapViewU8, _zero_region, forceThreadMemoryViewRefresh, fixupPointer, setB8, getB8 } from "./memory";
import { mono_wasm_new_external_root } from "./roots";
import { GCHandle, JSHandle, MonoObject, MonoString, GCHandleNull, JSMarshalerArguments, JSFunctionSignature, JSMarshalerType, JSMarshalerArgument, MarshalerToJs, MarshalerToCs, WasmRoot, MarshalerType, PThreadPtr, PThreadPtrNull, VoidPtrNull } from "./types/internal";
import { TypedArray, VoidPtr } from "./types/emscripten";
Expand Down Expand Up @@ -468,6 +468,7 @@ export const enum MemoryViewType {

abstract class MemoryView implements IMemoryView {
protected constructor (public _pointer: VoidPtr, public _length: number, public _viewType: MemoryViewType) {
this._pointer = fixupPointer(_pointer, 0);
}

abstract dispose(): void;
Expand Down
12 changes: 6 additions & 6 deletions src/mono/browser/runtime/memory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,13 @@ export function setB8 (offset: MemOffset, value: number | boolean): void {
if (typeof (value) === "number")
assert_int_in_range(value, 0, 1);
receiveWorkerHeapViews();
Module.HEAPU8[<any>offset] = boolValue ? 1 : 0;
Module.HEAPU8[<any>offset >>> 0] = boolValue ? 1 : 0;
}

export function setU8 (offset: MemOffset, value: number): void {
assert_int_in_range(value, 0, 0xFF);
receiveWorkerHeapViews();
Module.HEAPU8[<any>offset] = value;
Module.HEAPU8[<any>offset >>> 0] = value;
}

export function setU16 (offset: MemOffset, value: number): void {
Expand Down Expand Up @@ -122,7 +122,7 @@ export function setU32 (offset: MemOffset, value: NumberOrPointer): void {
export function setI8 (offset: MemOffset, value: number): void {
assert_int_in_range(value, -0x80, 0x7F);
receiveWorkerHeapViews();
Module.HEAP8[<any>offset] = value;
Module.HEAP8[<any>offset >>> 0] = value;
}

export function setI16 (offset: MemOffset, value: number): void {
Expand Down Expand Up @@ -210,12 +210,12 @@ export function getB32 (offset: MemOffset): boolean {

export function getB8 (offset: MemOffset): boolean {
receiveWorkerHeapViews();
return !!(Module.HEAPU8[<any>offset]);
return !!(Module.HEAPU8[<any>offset] >>> 0);
}

export function getU8 (offset: MemOffset): number {
receiveWorkerHeapViews();
return Module.HEAPU8[<any>offset];
return Module.HEAPU8[<any>offset >>> 0];
}

export function getU16 (offset: MemOffset): number {
Expand Down Expand Up @@ -256,7 +256,7 @@ export function getF64_unaligned (offset: MemOffset): number {

export function getI8 (offset: MemOffset): number {
receiveWorkerHeapViews();
return Module.HEAP8[<any>offset];
return Module.HEAP8[<any>offset >>> 0];
}

export function getI16 (offset: MemOffset): number {
Expand Down
6 changes: 3 additions & 3 deletions src/mono/browser/runtime/startup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { populateEmscriptenPool, mono_wasm_init_threads } from "./pthreads";
import { currentWorkerThreadEvents, dotnetPthreadCreated, initWorkerThreadEvents, monoThreadInfo } from "./pthreads";
import { mono_wasm_pthread_ptr, update_thread_info } from "./pthreads";
import { jiterpreter_allocate_tables } from "./jiterpreter-support";
import { localHeapViewU8, malloc, setU32 } from "./memory";
import { localHeapViewU8, malloc, setU32, fixupPointer } from "./memory";
import { assertNoProxies } from "./gc-handles";
import { runtimeList } from "./exports";
import { nativeAbort, nativeExit } from "./run";
Expand Down Expand Up @@ -594,12 +594,12 @@ export function mono_wasm_asm_loaded (assembly_name: CharPtr, assembly_ptr: numb
return;
const heapU8 = localHeapViewU8();
const assembly_name_str = assembly_name !== CharPtrNull ? utf8ToString(assembly_name).concat(".dll") : "";
const assembly_data = new Uint8Array(heapU8.buffer, assembly_ptr, assembly_len);
const assembly_data = new Uint8Array(heapU8.buffer, fixupPointer(assembly_ptr, 0), assembly_len);
const assembly_b64 = toBase64StringImpl(assembly_data);

let pdb_b64;
if (pdb_ptr) {
const pdb_data = new Uint8Array(heapU8.buffer, pdb_ptr, pdb_len);
const pdb_data = new Uint8Array(heapU8.buffer, fixupPointer(pdb_ptr, 0), pdb_len);
pdb_b64 = toBase64StringImpl(pdb_data);
}

Expand Down
5 changes: 4 additions & 1 deletion src/mono/browser/runtime/strings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { mono_wasm_new_root, mono_wasm_new_root_buffer } from "./roots";
import { MonoString, MonoStringNull, WasmRoot, WasmRootBuffer } from "./types/internal";
import { Module } from "./globals";
import cwraps from "./cwraps";
import { isSharedArrayBuffer, localHeapViewU8, getU32_local, setU16_local, localHeapViewU32, getU16_local, localHeapViewU16, _zero_region, malloc, free } from "./memory";
import { isSharedArrayBuffer, localHeapViewU8, getU32_local, setU16_local, localHeapViewU32, getU16_local, localHeapViewU16, _zero_region, malloc, free, fixupPointer } from "./memory";
import { NativePointer, CharPtr, VoidPtr } from "./types/emscripten";

export const interned_js_string_table = new Map<string, MonoString>();
Expand Down Expand Up @@ -69,6 +69,7 @@ export function utf8ToString (ptr: CharPtr): string {
}

export function utf8BufferToString (heapOrArray: Uint8Array, idx: number, maxBytesToRead: number): string {
idx = fixupPointer(idx, 0);
const endIdx = idx + maxBytesToRead;
let endPtr = idx;
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
Expand All @@ -83,6 +84,8 @@ export function utf8BufferToString (heapOrArray: Uint8Array, idx: number, maxByt
}

export function utf16ToString (startPtr: number, endPtr: number): string {
startPtr = fixupPointer(startPtr, 0);
endPtr = fixupPointer(endPtr, 0);
if (_text_decoder_utf16) {
const subArray = viewOrCopy(localHeapViewU8(), startPtr as any, endPtr as any);
return _text_decoder_utf16.decode(subArray);
Expand Down
10 changes: 5 additions & 5 deletions src/mono/browser/runtime/web-socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import WasmEnableThreads from "consts:wasmEnableThreads";
import { prevent_timer_throttling } from "./scheduling";
import { Queue } from "./queue";
import { ENVIRONMENT_IS_NODE, ENVIRONMENT_IS_SHELL, createPromiseController, loaderHelpers, mono_assert, Module } from "./globals";
import { setI32, localHeapViewU8, forceThreadMemoryViewRefresh } from "./memory";
import { setI32, localHeapViewU8, forceThreadMemoryViewRefresh, fixupPointer } from "./memory";
import { VoidPtr } from "./types/emscripten";
import { PromiseController } from "./types/internal";
import { mono_log_warn } from "./logging";
Expand Down Expand Up @@ -72,7 +72,7 @@ export function ws_wasm_create (uri: string, sub_protocols: string[] | null, rec
ws[wasm_ws_pending_open_promise] = open_promise_control;
ws[wasm_ws_pending_send_promises] = [];
ws[wasm_ws_pending_close_promises] = [];
ws[wasm_ws_receive_status_ptr] = receive_status_ptr;
ws[wasm_ws_receive_status_ptr] = fixupPointer(receive_status_ptr, 0);
ws.binaryType = "arraybuffer";
const local_on_open = () => {
try {
Expand Down Expand Up @@ -185,7 +185,7 @@ export function ws_wasm_send (ws: WebSocketExtension, buffer_ptr: VoidPtr, buffe
return resolvedPromise();
}

const buffer_view = new Uint8Array(localHeapViewU8().buffer, <any>buffer_ptr, buffer_length);
const buffer_view = new Uint8Array(localHeapViewU8().buffer, fixupPointer(buffer_ptr, 0), buffer_length);
const whole_buffer = web_socket_send_buffering(ws, buffer_view, message_type, end_of_message);

if (!end_of_message || !whole_buffer) {
Expand Down Expand Up @@ -232,7 +232,7 @@ export function ws_wasm_receive (ws: WebSocketExtension, buffer_ptr: VoidPtr, bu

const { promise, promise_control } = createPromiseController<void>();
const receive_promise_control = promise_control as ReceivePromiseControl;
receive_promise_control.buffer_ptr = buffer_ptr;
receive_promise_control.buffer_ptr = fixupPointer(buffer_ptr, 0);
receive_promise_control.buffer_length = buffer_length;
receive_promise_queue.enqueue(receive_promise_control);

Expand Down Expand Up @@ -402,7 +402,7 @@ function web_socket_receive_buffering (ws: WebSocketExtension, event_queue: Queu
const count = Math.min(buffer_length, event.data.length - event.offset);
if (count > 0) {
const sourceView = event.data.subarray(event.offset, event.offset + count);
const bufferView = new Uint8Array(localHeapViewU8().buffer, <any>buffer_ptr, buffer_length);
const bufferView = new Uint8Array(localHeapViewU8().buffer, fixupPointer(buffer_ptr, 0), buffer_length);
bufferView.set(sourceView, 0);
event.offset += count;
}
Expand Down
Loading