internal static RawStrongPointer ConvertStrongPointer(DataCoreCompiler compiler, DataCoreDatabase database, IDataCorePointer dataCorePointer) { var rawStrongPointer = new RawStrongPointer(); rawStrongPointer.StructIndex = -1; rawStrongPointer.VariantIndex = -1; var pointerValue = dataCorePointer; var instance = pointerValue?.InstanceObject; if (instance != null) { var structureType = instance.GetType(); var structureIndex = database.ManagedStructureTypes.IndexOf(structureType); var structureDataTable = compiler.ManagedDataTable[structureType]; //TODO: Instead of appending the data, we should rebuild from scratch each time if (!structureDataTable.Contains(instance)) { structureDataTable.Add(instance); } var variantIndex = structureDataTable.IndexOf(instance); rawStrongPointer.StructIndex = structureIndex; rawStrongPointer.VariantIndex = variantIndex; } if (rawStrongPointer.StructIndex == -1 || rawStrongPointer.VariantIndex == -1) { if (rawStrongPointer.StructIndex != -1 && rawStrongPointer.VariantIndex != -1) { throw new Exception("Invalid strong pointer"); } } return(rawStrongPointer); }
internal StrongPointerFixup(DataCoreDatabase database, object instance, PropertyInfo info, RawStrongPointer pointer) : base(database, instance, info) { Pointer = pointer; }