let testError = true;
try {
+ const originalFetch = globalThis.fetch;
+ globalThis.fetch = (url, fetchArgs) => {
+ console.log("fetching " + url);
+ // we are testing that we can retry loading of the assembly
+ if (testAbort && url.indexOf('System.Private.CoreLib') != -1) {
+ testAbort = false;
+ return originalFetch(url + "?testAbort=true", fetchArgs);
+ }
+ if (testError && url.indexOf('System.Console') != -1) {
+ testError = false;
+ return originalFetch(url + "?testError=true", fetchArgs);
+ }
+ return originalFetch(url, fetchArgs);
+ };
const { runtimeBuildInfo, setModuleImports, getAssemblyExports, runMain, getConfig, Module } = await dotnet
.withElementOnExit()
// 'withModuleConfig' is internal lower level API
// here we show how emscripten could be further configured
- // It is prefered to use specific 'with***' methods instead in all other cases.
+ // It is preferred to use specific 'with***' methods instead in all other cases.
.withModuleConfig({
configSrc: "./_framework/blazor.boot.json",
onConfigLoaded: (config) => {
config.environmentVariables["MONO_LOG_LEVEL"] = "debug";
config.browserProfilerOptions = {};
},
- imports: {
- fetch: (url, fetchArgs) => {
- console.log("fetching " + url);
- // we are testing that we can retry loading of the assembly
- if (testAbort && url.indexOf('System.Private.CoreLib') != -1) {
- testAbort = false;
- return fetch(url + "?testAbort=true", fetchArgs);
- }
- if (testError && url.indexOf('System.Console') != -1) {
- testError = false;
- return fetch(url + "?testError=true", fetchArgs);
- }
- return fetch(url, fetchArgs);
- }
- },
preInit: () => { console.log('user code Module.preInit'); },
preRun: () => { console.log('user code Module.preRun'); },
onRuntimeInitialized: () => {
sizeOfDataItem, sizeOfV128, sizeOfStackval,
disabledOpcodes, countCallTargets,
- callTargetCounts, trapTraceErrors,
+ callTargetCounts,
trace, traceOnError, traceOnRuntimeError,
emitPadding, traceBranchDisplacements,
traceEip, nullCheckValidation,
(opcode <= MintOpcode.MINT_RET_I8_IMM)
)
) {
- if (isConditionallyExecuted || trapTraceErrors || builder.options.countBailouts) {
+ if (isConditionallyExecuted || builder.options.countBailouts) {
// Not an exit, because returns are normal and we don't want to make them more expensive.
// FIXME: Or do we want to record them? Early conditional returns might reduce the value of a trace,
// but the main problem is more likely to be calls early in traces. Worth testing later.
traceTooSmall = false,
// For instrumented methods, trace their exact IP during execution
traceEip = false,
- // Wraps traces in a JS function that will trap errors and log the trace responsible.
- // Very expensive!!!!
- trapTraceErrors = false,
// When eliminating a null check, replace it with a runtime 'not null' assertion
// that will print a diagnostic message if the value is actually null or if
// the value does not match the value on the native interpreter stack in memory
export let traceBuilder: WasmBuilder;
export let traceImports: Array<[string, string, Function]> | undefined;
-export let _wrap_trace_function: Function;
-
const mathOps1d =
[
"asin",
return traceImports;
}
-function wrap_trace_function(
- f: Function, name: string, traceBuf: any,
- base: MintOpcodePtr, instrumentedTraceId: number
-) {
- const tup = instrumentedTraces[instrumentedTraceId];
- if (instrumentedTraceId)
- console.log(`instrumented ${tup.name}`);
-
- if (!_wrap_trace_function) {
- // If we used a regular closure, the js console would print the entirety of
- // dotnet.native.js when printing an error stack trace, which is... not helpful
- const js = `return function trace_enter (locals) {
- let threw = true;
- try {
- let result = trace(locals);
- threw = false;
- return result;
- } finally {
- if (threw) {
- let msg = "Unhandled error in trace '" + name + "'";
- if (tup) {
- msg += " at offset " + (tup.eip + base).toString(16);
- msg += " with most recent operands " + tup.operand1.toString(16) + ", " + tup.operand2.toString(16);
- }
- console.error(msg);
- if (traceBuf) {
- for (let i = 0, l = traceBuf.length; i < l; i++)
- console.log(traceBuf[i]);
- }
- }
- }
- };`;
- _wrap_trace_function = new Function("trace", "name", "traceBuf", "tup", "base", js);
- }
- return _wrap_trace_function(
- f, name, traceBuf, instrumentedTraces[instrumentedTraceId], base
- );
-}
-
function initialize_builder(builder: WasmBuilder) {
// Function type for compiled traces
builder.defineType(
WasmValtype.i32, true
);
builder.defineType(
- "copy_ptr", {
+ "copy_ptr",
+ {
"dest": WasmValtype.i32,
"src": WasmValtype.i32
},
WasmValtype.i32, true
);
builder.defineType(
- "simd_p_p", {
+ "simd_p_p",
+ {
"arg0": WasmValtype.i32,
"arg1": WasmValtype.i32,
- }, WasmValtype.void, true
+ },
+ WasmValtype.void, true
);
builder.defineType(
- "simd_p_pp", {
+ "simd_p_pp",
+ {
"arg0": WasmValtype.i32,
"arg1": WasmValtype.i32,
"arg2": WasmValtype.i32,
- }, WasmValtype.void, true
+ },
+ WasmValtype.void, true
);
builder.defineType(
- "simd_p_ppp", {
+ "simd_p_ppp",
+ {
"arg0": WasmValtype.i32,
"arg1": WasmValtype.i32,
"arg2": WasmValtype.i32,
"arg3": WasmValtype.i32,
- }, WasmValtype.void, true
+ },
+ WasmValtype.void, true
);
const traceImports = getTraceImports();
rejected = false;
mono_assert(!runtimeHelpers.storeMemorySnapshotPending, "Attempting to set function into table during creation of memory snapshot");
- const idx =
- trapTraceErrors
- ? Module.addFunction(
- wrap_trace_function(
- <any>fn, methodFullName || methodName, traceOnRuntimeError ? builder.traceBuf : undefined,
- builder.base, instrumentedTraceId
- ), "iii"
- )
- : addWasmFunctionPointer(<any>fn);
+ const idx = addWasmFunctionPointer(<any>fn);
if (!idx)
throw new Error("add_function_pointer returned a 0 index");
else if (trace >= 2)
counters.traceCandidates++;
let methodFullName: string | undefined;
- if (trapTraceErrors || mostRecentOptions.estimateHeat || (instrumentedMethodNames.length > 0) || useFullNames) {
+ if (mostRecentOptions.estimateHeat || (instrumentedMethodNames.length > 0) || useFullNames) {
const pMethodName = cwraps.mono_wasm_method_get_full_name(method);
methodFullName = Module.UTF8ToString(pMethodName);
Module._free(<any>pMethodName);
for (const k in counters.simdFallback)
console.log(`// simd ${k}: ${counters.simdFallback[k]} fallback insn(s)`);
- if ((typeof(globalThis.setTimeout) === "function") && (b !== undefined))
+ if ((typeof (globalThis.setTimeout) === "function") && (b !== undefined))
setTimeout(
() => jiterpreter_dump_stats(b),
15000