|
@@ -2039,6 +2039,9 @@ void laSetActiveInstance(laProp *sub, void *FromInstance, void *Instance){
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
sp->Set(FromInstance, Instance);
|
|
sp->Set(FromInstance, Instance);
|
|
}
|
|
}
|
|
|
|
+ if(sub->OffsetIsPointer && sub->Offset==0){
|
|
|
|
+ printf("where did that come from\n");
|
|
|
|
+ }
|
|
if (sub->OffsetIsPointer && sub->Offset>=0){
|
|
if (sub->OffsetIsPointer && sub->Offset>=0){
|
|
void **a = (void **)((BYTE *)FromInstance + sub->Offset);
|
|
void **a = (void **)((BYTE *)FromInstance + sub->Offset);
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
@@ -4137,7 +4140,7 @@ void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipIns
|
|
void la_FreeDBProp(laDBProp* dbp, int cleanup_only, int SkipInstances){
|
|
void la_FreeDBProp(laDBProp* dbp, int cleanup_only, int SkipInstances){
|
|
//printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
|
|
//printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
|
|
if(dbp->p->PropertyType==LA_PROP_SUB){
|
|
if(dbp->p->PropertyType==LA_PROP_SUB){
|
|
- if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate||dbp->p->UDFIsSingle)&&(!dbp->p->UDFIsRefer)&&(!SkipInstances)){
|
|
|
|
|
|
+ if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate)&&(!dbp->p->UDFIsRefer)&&(!SkipInstances)){
|
|
laDBSubProp* dsp=dbp; laDBInst* si;
|
|
laDBSubProp* dsp=dbp; laDBInst* si;
|
|
//printf("fdbp %s %x %x %x\n",dbp->p->Identifier,dsp->Instances.pFirst,dsp->Instances.pLast,((laListItem*)dsp->Instances.pFirst)->pNext);
|
|
//printf("fdbp %s %x %x %x\n",dbp->p->Identifier,dsp->Instances.pFirst,dsp->Instances.pLast,((laListItem*)dsp->Instances.pFirst)->pNext);
|
|
while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer),cleanup_only,SkipInstances); }
|
|
while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer),cleanup_only,SkipInstances); }
|
|
@@ -4162,7 +4165,7 @@ void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipIns
|
|
}
|
|
}
|
|
void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
|
|
void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
|
|
//printf("freedc %s\n",dc->p->Identifier);
|
|
//printf("freedc %s\n",dc->p->Identifier);
|
|
- if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate||dc->p->UDFIsSingle) && (!dc->p->UDFIsRefer)){
|
|
|
|
|
|
+ if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate) && (!dc->p->UDFIsRefer)){
|
|
laDiffCommandInst* dci; laDiffCommandSub* dcs=dc;
|
|
laDiffCommandInst* dci; laDiffCommandSub* dcs=dc;
|
|
while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,0); memFree(dci); }
|
|
while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,0); memFree(dci); }
|
|
while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
|
|
while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
|
|
@@ -4252,7 +4255,7 @@ laDiffCommand* la_GiveDiffCommand(laDiff* diff, laDBInst* Instance, laProp* p, v
|
|
if(dc->Instance == Instance && dc->p == p) return dc;
|
|
if(dc->Instance == Instance && dc->p == p) return dc;
|
|
}
|
|
}
|
|
int size=sizeof(laDiffCommand);
|
|
int size=sizeof(laDiffCommand);
|
|
- if(p->PropertyType==LA_PROP_SUB && (!(p->UDFIsRefer||p->UDFIsSingle||p->UDFNoCreate))){size=sizeof(laDiffCommandSub);}
|
|
|
|
|
|
+ if(p->PropertyType==LA_PROP_SUB && (!(p->UDFIsRefer||p->UDFNoCreate))){size=sizeof(laDiffCommandSub);}
|
|
elif(p->PropertyType==LA_PROP_RAW){size=sizeof(laDiffCommandRaw);}
|
|
elif(p->PropertyType==LA_PROP_RAW){size=sizeof(laDiffCommandRaw);}
|
|
laDiffCommand* dc = memAcquire(size);
|
|
laDiffCommand* dc = memAcquire(size);
|
|
dc->Instance=Instance; dc->p=p; dc->Data = Data;
|
|
dc->Instance=Instance; dc->p=p; dc->Data = Data;
|
|
@@ -4347,7 +4350,6 @@ int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp,
|
|
inst = laGetInstance(p, pp->LastPs->UseInstance, &pi);
|
|
inst = laGetInstance(p, pp->LastPs->UseInstance, &pi);
|
|
pp->EndInstance = inst;
|
|
pp->EndInstance = inst;
|
|
while (inst){
|
|
while (inst){
|
|
- if(p->UDFIsSingle){ memTake(inst); /* For single must take or it will be freed. */ }
|
|
|
|
lstAppendPointer(&New, inst);
|
|
lstAppendPointer(&New, inst);
|
|
inst = laGetNextInstance(p, inst, &pi);
|
|
inst = laGetNextInstance(p, inst, &pi);
|
|
pp->EndInstance = inst;
|
|
pp->EndInstance = inst;
|
|
@@ -4606,6 +4608,13 @@ laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
|
|
|
|
|
|
void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
|
|
void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
|
|
laListHandle* ol=la_GetOriginalListHandle(dcs);
|
|
laListHandle* ol=la_GetOriginalListHandle(dcs);
|
|
|
|
+ if(dsp->p->UDFIsSingle){ laSubProp* sp=dsp->p;
|
|
|
|
+ if(ol){ logPrintNew("DSP \"%s\" is single but has list handle. Wrong!\n",sp->Base.Identifier); }
|
|
|
|
+ laDiffCommandInst* dci_added=dcs->AddedInst.pFirst;
|
|
|
|
+ laDiffCommandInst* dci_removed=dcs->RemovedInst.pFirst;
|
|
|
|
+ laSetActiveInstance(sp,dcs->Base.Instance->OriginalInstance,dci_removed?dci_removed->DBInst->OriginalInstance:0);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
for(laDiffCommandInst* dci=dcs->AddedInst.pFirst;dci;dci=dci->Item.pNext){
|
|
for(laDiffCommandInst* dci=dcs->AddedInst.pFirst;dci;dci=dci->Item.pNext){
|
|
if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
|
|
if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
|
|
dci->OriginalPrev = dci->DBInst->Item.pPrev; dci->OriginalNext = dci->DBInst->Item.pNext;
|
|
dci->OriginalPrev = dci->DBInst->Item.pPrev; dci->OriginalNext = dci->DBInst->Item.pNext;
|
|
@@ -4638,6 +4647,13 @@ void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
|
|
}
|
|
}
|
|
void la_RedoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
|
|
void la_RedoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
|
|
laListHandle* ol=la_GetOriginalListHandle(dcs);
|
|
laListHandle* ol=la_GetOriginalListHandle(dcs);
|
|
|
|
+ if(dsp->p->UDFIsSingle){ laSubProp* sp=dsp->p;
|
|
|
|
+ if(ol){ logPrintNew("DSP \"%s\" is single but has list handle. Wrong!\n",sp->Base.Identifier); }
|
|
|
|
+ laDiffCommandInst* dci_added=dcs->AddedInst.pFirst;
|
|
|
|
+ laDiffCommandInst* dci_removed=dcs->RemovedInst.pFirst;
|
|
|
|
+ laSetActiveInstance(sp,dcs->Base.Instance->OriginalInstance,dci_added?dci_added->DBInst->OriginalInstance:0);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
for(laDiffCommandInst* dci=dcs->RemovedInst.pFirst;dci;dci=dci->Item.pNext){
|
|
for(laDiffCommandInst* dci=dcs->RemovedInst.pFirst;dci;dci=dci->Item.pNext){
|
|
if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
|
|
if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
|
|
//dci->OriginalPrev = dci->DBInst->Item.pPrev;
|
|
//dci->OriginalPrev = dci->DBInst->Item.pPrev;
|