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:
Pranav K 2020-04-02 07:51:57 -07:00 committed by GitHub
parent ae569e2b48
commit dd2f0c9d90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 18 deletions

File diff suppressed because one or more lines are too long

View File

@ -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 {

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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),
};