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);
|
||||
},
|
||||
|
||||
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 {
|
||||
const dataPtr = getArrayDataPointer(array);
|
||||
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;
|
||||
},
|
||||
|
||||
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');
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -18,9 +18,11 @@ declare interface BINDING {
|
|||
mono_array_to_js_array<TInput, TOutput>(array: System_Array<TInput>) : Array<TOutput>;
|
||||
conv_string(dotnetString: System_String | null): string | null;
|
||||
bind_static_method(fqn: string, signature?: string): Function;
|
||||
unbox_mono_obj(object: System_Object): any;
|
||||
}
|
||||
|
||||
declare global {
|
||||
var MONO: MONO;
|
||||
var BINDING: BINDING;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ export interface Platform {
|
|||
|
||||
callEntryPoint(assemblyName: string): void;
|
||||
|
||||
toJavaScriptString(dotNetString: System_String): string;
|
||||
toUint8Array(array: System_Array<any>): Uint8Array;
|
||||
|
||||
getArrayLength(array: System_Array<any>): number;
|
||||
|
|
@ -17,7 +16,7 @@ export interface Platform {
|
|||
readUint64Field(baseAddress: Pointer, fieldOffset?: number): number;
|
||||
readFloatField(baseAddress: Pointer, fieldOffset?: number): number;
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ const frameReader = {
|
|||
textContent: (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),
|
||||
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),
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue