/// <summary> /// Initializes the given object depending on the given type declaration /// </summary> /// <param name="createdObject">A new object to be initialized</param> /// <param name="typeDeclaration">Type declaration used to initialize the given object</param> public void InitializeObject(ObjectValue createdObject, ClassDecl typeDeclaration) { Debug.Assert(thisObject == null, "Created object must be selected after enter to method"); try { thisObject = createdObject; Debug.Assert(thisObject != null, "Initialized object must stay until end of initialization"); ReadSnapshotEntryBase objectEntry = OutSet.CreateSnapshotEntry(new MemoryEntry(createdObject)); List <QualifiedName> classHierarchy = new List <QualifiedName>(typeDeclaration.BaseClasses); classHierarchy.Add(typeDeclaration.QualifiedName); Dictionary <VariableName, FieldInfo> currentClassFields = new Dictionary <VariableName, FieldInfo>(); foreach (var className in classHierarchy) { foreach (var entry in typeDeclaration.Fields.Where(a => a.Key.ClassName.Equals(className))) { if (entry.Value.IsStatic == false) { currentClassFields[entry.Key.Name] = entry.Value; } } } foreach (var entry in currentClassFields.Values) { var fieldEntry = objectEntry.ReadField(OutSet.Snapshot, new VariableIdentifier(entry.Name.Value)); if (entry.InitValue != null) { fieldEntry.WriteMemory(OutSet.Snapshot, entry.InitValue); } else if (entry.Initializer != null) { entry.Initializer.VisitMe(this); fieldEntry.WriteMemory(OutSet.Snapshot, initializationValue); } else { fieldEntry.WriteMemory(OutSet.Snapshot, new MemoryEntry(OutSet.UndefinedValue)); } } } finally { thisObject = null; } }
public override ReadWriteSnapshotEntryBase ResolveField(ReadSnapshotEntryBase objectValue, VariableIdentifier field) { return(objectValue.ReadField(OutSnapshot, field)); }