Remove the use of toJavaScriptString (#20260)
* Allow readString to optionally read boolean values as string Fixes https://github.com/dotnet/aspnetcore/issues/19784
This commit is contained in:
parent
ae569e2b48
commit
dd2f0c9d90
File diff suppressed because one or more lines are too long
|
|
@ -41,17 +41,6 @@ export const monoPlatform: Platform = {
|
||||||
invokeEntrypoint(assemblyName, null);
|
invokeEntrypoint(assemblyName, null);
|
||||||
},
|
},
|
||||||
|
|
||||||
toJavaScriptString: function toJavaScriptString(managedString: System_String) {
|
|
||||||
// Comments from original Mono sample:
|
|
||||||
// FIXME this is wastefull, we could remove the temp malloc by going the UTF16 route
|
|
||||||
// FIXME this is unsafe, cuz raw objects could be GC'd.
|
|
||||||
|
|
||||||
const utf8 = mono_string_get_utf8(managedString);
|
|
||||||
const res = (<any>window['Module']).UTF8ToString(utf8);
|
|
||||||
Module._free(utf8 as any);
|
|
||||||
return res;
|
|
||||||
},
|
|
||||||
|
|
||||||
toUint8Array: function toUint8Array(array: System_Array<any>): Uint8Array {
|
toUint8Array: function toUint8Array(array: System_Array<any>): Uint8Array {
|
||||||
const dataPtr = getArrayDataPointer(array);
|
const dataPtr = getArrayDataPointer(array);
|
||||||
const length = Module.getValue(dataPtr, 'i32');
|
const length = Module.getValue(dataPtr, 'i32');
|
||||||
|
|
@ -102,9 +91,23 @@ export const monoPlatform: Platform = {
|
||||||
return Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32') as any as T;
|
return Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32') as any as T;
|
||||||
},
|
},
|
||||||
|
|
||||||
readStringField: function readHeapObject(baseAddress: Pointer, fieldOffset?: number): string | null {
|
readStringField: function readHeapObject(baseAddress: Pointer, fieldOffset?: number, readBoolValueAsString?: boolean): string | null {
|
||||||
const fieldValue = Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32');
|
const fieldValue = Module.getValue((baseAddress as any as number) + (fieldOffset || 0), 'i32');
|
||||||
return fieldValue === 0 ? null : monoPlatform.toJavaScriptString(fieldValue as any as System_String);
|
if (fieldValue === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readBoolValueAsString) {
|
||||||
|
// Some fields are stored as a union of bool | string | null values, but need to read as a string.
|
||||||
|
// If the stored value is a bool, the behavior we want is empty string ('') for true, or null for false.
|
||||||
|
const unboxedValue = BINDING.unbox_mono_obj(fieldValue as any as System_Object);
|
||||||
|
if (typeof (unboxedValue) === 'boolean') {
|
||||||
|
return unboxedValue ? '' : null;
|
||||||
|
}
|
||||||
|
return unboxedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BINDING.conv_string(fieldValue as any as System_String);
|
||||||
},
|
},
|
||||||
|
|
||||||
readStructField: function readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T {
|
readStructField: function readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T {
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,11 @@ declare interface BINDING {
|
||||||
mono_array_to_js_array<TInput, TOutput>(array: System_Array<TInput>) : Array<TOutput>;
|
mono_array_to_js_array<TInput, TOutput>(array: System_Array<TInput>) : Array<TOutput>;
|
||||||
conv_string(dotnetString: System_String | null): string | null;
|
conv_string(dotnetString: System_String | null): string | null;
|
||||||
bind_static_method(fqn: string, signature?: string): Function;
|
bind_static_method(fqn: string, signature?: string): Function;
|
||||||
|
unbox_mono_obj(object: System_Object): any;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
var MONO: MONO;
|
var MONO: MONO;
|
||||||
var BINDING: BINDING;
|
var BINDING: BINDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ export interface Platform {
|
||||||
|
|
||||||
callEntryPoint(assemblyName: string): void;
|
callEntryPoint(assemblyName: string): void;
|
||||||
|
|
||||||
toJavaScriptString(dotNetString: System_String): string;
|
|
||||||
toUint8Array(array: System_Array<any>): Uint8Array;
|
toUint8Array(array: System_Array<any>): Uint8Array;
|
||||||
|
|
||||||
getArrayLength(array: System_Array<any>): number;
|
getArrayLength(array: System_Array<any>): number;
|
||||||
|
|
@ -17,7 +16,7 @@ export interface Platform {
|
||||||
readUint64Field(baseAddress: Pointer, fieldOffset?: number): number;
|
readUint64Field(baseAddress: Pointer, fieldOffset?: number): number;
|
||||||
readFloatField(baseAddress: Pointer, fieldOffset?: number): number;
|
readFloatField(baseAddress: Pointer, fieldOffset?: number): number;
|
||||||
readObjectField<T extends System_Object>(baseAddress: Pointer, fieldOffset?: number): T;
|
readObjectField<T extends System_Object>(baseAddress: Pointer, fieldOffset?: number): T;
|
||||||
readStringField(baseAddress: Pointer, fieldOffset?: number): string | null;
|
readStringField(baseAddress: Pointer, fieldOffset?: number, readBoolValueAsString?: boolean): string | null;
|
||||||
readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T;
|
readStructField<T extends Pointer>(baseAddress: Pointer, fieldOffset?: number): T;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ const frameReader = {
|
||||||
textContent: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16),
|
textContent: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16),
|
||||||
markupContent: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16)!,
|
markupContent: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16)!,
|
||||||
attributeName: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16),
|
attributeName: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 16),
|
||||||
attributeValue: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 24),
|
attributeValue: (frame: RenderTreeFrame) => platform.readStringField(frame as any, 24, true),
|
||||||
attributeEventHandlerId: (frame: RenderTreeFrame) => platform.readUint64Field(frame as any, 8),
|
attributeEventHandlerId: (frame: RenderTreeFrame) => platform.readUint64Field(frame as any, 8),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue