|
|
@@ -1,6 +1,6 @@
|
|
|
import { platform } from '../../Environment';
|
|
|
-import { RenderBatch, ArrayRange, ArrayRangeReader, ArraySegment, RenderTreeDiff, RenderTreeEdit, RenderTreeFrame, ArrayValues, EditType, FrameType, RenderTreeFrameReader } from './RenderBatch';
|
|
|
-import { Pointer, System_Array } from '../../Platform/Platform';
|
|
|
+import { RenderBatch, ArrayRange, ArrayRangeReader, ArrayBuilderSegment, RenderTreeDiff, RenderTreeEdit, RenderTreeFrame, ArrayValues, EditType, FrameType, RenderTreeFrameReader } from './RenderBatch';
|
|
|
+import { Pointer, System_Array, System_Object } from '../../Platform/Platform';
|
|
|
|
|
|
// Used when running on Mono WebAssembly for shared-memory interop. The code here encapsulates
|
|
|
// our knowledge of the memory layout of RenderBatch and all referenced types.
|
|
|
@@ -49,7 +49,7 @@ export class SharedMemoryRenderBatch implements RenderBatch {
|
|
|
|
|
|
arrayRangeReader = arrayRangeReader;
|
|
|
|
|
|
- arraySegmentReader = arraySegmentReader;
|
|
|
+ arrayBuilderSegmentReader = arrayBuilderSegmentReader;
|
|
|
|
|
|
diffReader = diffReader;
|
|
|
|
|
|
@@ -65,19 +65,24 @@ const arrayRangeReader = {
|
|
|
count: <T>(arrayRange: ArrayRange<T>) => platform.readInt32Field(arrayRange as any, 4),
|
|
|
};
|
|
|
|
|
|
-// Keep in sync with memory layout in ArraySegment
|
|
|
-const arraySegmentReader = {
|
|
|
+// Keep in sync with memory layout in ArrayBuilderSegment
|
|
|
+const arrayBuilderSegmentReader = {
|
|
|
structLength: 12,
|
|
|
- values: <T>(arraySegment: ArraySegment<T>) => platform.readObjectField<System_Array<T>>(arraySegment as any, 0) as any as ArrayValues<T>,
|
|
|
- offset: <T>(arraySegment: ArraySegment<T>) => platform.readInt32Field(arraySegment as any, 4),
|
|
|
- count: <T>(arraySegment: ArraySegment<T>) => platform.readInt32Field(arraySegment as any, 8),
|
|
|
+ values: <T>(arrayBuilderSegment: ArrayBuilderSegment<T>) => {
|
|
|
+ // Evaluate arrayBuilderSegment->_builder->_items, i.e., two dereferences needed
|
|
|
+ const builder = platform.readObjectField<System_Object>(arrayBuilderSegment as any, 0);
|
|
|
+ const builderFieldsAddress = platform.getObjectFieldsBaseAddress(builder);
|
|
|
+ return platform.readObjectField<System_Array<T>>(builderFieldsAddress, 0) as any as ArrayValues<T>;
|
|
|
+ },
|
|
|
+ offset: <T>(arrayBuilderSegment: ArrayBuilderSegment<T>) => platform.readInt32Field(arrayBuilderSegment as any, 4),
|
|
|
+ count: <T>(arrayBuilderSegment: ArrayBuilderSegment<T>) => platform.readInt32Field(arrayBuilderSegment as any, 8),
|
|
|
};
|
|
|
|
|
|
// Keep in sync with memory layout in RenderTreeDiff.cs
|
|
|
const diffReader = {
|
|
|
- structLength: 4 + arraySegmentReader.structLength,
|
|
|
+ structLength: 4 + arrayBuilderSegmentReader.structLength,
|
|
|
componentId: (diff: RenderTreeDiff) => platform.readInt32Field(diff as any, 0),
|
|
|
- edits: (diff: RenderTreeDiff) => platform.readStructField<Pointer>(diff as any, 4) as any as ArraySegment<RenderTreeEdit>,
|
|
|
+ edits: (diff: RenderTreeDiff) => platform.readStructField<Pointer>(diff as any, 4) as any as ArrayBuilderSegment<RenderTreeEdit>,
|
|
|
editsEntry: (values: ArrayValues<RenderTreeEdit>, index: number) => arrayValuesEntry(values, index, editReader.structLength),
|
|
|
};
|
|
|
|