From 133204763266e80f7efa5fb50a89dc622659253f Mon Sep 17 00:00:00 2001 From: Jeroen Bobbeldijk Date: Fri, 22 Sep 2023 15:00:33 +0200 Subject: [PATCH] Implement tests for deletion, correctly implementation delay of deletion --- engine.go | 2 + examples/classes/generated/classes.go | 8 + generator/generator/templates/classes.tmpl | 8 + internal/class.go | 34 +- internal/embind.go | 10 + internal/emval.go | 4 + internal/engine.go | 51 +- tests/generated/classes.go | 696 +++++++++++++++++++++ tests/generated_test.go | 288 ++++++--- 9 files changed, 993 insertions(+), 108 deletions(-) diff --git a/engine.go b/engine.go index 92dc7e8..71a253f 100644 --- a/engine.go +++ b/engine.go @@ -11,6 +11,8 @@ type Engine interface { NewFunctionExporterForModule(guest wazero.CompiledModule) FunctionExporter } +type DelayFunction internal.DelayFunction + type EngineKey = internal.EngineKey func CreateEngine(config internal.IEngineConfig) Engine { diff --git a/examples/classes/generated/classes.go b/examples/classes/generated/classes.go index 95ac2f0..5b9e6d6 100644 --- a/examples/classes/generated/classes.go +++ b/examples/classes/generated/classes.go @@ -23,6 +23,14 @@ func (class *ClassMyClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMyClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMyClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMyClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } diff --git a/generator/generator/templates/classes.tmpl b/generator/generator/templates/classes.tmpl index e58db90..b115529 100644 --- a/generator/generator/templates/classes.tmpl +++ b/generator/generator/templates/classes.tmpl @@ -24,6 +24,14 @@ func (class *{{ $class.GoName }}) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *{{ $class.GoName }}) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *{{ $class.GoName }}) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *{{ $class.GoName }}) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } diff --git a/internal/class.go b/internal/class.go index 3746247..6962c98 100644 --- a/internal/class.go +++ b/internal/class.go @@ -115,11 +115,11 @@ func (erc *classType) validate() error { return nil } -func (erc *classType) isDeleted(handle IClassBase) bool { +func (erc *classType) isDeleted(ctx context.Context, handle IClassBase) bool { return handle.getRegisteredPtrTypeRecord().ptr == 0 } -func (erc *classType) deleteLater(handle IClassBase) (any, error) { +func (erc *classType) deleteLater(ctx context.Context, handle IClassBase) (IClassBase, error) { registeredPtrTypeRecord := handle.getRegisteredPtrTypeRecord() if registeredPtrTypeRecord.ptr == 0 { return nil, fmt.Errorf("class handle already deleted") @@ -129,13 +129,17 @@ func (erc *classType) deleteLater(handle IClassBase) (any, error) { return nil, fmt.Errorf("object already scheduled for deletion") } - // @todo: implement me. - /* - deletionQueue.push(this); - if (deletionQueue.length === 1 && delayFunction) { - delayFunction(flushPendingDeletes); - } - */ + e := MustGetEngineFromContext(ctx, nil).(*engine) + e.deletionQueue = append(e.deletionQueue, handle) + + if len(e.deletionQueue) == 1 && e.delayFunction != nil { + err := e.delayFunction(func(ctx context.Context) error { + return e.FlushPendingDeletes(ctx) + }) + if err != nil { + return nil, err + } + } registeredPtrTypeRecord.deleteScheduled = true @@ -214,7 +218,7 @@ func (erc *classType) delete(ctx context.Context, handle IClassBase) error { return err } - if registeredPtrTypeRecord.preservePointerOnDelete { + if !registeredPtrTypeRecord.preservePointerOnDelete { registeredPtrTypeRecord.smartPtr = 0 registeredPtrTypeRecord.ptr = 0 } @@ -453,6 +457,14 @@ func (ecb *ClassBase) DeleteInstance(ctx context.Context, this IClassBase) error return ecb.classType.delete(ctx, this) } +func (ecb *ClassBase) DeleteInstanceLater(ctx context.Context, this IClassBase) (IClassBase, error) { + return ecb.classType.deleteLater(ctx, this) +} + +func (ecb *ClassBase) IsInstanceDeleted(ctx context.Context, this IClassBase) bool { + return ecb.classType.isDeleted(ctx, this) +} + func (ecb *ClassBase) IsAliasOfInstance(ctx context.Context, this IClassBase, second IClassBase) (bool, error) { return ecb.classType.isAliasOf(ctx, this, second) } @@ -520,6 +532,8 @@ type IClassBase interface { isValid() bool CloneInstance(ctx context.Context, this IClassBase) (IClassBase, error) DeleteInstance(ctx context.Context, this IClassBase) error + DeleteInstanceLater(ctx context.Context, this IClassBase) (IClassBase, error) + IsInstanceDeleted(ctx context.Context, this IClassBase) bool IsAliasOfInstance(ctx context.Context, this IClassBase, second IClassBase) (bool, error) CallInstanceMethod(ctx context.Context, this any, name string, arguments ...any) (any, error) SetInstanceProperty(ctx context.Context, this any, name string, value any) error diff --git a/internal/embind.go b/internal/embind.go index e8ea0d5..599b62a 100644 --- a/internal/embind.go +++ b/internal/embind.go @@ -25,8 +25,15 @@ type IEngine interface { RegisterEmvalSymbol(name string, symbol any) error EmvalToHandle(value any) int32 EmvalToValue(handle int32) (any, error) + CountEmvalHandles() int + GetInheritedInstanceCount() int + GetLiveInheritedInstances() []IClassBase + FlushPendingDeletes(ctx context.Context) error + SetDelayFunction(fn DelayFunction) error } +type DelayFunction func(func(ctx context.Context) error) error + type IEngineConfig interface { } @@ -92,6 +99,9 @@ func CreateEngine(config IEngineConfig) IEngine { registeredPointers: map[int32]*registeredPointer{}, registeredTuples: map[int32]*registeredTuple{}, registeredObjects: map[int32]*registeredObject{}, + registeredInstances: map[uint32]IClassBase{}, + deletionQueue: []IClassBase{}, + delayFunction: nil, emvalEngine: createEmvalEngine(), } } diff --git a/internal/emval.go b/internal/emval.go index bcdcd86..bc1da9a 100644 --- a/internal/emval.go +++ b/internal/emval.go @@ -74,6 +74,10 @@ func (ea *emvalAllocator) get(id int32) (*emvalHandle, error) { return nil, fmt.Errorf("invalid id: %d", id) } + if ea.allocated[int(id)] == nil { + return nil, fmt.Errorf("invalid id: %d", id) + } + return ea.allocated[int(id)], nil } diff --git a/internal/engine.go b/internal/engine.go index bd45a11..ca18ec7 100644 --- a/internal/engine.go +++ b/internal/engine.go @@ -29,6 +29,8 @@ type engine struct { registeredTuples map[int32]*registeredTuple registeredObjects map[int32]*registeredObject registeredInstances map[uint32]IClassBase + deletionQueue []IClassBase + delayFunction DelayFunction emvalEngine *emvalEngine } @@ -761,6 +763,53 @@ func (e *engine) validateThis(ctx context.Context, this any, classType *register // @todo: check if based.ptrType.registeredClass is or extends classType.registeredClass - // todo: kill this + // todo: kill this (comment from Emscripten) return e.upcastPointer(ctx, based.getPtr(), based.getPtrType().registeredClass, classType.registeredClass) } + +func (e *engine) CountEmvalHandles() int { + return len(e.emvalEngine.allocator.allocated) - len(e.emvalEngine.allocator.freelist) +} + +func (e *engine) GetInheritedInstanceCount() int { + return len(e.registeredInstances) +} + +func (e *engine) GetLiveInheritedInstances() []IClassBase { + instances := make([]IClassBase, len(e.registeredInstances)) + i := 0 + for id := range e.registeredInstances { + instances[i] = e.registeredInstances[id] + i++ + } + return instances +} + +func (e *engine) FlushPendingDeletes(ctx context.Context) error { + for len(e.deletionQueue) > 0 { + obj := e.deletionQueue[len(e.deletionQueue)-1] + e.deletionQueue = e.deletionQueue[:len(e.deletionQueue)-1] + + obj.getRegisteredPtrTypeRecord().deleteScheduled = false + err := obj.DeleteInstance(ctx, obj) + if err != nil { + return err + } + } + return nil +} + +func (e *engine) SetDelayFunction(fn DelayFunction) error { + e.delayFunction = fn + + if len(e.deletionQueue) > 0 && fn != nil { + err := fn(func(ctx context.Context) error { + return e.FlushPendingDeletes(ctx) + }) + if err != nil { + return err + } + } + + return nil +} diff --git a/tests/generated/classes.go b/tests/generated/classes.go index e83907b..3dc36a0 100644 --- a/tests/generated/classes.go +++ b/tests/generated/classes.go @@ -23,6 +23,14 @@ func (class *ClassAbstractClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassAbstractClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassAbstractClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassAbstractClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -126,6 +134,14 @@ func (class *ClassAbstractClassWithConstructor) Delete(ctx context.Context) erro return class.DeleteInstance(ctx, class) } +func (class *ClassAbstractClassWithConstructor) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassAbstractClassWithConstructor) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassAbstractClassWithConstructor) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -210,6 +226,14 @@ func (class *ClassAbstractClassWithConstructorWrapper) Delete(ctx context.Contex return class.DeleteInstance(ctx, class) } +func (class *ClassAbstractClassWithConstructorWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassAbstractClassWithConstructorWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassAbstractClassWithConstructorWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -299,6 +323,14 @@ func (class *ClassAbstractClassWrapper) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassAbstractClassWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassAbstractClassWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassAbstractClassWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -407,6 +439,14 @@ func (class *ClassBase) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBase) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBase) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBase) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -544,6 +584,14 @@ func (class *ClassBase1) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBase1) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBase1) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBase1) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -594,6 +642,14 @@ func (class *ClassBase2) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBase2) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBase2) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBase2) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -647,6 +703,14 @@ func (class *ClassBaseClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBaseClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBaseClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBaseClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -718,6 +782,14 @@ func (class *ClassBaseClassWrapper) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBaseClassWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBaseClassWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBaseClassWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -794,6 +866,14 @@ func (class *ClassBigClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBigClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBigClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBigClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -880,6 +960,14 @@ func (class *ClassBoundClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassBoundClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassBoundClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassBoundClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -959,6 +1047,14 @@ func (class *ClassC) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassC) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassC) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassC) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1000,6 +1096,14 @@ func (class *ClassCharVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassCharVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassCharVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassCharVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1078,6 +1182,14 @@ func (class *ClassConstAndNonConst) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassConstAndNonConst) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassConstAndNonConst) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassConstAndNonConst) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1119,6 +1231,14 @@ func (class *ClassConstructFromFunctionObject) Delete(ctx context.Context) error return class.DeleteInstance(ctx, class) } +func (class *ClassConstructFromFunctionObject) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassConstructFromFunctionObject) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassConstructFromFunctionObject) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1178,6 +1298,14 @@ func (class *ClassConstructFromStdFunction) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassConstructFromStdFunction) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassConstructFromStdFunction) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassConstructFromStdFunction) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1237,6 +1365,14 @@ func (class *ClassContainsTemplatedMemberClass) Delete(ctx context.Context) erro return class.DeleteInstance(ctx, class) } +func (class *ClassContainsTemplatedMemberClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassContainsTemplatedMemberClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassContainsTemplatedMemberClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1287,6 +1423,14 @@ func (class *ClassCustomStruct) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassCustomStruct) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassCustomStruct) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassCustomStruct) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1349,6 +1493,14 @@ func (class *ClassDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1486,6 +1638,14 @@ func (class *ClassDerivedClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1557,6 +1717,14 @@ func (class *ClassDerivedHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1626,6 +1794,14 @@ func (class *ClassDerivedThrice) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedThrice) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedThrice) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedThrice) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1763,6 +1939,14 @@ func (class *ClassDerivedTwice) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedTwice) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedTwice) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedTwice) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -1900,6 +2084,14 @@ func (class *ClassDerivedWithMixin) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedWithMixin) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedWithMixin) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedWithMixin) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2046,6 +2238,14 @@ func (class *ClassDerivedWithOffset) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDerivedWithOffset) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDerivedWithOffset) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDerivedWithOffset) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2183,6 +2383,14 @@ func (class *ClassDummyForOverloads) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDummyForOverloads) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDummyForOverloads) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDummyForOverloads) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2224,6 +2432,14 @@ func (class *ClassDummyForPointer) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassDummyForPointer) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassDummyForPointer) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassDummyForPointer) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2256,6 +2472,14 @@ func (class *ClassEmValVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassEmValVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassEmValVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassEmValVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2334,6 +2558,14 @@ func (class *ClassFirstElement) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassFirstElement) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassFirstElement) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassFirstElement) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2366,6 +2598,14 @@ func (class *ClassFloatVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassFloatVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassFloatVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassFloatVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2444,6 +2684,14 @@ func (class *ClassFoo) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassFoo) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassFoo) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassFoo) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2485,6 +2733,14 @@ func (class *ClassHasConstructorUsingUnboundArgument) Delete(ctx context.Context return class.DeleteInstance(ctx, class) } +func (class *ClassHasConstructorUsingUnboundArgument) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHasConstructorUsingUnboundArgument) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHasConstructorUsingUnboundArgument) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2526,6 +2782,14 @@ func (class *ClassHasExternalConstructor) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHasExternalConstructor) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHasExternalConstructor) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHasExternalConstructor) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2576,6 +2840,14 @@ func (class *ClassHasReadOnlyProperty) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHasReadOnlyProperty) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHasReadOnlyProperty) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHasReadOnlyProperty) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2626,6 +2898,14 @@ func (class *ClassHasStaticMember) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHasStaticMember) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHasStaticMember) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHasStaticMember) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2698,6 +2978,14 @@ func (class *ClassHasTwoBases) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHasTwoBases) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHasTwoBases) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHasTwoBases) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2760,6 +3048,14 @@ func (class *ClassHeldAbstractClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHeldAbstractClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHeldAbstractClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHeldAbstractClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2840,6 +3136,14 @@ func (class *ClassHeldAbstractClassWrapper) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHeldAbstractClassWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHeldAbstractClassWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHeldAbstractClassWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -2925,6 +3229,14 @@ func (class *ClassHeldByCustomSmartPtr) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHeldByCustomSmartPtr) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHeldByCustomSmartPtr) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHeldByCustomSmartPtr) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3007,6 +3319,14 @@ func (class *ClassHeldBySmartPtr) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassHeldBySmartPtr) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassHeldBySmartPtr) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassHeldBySmartPtr) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3098,6 +3418,14 @@ func (class *ClassIntTemplateClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntTemplateClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntTemplateClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntTemplateClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3148,6 +3476,14 @@ func (class *ClassIntegerVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntegerVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntegerVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntegerVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3226,6 +3562,14 @@ func (class *ClassIntegerVectorVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntegerVectorVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntegerVectorVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntegerVectorVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3304,6 +3648,14 @@ func (class *ClassInterface) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassInterface) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassInterface) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassInterface) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3375,6 +3727,14 @@ func (class *ClassInterfaceWrapper) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassInterfaceWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassInterfaceWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassInterfaceWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3451,6 +3811,14 @@ func (class *ClassIntrusiveClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntrusiveClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntrusiveClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntrusiveClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3526,6 +3894,14 @@ func (class *ClassIntrusiveClassHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntrusiveClassHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntrusiveClassHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntrusiveClassHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3581,6 +3957,14 @@ func (class *ClassIntrusiveClassWrapper) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassIntrusiveClassWrapper) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassIntrusiveClassWrapper) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassIntrusiveClassWrapper) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3652,6 +4036,14 @@ func (class *ClassMap_int__string_) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMap_int__string_) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMap_int__string_) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMap_int__string_) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3725,6 +4117,14 @@ func (class *ClassMultipleAccessors) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleAccessors) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleAccessors) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleAccessors) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3766,6 +4166,14 @@ func (class *ClassMultipleCtors) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleCtors) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleCtors) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleCtors) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3834,6 +4242,14 @@ func (class *ClassMultipleOverloads) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleOverloads) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleOverloads) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleOverloads) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -3953,6 +4369,14 @@ func (class *ClassMultipleOverloadsDependingOnDummy) Delete(ctx context.Context) return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleOverloadsDependingOnDummy) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleOverloadsDependingOnDummy) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleOverloadsDependingOnDummy) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4046,6 +4470,14 @@ func (class *ClassMultipleOverloadsDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleOverloadsDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleOverloadsDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleOverloadsDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4217,6 +4649,14 @@ func (class *ClassMultipleSmartCtors) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultipleSmartCtors) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultipleSmartCtors) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultipleSmartCtors) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4276,6 +4716,14 @@ func (class *ClassMultiplyDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMultiplyDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMultiplyDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMultiplyDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4430,6 +4878,14 @@ func (class *ClassMyClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassMyClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassMyClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassMyClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4537,6 +4993,14 @@ func (class *ClassNoExceptClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassNoExceptClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassNoExceptClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassNoExceptClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4604,6 +5068,14 @@ func (class *ClassNoncopyable) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassNoncopyable) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassNoncopyable) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassNoncopyable) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4654,6 +5126,14 @@ func (class *ClassParentClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassParentClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassParentClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassParentClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4704,6 +5184,14 @@ func (class *ClassPolyBase) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyBase) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyBase) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyBase) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4763,6 +5251,14 @@ func (class *ClassPolyDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4874,6 +5370,14 @@ func (class *ClassPolyDerivedThrice) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDerivedThrice) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDerivedThrice) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDerivedThrice) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -4968,6 +5472,14 @@ func (class *ClassPolyDiamondBase) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDiamondBase) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDiamondBase) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDiamondBase) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5018,6 +5530,14 @@ func (class *ClassPolyDiamondDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDiamondDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDiamondDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDiamondDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5068,6 +5588,14 @@ func (class *ClassPolyDiamondMultiplyDerived) Delete(ctx context.Context) error return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDiamondMultiplyDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDiamondMultiplyDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDiamondMultiplyDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5118,6 +5646,14 @@ func (class *ClassPolyDiamondSiblingDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyDiamondSiblingDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyDiamondSiblingDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyDiamondSiblingDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5168,6 +5704,14 @@ func (class *ClassPolyMultiplyDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolyMultiplyDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolyMultiplyDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolyMultiplyDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5227,6 +5771,14 @@ func (class *ClassPolySecondBase) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolySecondBase) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolySecondBase) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolySecondBase) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5277,6 +5829,14 @@ func (class *ClassPolySiblingDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassPolySiblingDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassPolySiblingDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassPolySiblingDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5336,6 +5896,14 @@ func (class *ClassSecondBase) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSecondBase) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSecondBase) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSecondBase) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5456,6 +6024,14 @@ func (class *ClassSecondElement) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSecondElement) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSecondElement) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSecondElement) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5488,6 +6064,14 @@ func (class *ClassSharedPtrHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSharedPtrHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSharedPtrHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSharedPtrHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5543,6 +6127,14 @@ func (class *ClassSharedPtrVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSharedPtrVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSharedPtrVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSharedPtrVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5621,6 +6213,14 @@ func (class *ClassSiblingDerived) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSiblingDerived) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSiblingDerived) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSiblingDerived) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5671,6 +6271,14 @@ func (class *ClassSmallClass) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassSmallClass) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassSmallClass) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassSmallClass) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5724,6 +6332,14 @@ func (class *ClassStringFunctorString) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassStringFunctorString) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassStringFunctorString) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassStringFunctorString) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5774,6 +6390,14 @@ func (class *ClassStringHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassStringHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassStringHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassStringHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5838,6 +6462,14 @@ func (class *ClassStringHolderVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassStringHolderVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassStringHolderVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassStringHolderVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5916,6 +6548,14 @@ func (class *ClassStringIntMap) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassStringIntMap) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassStringIntMap) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassStringIntMap) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -5989,6 +6629,14 @@ func (class *ClassStringVector) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassStringVector) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassStringVector) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassStringVector) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6067,6 +6715,14 @@ func (class *ClassUniquePtrLifetimeMock) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassUniquePtrLifetimeMock) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassUniquePtrLifetimeMock) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassUniquePtrLifetimeMock) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6099,6 +6755,14 @@ func (class *ClassUniquePtrToConstructor) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassUniquePtrToConstructor) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassUniquePtrToConstructor) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassUniquePtrToConstructor) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6140,6 +6804,14 @@ func (class *ClassValHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassValHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassValHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassValHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6413,6 +7085,14 @@ func (class *ClassVectorHolder) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassVectorHolder) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassVectorHolder) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassVectorHolder) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6468,6 +7148,14 @@ func (class *ClassVectorUnsigned) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassVectorUnsigned) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassVectorUnsigned) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassVectorUnsigned) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } @@ -6546,6 +7234,14 @@ func (class *ClassVectorUnsignedChar) Delete(ctx context.Context) error { return class.DeleteInstance(ctx, class) } +func (class *ClassVectorUnsignedChar) DeleteLater(ctx context.Context) (embind.ClassBase, error) { + return class.DeleteInstanceLater(ctx, class) +} + +func (class *ClassVectorUnsignedChar) IsDeleted(ctx context.Context) bool { + return class.IsInstanceDeleted(ctx, class) +} + func (class *ClassVectorUnsignedChar) IsAliasOf(ctx context.Context, second embind.ClassBase) (bool, error) { return class.IsAliasOfInstance(ctx, class, second) } diff --git a/tests/generated_test.go b/tests/generated_test.go index 28f83bc..ecad3bd 100644 --- a/tests/generated_test.go +++ b/tests/generated_test.go @@ -29,6 +29,7 @@ var engine embind_external.Engine var runtime wazero.Runtime var mod api.Module var wasmData []byte +var compiledModule wazero.CompiledModule var _ = BeforeSuite(func() { wasm, err := os.ReadFile("../testdata/wasm/tests.wasm") @@ -47,7 +48,7 @@ var _ = BeforeSuite(func() { return } - compiledModule, err := runtime.CompileModule(ctx, wasm) + compiledModule, err = runtime.CompileModule(ctx, wasm) if err != nil { log.Fatal(err) } @@ -76,13 +77,21 @@ var _ = BeforeSuite(func() { Expect(err).To(BeNil()) return } +}) + +var _ = AfterSuite(func() { + runtime.Close(ctx) +}) +var _ = BeforeEach(func() { moduleConfig := wazero.NewModuleConfig(). WithStartFunctions("_initialize"). WithStdout(os.Stdout). WithStderr(os.Stderr). WithName("") + var err error + engine = embind_external.CreateEngine(embind_external.NewConfig()) ctx = engine.Attach(ctx) mod, err = runtime.InstantiateModule(ctx, compiledModule, moduleConfig) if err != nil { @@ -95,20 +104,21 @@ var _ = BeforeSuite(func() { Expect(err).To(BeNil()) return } - // @todo: implement leak detection. - /* - cm.setDelayFunction(undefined); - assert.equal(0, cm.count_emval_handles()); - */ + + err = engine.SetDelayFunction(nil) + Expect(err).To(BeNil()) + + emvalHandleCount := engine.CountEmvalHandles() + Expect(emvalHandleCount, 0) }) -var _ = AfterSuite(func() { - // @todo: implement leak detection. - /* - cm.flushPendingDeletes(); - ssert.equal(0, cm.count_emval_handles()); - */ - runtime.Close(ctx) +var _ = AfterEach(func() { + err := engine.FlushPendingDeletes(ctx) + Expect(err).To(BeNil()) + + emvalHandleCount := engine.CountEmvalHandles() + Expect(emvalHandleCount, 0) + mod.Close(ctx) }) var _ = Describe("executing original embind tests", Label("library"), func() { @@ -3110,100 +3120,184 @@ var _ = Describe("executing original embind tests", Label("library"), func() { }) When("delete pool", func() { - /* - test("can delete objects later", function() { - var v = new cm.ValHolder({}); - v.deleteLater(); - assert.deepEqual({}, v.getVal()); - cm.flushPendingDeletes(); - assert.throws(cm.BindingError, function() { - v.getVal(); - }); - }); + It("can delete objects later", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) - test("calling deleteLater twice is an error", function() { - var v = new cm.ValHolder({}); - v.deleteLater(); - assert.throws(cm.BindingError, function() { - v.deleteLater(); - }); - }); + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) - test("can clone instances that have been scheduled for deletion", function() { - var v = new cm.ValHolder({}); - v.deleteLater(); - var v2 = v.clone(); - v2.delete(); - }); + val, err := v.GetVal(ctx) + Expect(err).To(BeNil()) + Expect(val).To(Equal(struct{}{})) - test("deleteLater returns the object", function() { - var v = (new cm.ValHolder({})).deleteLater(); - assert.deepEqual({}, v.getVal()); - }); + err = engine.FlushPendingDeletes(ctx) - test("deleteLater throws if object is already deleted", function() { - var v = new cm.ValHolder({}); - v.delete(); - assert.throws(cm.BindingError, function() { - v.deleteLater(); - }); - }); + val, err = v.GetVal(ctx) + Expect(err).To(Not(BeNil())) + if err != nil { + Expect(err.Error()).To(ContainSubstring("cannot pass deleted object as a pointer of type")) + } + }) - test("delete throws if object is already scheduled for deletion", function() { - var v = new cm.ValHolder({}); - v.deleteLater(); - assert.throws(cm.BindingError, function() { - v.delete(); - }); - }); + It("calling deleteLater twice is an error", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) - test("deleteLater invokes delay function", function() { - var runLater; - cm.setDelayFunction(function(fn) { - runLater = fn; - }); + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) - var v = new cm.ValHolder({}); - assert.false(runLater); - v.deleteLater(); - assert.true(runLater); - assert.false(v.isDeleted()); - runLater(); - assert.true(v.isDeleted()); - }); - - test("deleteLater twice invokes delay function once", function() { - var count = 0; - var runLater; - cm.setDelayFunction(function(fn) { - ++count; - runLater = fn; - }); + _, err = v.DeleteLater(ctx) + Expect(err).To(Not(BeNil())) + if err != nil { + Expect(err.Error()).To(ContainSubstring("object already scheduled for deletion")) + } + }) - (new cm.ValHolder({})).deleteLater(); - (new cm.ValHolder({})).deleteLater(); - assert.equal(1, count); - runLater(); - (new cm.ValHolder({})).deleteLater(); - assert.equal(2, count); - }); + It("can clone instances that have been scheduled for deletion", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) - test('The delay function is immediately invoked if the deletion queue is not empty', function() { - (new cm.ValHolder({})).deleteLater(); - var count = 0; - cm.setDelayFunction(function(fn) { - ++count; - }); - assert.equal(1, count); - }); + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) - // The idea is that an interactive application would - // periodically flush the deleteLater queue by calling - // - // setDelayFunction(function(fn) { - // setTimeout(fn, 0); - // }); - */ + v2, err := v.Clone(ctx) + Expect(err).To(BeNil()) + + err = v2.Delete(ctx) + Expect(err).To(BeNil()) + }) + + It("deleteLater returns the object", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + vReturned, err := v.DeleteLater(ctx) + Expect(err).To(BeNil()) + + val, err := vReturned.(*generated.ClassValHolder).GetVal(ctx) + Expect(err).To(BeNil()) + Expect(val).To(Equal(struct{}{})) + }) + + It("deleteLater throws if object is already deleted", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + err = v.Delete(ctx) + Expect(err).To(BeNil()) + + _, err = v.DeleteLater(ctx) + Expect(err).To(Not(BeNil())) + if err != nil { + Expect(err.Error()).To(ContainSubstring("class handle already deleted")) + } + }) + + It("delete throws if object is already scheduled for deletion", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) + + err = v.Delete(ctx) + Expect(err).To(Not(BeNil())) + if err != nil { + Expect(err.Error()).To(ContainSubstring("object already scheduled for deletion")) + } + }) + + It("deleteLater invokes delay function", func() { + var runLater func(ctx context.Context) error + + err := engine.SetDelayFunction(func(fn func(ctx context.Context) error) error { + runLater = fn + return nil + }) + + Expect(err).To(BeNil()) + + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + Expect(runLater).To(BeNil()) + + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) + + Expect(runLater).To(Not(BeNil())) + + isDeleted := v.IsDeleted(ctx) + + Expect(isDeleted).To(BeFalse()) + err = runLater(ctx) + Expect(err).To(BeNil()) + + isDeleted = v.IsDeleted(ctx) + Expect(isDeleted).To(BeTrue()) + }) + + It("deleteLater twice invokes delay function once", func() { + count := 0 + var runLater func(ctx context.Context) error + + err := engine.SetDelayFunction(func(fn func(ctx context.Context) error) error { + count++ + runLater = fn + return nil + }) + + Expect(err).To(BeNil()) + + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) + + v2, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + _, err = v2.DeleteLater(ctx) + Expect(err).To(BeNil()) + + Expect(count).To(Equal(1)) + + err = runLater(ctx) + Expect(err).To(BeNil()) + + v3, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + _, err = v3.DeleteLater(ctx) + Expect(err).To(BeNil()) + + Expect(count).To(Equal(2)) + }) + + It("The delay function is immediately invoked if the deletion queue is not empty", func() { + v, err := generated.NewClassValHolder(engine, ctx, struct{}{}) + Expect(err).To(BeNil()) + + _, err = v.DeleteLater(ctx) + Expect(err).To(BeNil()) + + count := 0 + err = engine.SetDelayFunction(func(fn func(ctx context.Context) error) error { + count++ + return nil + }) + Expect(err).To(BeNil()) + Expect(count).To(Equal(1)) + }) + + // The idea is that an interactive application would + // periodically flush the deleteLater queue by calling + // + // setDelayFunction(function(fn) { + // setTimeout(fn, 0); + // }); }) When("references", func() {