Пример #1
0
        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);
        }
Пример #2
0
 internal StrongPointerFixup(DataCoreDatabase database, object instance, PropertyInfo info, RawStrongPointer pointer)
     : base(database, instance, info)
 {
     Pointer = pointer;
 }