In TypeScript, regard System_Array type as generic, even though the type param refers to the entry pointer type, not the element type
This commit is contained in:
parent
855d93ce67
commit
8839a6c558
|
|
@ -97,14 +97,14 @@ export const monoPlatform: Platform = {
|
||||||
return mono_string(jsString);
|
return mono_string(jsString);
|
||||||
},
|
},
|
||||||
|
|
||||||
getArrayLength: function getArrayLength(array: System_Array): number {
|
getArrayLength: function getArrayLength(array: System_Array<any>): number {
|
||||||
return Module.getValue(getArrayDataPointer(array), 'i32');
|
return Module.getValue(getArrayDataPointer(array), 'i32');
|
||||||
},
|
},
|
||||||
|
|
||||||
getArrayEntryPtr: function getArrayEntryPtr(array: System_Array, index: number, itemSize: number): Pointer {
|
getArrayEntryPtr: function getArrayEntryPtr<TPtr extends Pointer>(array: System_Array<TPtr>, index: number, itemSize: number): TPtr {
|
||||||
// First byte is array length, followed by entries
|
// First byte is array length, followed by entries
|
||||||
const address = getArrayDataPointer(array) + 4 + index * itemSize;
|
const address = getArrayDataPointer(array) + 4 + index * itemSize;
|
||||||
return address as any as Pointer;
|
return address as any as TPtr;
|
||||||
},
|
},
|
||||||
|
|
||||||
getObjectFieldsBaseAddress: function getObjectFieldsBaseAddress(referenceTypedObject: System_Object): Pointer {
|
getObjectFieldsBaseAddress: function getObjectFieldsBaseAddress(referenceTypedObject: System_Object): Pointer {
|
||||||
|
|
@ -201,6 +201,6 @@ function asyncLoad(url, onload, onerror) {
|
||||||
xhr.send(null);
|
xhr.send(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getArrayDataPointer(array: System_Array): number {
|
function getArrayDataPointer<T>(array: System_Array<T>): number {
|
||||||
return <number><any>array + 12; // First byte from here is length, then following bytes are entries
|
return <number><any>array + 12; // First byte from here is length, then following bytes are entries
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@
|
||||||
toJavaScriptString(dotNetString: System_String): string;
|
toJavaScriptString(dotNetString: System_String): string;
|
||||||
toDotNetString(javaScriptString: string): System_String;
|
toDotNetString(javaScriptString: string): System_String;
|
||||||
|
|
||||||
getArrayLength(array: System_Array): number;
|
getArrayLength(array: System_Array<any>): number;
|
||||||
getArrayEntryPtr(array: System_Array, index: number, itemSize: number): Pointer;
|
getArrayEntryPtr<TPtr extends Pointer>(array: System_Array<TPtr>, index: number, itemSize: number): TPtr;
|
||||||
|
|
||||||
getObjectFieldsBaseAddress(referenceTypedObject: System_Object): Pointer;
|
getObjectFieldsBaseAddress(referenceTypedObject: System_Object): Pointer;
|
||||||
readInt32Field(baseAddress: Pointer, fieldOffset?: number): number;
|
readInt32Field(baseAddress: Pointer, fieldOffset?: number): number;
|
||||||
|
|
@ -24,5 +24,5 @@
|
||||||
export interface MethodHandle { MethodHandle__DO_NOT_IMPLEMENT: any };
|
export interface MethodHandle { MethodHandle__DO_NOT_IMPLEMENT: any };
|
||||||
export interface System_Object { System_Object__DO_NOT_IMPLEMENT: any };
|
export interface System_Object { System_Object__DO_NOT_IMPLEMENT: any };
|
||||||
export interface System_String extends System_Object { System_String__DO_NOT_IMPLEMENT: any }
|
export interface System_String extends System_Object { System_String__DO_NOT_IMPLEMENT: any }
|
||||||
export interface System_Array extends System_Object { System_Array__DO_NOT_IMPLEMENT: any }
|
export interface System_Array<T> extends System_Object { System_Array__DO_NOT_IMPLEMENT: any }
|
||||||
export interface Pointer { Pointer__DO_NOT_IMPLEMENT: any }
|
export interface Pointer { Pointer__DO_NOT_IMPLEMENT: any }
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { System_Array, MethodHandle } from '../Platform/Platform';
|
import { System_Array, MethodHandle } from '../Platform/Platform';
|
||||||
import { getRenderTreeEditPtr, renderTreeEdit, EditType } from './RenderTreeEdit';
|
import { getRenderTreeEditPtr, renderTreeEdit, RenderTreeEditPointer, EditType } from './RenderTreeEdit';
|
||||||
import { getTreeNodePtr, renderTreeNode, NodeType, RenderTreeNodePointer } from './RenderTreeNode';
|
import { getTreeNodePtr, renderTreeNode, NodeType, RenderTreeNodePointer } from './RenderTreeNode';
|
||||||
import { platform } from '../Environment';
|
import { platform } from '../Environment';
|
||||||
let raiseEventMethod: MethodHandle;
|
let raiseEventMethod: MethodHandle;
|
||||||
|
|
@ -18,7 +18,7 @@ export class BrowserRenderer {
|
||||||
this.childComponentLocations[componentId] = element;
|
this.childComponentLocations[componentId] = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public updateComponent(componentId: number, edits: System_Array, editsLength: number, referenceTree: System_Array) {
|
public updateComponent(componentId: number, edits: System_Array<RenderTreeEditPointer>, editsLength: number, referenceTree: System_Array<RenderTreeNodePointer>) {
|
||||||
const element = this.childComponentLocations[componentId];
|
const element = this.childComponentLocations[componentId];
|
||||||
if (!element) {
|
if (!element) {
|
||||||
throw new Error(`No element is currently associated with component ${componentId}`);
|
throw new Error(`No element is currently associated with component ${componentId}`);
|
||||||
|
|
@ -27,7 +27,7 @@ export class BrowserRenderer {
|
||||||
this.applyEdits(componentId, element, 0, edits, editsLength, referenceTree);
|
this.applyEdits(componentId, element, 0, edits, editsLength, referenceTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyEdits(componentId: number, parent: Element, childIndex: number, edits: System_Array, editsLength: number, referenceTree: System_Array) {
|
applyEdits(componentId: number, parent: Element, childIndex: number, edits: System_Array<RenderTreeEditPointer>, editsLength: number, referenceTree: System_Array<RenderTreeNodePointer>) {
|
||||||
let currentDepth = 0;
|
let currentDepth = 0;
|
||||||
let childIndexAtCurrentDepth = childIndex;
|
let childIndexAtCurrentDepth = childIndex;
|
||||||
for (let editIndex = 0; editIndex < editsLength; editIndex++) {
|
for (let editIndex = 0; editIndex < editsLength; editIndex++) {
|
||||||
|
|
@ -88,7 +88,7 @@ export class BrowserRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
insertNode(componentId: number, parent: Element, childIndex: number, nodes: System_Array, node: RenderTreeNodePointer, nodeIndex: number) {
|
insertNode(componentId: number, parent: Element, childIndex: number, nodes: System_Array<RenderTreeNodePointer>, node: RenderTreeNodePointer, nodeIndex: number) {
|
||||||
const nodeType = renderTreeNode.nodeType(node);
|
const nodeType = renderTreeNode.nodeType(node);
|
||||||
switch (nodeType) {
|
switch (nodeType) {
|
||||||
case NodeType.element:
|
case NodeType.element:
|
||||||
|
|
@ -108,7 +108,7 @@ export class BrowserRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
insertElement(componentId: number, parent: Element, childIndex: number, nodes: System_Array, node: RenderTreeNodePointer, nodeIndex: number) {
|
insertElement(componentId: number, parent: Element, childIndex: number, nodes: System_Array<RenderTreeNodePointer>, node: RenderTreeNodePointer, nodeIndex: number) {
|
||||||
const tagName = renderTreeNode.elementName(node)!;
|
const tagName = renderTreeNode.elementName(node)!;
|
||||||
const newDomElement = document.createElement(tagName);
|
const newDomElement = document.createElement(tagName);
|
||||||
insertNodeIntoDOM(newDomElement, parent, childIndex);
|
insertNodeIntoDOM(newDomElement, parent, childIndex);
|
||||||
|
|
@ -196,7 +196,7 @@ export class BrowserRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
insertNodeRange(componentId: number, parent: Element, childIndex: number, nodes: System_Array, startIndex: number, endIndex: number) {
|
insertNodeRange(componentId: number, parent: Element, childIndex: number, nodes: System_Array<RenderTreeNodePointer>, startIndex: number, endIndex: number) {
|
||||||
for (let index = startIndex; index <= endIndex; index++) {
|
for (let index = startIndex; index <= endIndex; index++) {
|
||||||
const node = getTreeNodePtr(nodes, index);
|
const node = getTreeNodePtr(nodes, index);
|
||||||
this.insertNode(componentId, parent, childIndex, nodes, node, index);
|
this.insertNode(componentId, parent, childIndex, nodes, node, index);
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,29 @@
|
||||||
import { Pointer, System_Array } from '../Platform/Platform';
|
import { Pointer, System_Array } from '../Platform/Platform';
|
||||||
import { platform } from '../Environment';
|
import { platform } from '../Environment';
|
||||||
|
import { RenderTreeNodePointer } from './RenderTreeNode';
|
||||||
|
import { RenderTreeEditPointer } from './RenderTreeEdit';
|
||||||
|
|
||||||
// Keep in sync with the structs in .NET code
|
// Keep in sync with the structs in .NET code
|
||||||
|
|
||||||
export const renderBatch = {
|
export const renderBatch = {
|
||||||
updatedComponents: (obj: RenderBatchPointer) => platform.readStructField<ArrayRangePointer>(obj, 0),
|
updatedComponents: (obj: RenderBatchPointer) => platform.readStructField<ArrayRangePointer<RenderTreeDiffPointer>>(obj, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
const arrayRangeStructLength = 8;
|
const arrayRangeStructLength = 8;
|
||||||
export const arrayRange = {
|
export const arrayRange = {
|
||||||
array: (obj: ArrayRangePointer) => platform.readObjectField<System_Array>(obj, 0),
|
array: <T>(obj: ArrayRangePointer<T>) => platform.readObjectField<System_Array<T>>(obj, 0),
|
||||||
count: (obj: ArrayRangePointer) => platform.readInt32Field(obj, 4),
|
count: <T>(obj: ArrayRangePointer<T>) => platform.readInt32Field(obj, 4),
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderTreeDiffStructLength = 4 + 2 * arrayRangeStructLength;
|
export const renderTreeDiffStructLength = 4 + 2 * arrayRangeStructLength;
|
||||||
export const renderTreeDiff = {
|
export const renderTreeDiff = {
|
||||||
componentId: (obj: RenderTreeDiffPointer) => platform.readInt32Field(obj, 0),
|
componentId: (obj: RenderTreeDiffPointer) => platform.readInt32Field(obj, 0),
|
||||||
edits: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer>(obj, 4),
|
edits: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer<RenderTreeEditPointer>>(obj, 4),
|
||||||
currentState: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer>(obj, 4 + arrayRangeStructLength),
|
currentState: (obj: RenderTreeDiffPointer) => platform.readStructField<ArrayRangePointer<RenderTreeNodePointer>>(obj, 4 + arrayRangeStructLength),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Nominal types to ensure only valid pointers are passed to the functions above.
|
// Nominal types to ensure only valid pointers are passed to the functions above.
|
||||||
// At runtime the values are just numbers.
|
// At runtime the values are just numbers.
|
||||||
export interface RenderBatchPointer extends Pointer { RenderBatchPointer__DO_NOT_IMPLEMENT: any }
|
export interface RenderBatchPointer extends Pointer { RenderBatchPointer__DO_NOT_IMPLEMENT: any }
|
||||||
export interface ArrayRangePointer extends Pointer { ArrayRangePointer__DO_NOT_IMPLEMENT: any }
|
export interface ArrayRangePointer<T> extends Pointer { ArrayRangePointer__DO_NOT_IMPLEMENT: any }
|
||||||
export interface RenderTreeDiffPointer extends Pointer { RenderTreeDiffPointer__DO_NOT_IMPLEMENT: any }
|
export interface RenderTreeDiffPointer extends Pointer { RenderTreeDiffPointer__DO_NOT_IMPLEMENT: any }
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
import { platform } from '../Environment';
|
import { platform } from '../Environment';
|
||||||
const renderTreeEditStructLength = 16;
|
const renderTreeEditStructLength = 16;
|
||||||
|
|
||||||
export function getRenderTreeEditPtr(renderTreeEdits: System_Array, index: number): RenderTreeEditPointer {
|
export function getRenderTreeEditPtr(renderTreeEdits: System_Array<RenderTreeEditPointer>, index: number) {
|
||||||
return platform.getArrayEntryPtr(renderTreeEdits, index, renderTreeEditStructLength) as RenderTreeEditPointer;
|
return platform.getArrayEntryPtr(renderTreeEdits, index, renderTreeEditStructLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const renderTreeEdit = {
|
export const renderTreeEdit = {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ const renderTreeNodeStructLength = 40;
|
||||||
// we work in terms of pointers to the structs on the .NET heap, and use static functions that
|
// we work in terms of pointers to the structs on the .NET heap, and use static functions that
|
||||||
// know how to read property values from those structs.
|
// know how to read property values from those structs.
|
||||||
|
|
||||||
export function getTreeNodePtr(renderTreeEntries: System_Array, index: number): RenderTreeNodePointer {
|
export function getTreeNodePtr(renderTreeEntries: System_Array<RenderTreeNodePointer>, index: number) {
|
||||||
return platform.getArrayEntryPtr(renderTreeEntries, index, renderTreeNodeStructLength) as RenderTreeNodePointer;
|
return platform.getArrayEntryPtr(renderTreeEntries, index, renderTreeNodeStructLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const renderTreeNode = {
|
export const renderTreeNode = {
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,11 @@ export function renderBatch(browserRendererId: number, batch: RenderBatchPointer
|
||||||
const updatedComponentsLength = arrayRange.count(updatedComponents);
|
const updatedComponentsLength = arrayRange.count(updatedComponents);
|
||||||
const updatedComponentsArray = arrayRange.array(updatedComponents);
|
const updatedComponentsArray = arrayRange.array(updatedComponents);
|
||||||
for (var i = 0; i < updatedComponentsLength; i++) {
|
for (var i = 0; i < updatedComponentsLength; i++) {
|
||||||
const updatedComponentDiff = platform.getArrayEntryPtr(updatedComponentsArray, i, renderTreeDiffStructLength) as RenderTreeDiffPointer;
|
const diff = platform.getArrayEntryPtr(updatedComponentsArray, i, renderTreeDiffStructLength);
|
||||||
const componentId = renderTreeDiff.componentId(updatedComponentDiff);
|
const componentId = renderTreeDiff.componentId(diff);
|
||||||
|
|
||||||
const editsArrayRange = renderTreeDiff.edits(updatedComponentDiff);
|
const editsArrayRange = renderTreeDiff.edits(diff);
|
||||||
const currentStateArrayRange = renderTreeDiff.currentState(updatedComponentDiff);
|
const currentStateArrayRange = renderTreeDiff.currentState(diff);
|
||||||
|
|
||||||
const edits = arrayRange.array(editsArrayRange);
|
const edits = arrayRange.array(editsArrayRange);
|
||||||
const editsLength = arrayRange.count(editsArrayRange);
|
const editsLength = arrayRange.count(editsArrayRange);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue