void asCConfigGroup::RemoveConfiguration(asCScriptEngine *engine) { asASSERT( refCount == 0 ); asUINT n; // Remove global variables for( n = 0; n < globalProps.GetLength(); n++ ) { int index = engine->registeredGlobalProps.IndexOf(globalProps[n]); if( index >= 0 ) { engine->ReleaseGlobalProperty(globalProps[n]); // TODO: global: Should compact the registeredGlobalProps array engine->registeredGlobalProps[index] = 0; } } #ifdef AS_DEPRECATED // deprecated since 2009-07-20, 2.17.0 // Remove global behaviours for( n = 0; n < globalBehaviours.GetLength(); n++ ) { int id = engine->globalBehaviours.operators[globalBehaviours[n]+1]; engine->globalBehaviours.operators[globalBehaviours[n]] = 0; engine->globalBehaviours.operators[globalBehaviours[n]+1] = 0; // Remove the system function as well engine->DeleteScriptFunction(id); } #endif // Remove global functions for( n = 0; n < scriptFunctions.GetLength(); n++ ) { engine->DeleteScriptFunction(scriptFunctions[n]->id); } // Remove behaviours and members of object types for( n = 0; n < objTypes.GetLength(); n++ ) { asUINT m; asCObjectType *obj = objTypes[n]; // Don't remove behaviours for interface types as they are built-in if( !(obj->flags & asOBJ_SCRIPT_OBJECT) ) { for( m = 0; m < obj->beh.factories.GetLength(); m++ ) { engine->DeleteScriptFunction(obj->beh.factories[m]); } for( m = 0; m < obj->beh.constructors.GetLength(); m++ ) { engine->DeleteScriptFunction(obj->beh.constructors[m]); } for( m = 1; m < obj->beh.operators.GetLength(); m += 2 ) { engine->DeleteScriptFunction(obj->beh.operators[m]); } engine->DeleteScriptFunction(obj->beh.addref); engine->DeleteScriptFunction(obj->beh.release); engine->DeleteScriptFunction(obj->beh.addref); engine->DeleteScriptFunction(obj->beh.gcGetRefCount); engine->DeleteScriptFunction(obj->beh.gcSetFlag); engine->DeleteScriptFunction(obj->beh.gcGetFlag); engine->DeleteScriptFunction(obj->beh.gcEnumReferences); engine->DeleteScriptFunction(obj->beh.gcReleaseAllReferences); } for( m = 0; m < obj->methods.GetLength(); m++ ) { engine->DeleteScriptFunction(obj->methods[m]); } } // Remove object types for( n = 0; n < objTypes.GetLength(); n++ ) { asCObjectType *t = objTypes[n]; int idx = engine->objectTypes.IndexOf(t); if( idx >= 0 ) { #ifdef AS_DEBUG ValidateNoUsage(engine, t); #endif engine->objectTypes.RemoveIndex(idx); if( t->flags & asOBJ_TYPEDEF ) engine->registeredTypeDefs.RemoveValue(t); else if( t->flags & asOBJ_ENUM ) engine->registeredEnums.RemoveValue(t); else engine->registeredObjTypes.RemoveValue(t); asDELETE(t, asCObjectType); } } // Release other config groups for( n = 0; n < referencedConfigGroups.GetLength(); n++ ) referencedConfigGroups[n]->refCount--; referencedConfigGroups.SetLength(0); }
void asCConfigGroup::RemoveConfiguration(asCScriptEngine *engine, bool notUsed) { asASSERT( refCount == 0 ); asUINT n; // Remove global variables for( n = 0; n < globalProps.GetLength(); n++ ) { int index = engine->registeredGlobalProps.GetIndex(globalProps[n]); if( index >= 0 ) { globalProps[n]->Release(); // TODO: global: Should compact the registeredGlobalProps array engine->registeredGlobalProps.Erase(index); } } globalProps.SetLength(0); // Remove global functions for( n = 0; n < scriptFunctions.GetLength(); n++ ) { scriptFunctions[n]->Release(); engine->registeredGlobalFuncs.RemoveValue(scriptFunctions[n]); if( engine->stringFactory == scriptFunctions[n] ) engine->stringFactory = 0; } scriptFunctions.SetLength(0); // Remove behaviours and members of object types for( n = 0; n < objTypes.GetLength(); n++ ) { asCObjectType *obj = objTypes[n]; obj->ReleaseAllFunctions(); } // Remove function definitions for( n = 0; n < funcDefs.GetLength(); n++ ) { engine->registeredFuncDefs.RemoveValue(funcDefs[n]); funcDefs[n]->Release(); } funcDefs.SetLength(0); // Remove object types (skip this if it is possible other groups are still using the types) if( !notUsed ) { for( n = 0; n < objTypes.GetLength(); n++ ) { asCObjectType *t = objTypes[n]; int idx = engine->objectTypes.IndexOf(t); if( idx >= 0 ) { #ifdef AS_DEBUG ValidateNoUsage(engine, t); #endif engine->objectTypes.RemoveIndex(idx); if( t->flags & asOBJ_TYPEDEF ) engine->registeredTypeDefs.RemoveValue(t); else if( t->flags & asOBJ_ENUM ) engine->registeredEnums.RemoveValue(t); else engine->registeredObjTypes.RemoveValue(t); asDELETE(t, asCObjectType); } } objTypes.SetLength(0); } // Release other config groups for( n = 0; n < referencedConfigGroups.GetLength(); n++ ) referencedConfigGroups[n]->refCount--; referencedConfigGroups.SetLength(0); }
void asCConfigGroup::RemoveConfiguration(asCScriptEngine *engine, bool notUsed) { asASSERT( refCount == 0 ); asUINT n; // Remove global variables for( n = 0; n < globalProps.GetLength(); n++ ) { int index = engine->registeredGlobalProps.GetIndex(globalProps[n]); if( index >= 0 ) { globalProps[n]->Release(); // TODO: global: Should compact the registeredGlobalProps array engine->registeredGlobalProps.Erase(index); } } globalProps.SetLength(0); // Remove global functions for( n = 0; n < scriptFunctions.GetLength(); n++ ) { int index = engine->registeredGlobalFuncs.GetIndex(scriptFunctions[n]); if( index >= 0 ) engine->registeredGlobalFuncs.Erase(index); scriptFunctions[n]->Release(); if( engine->stringFactory == scriptFunctions[n] ) engine->stringFactory = 0; } scriptFunctions.SetLength(0); // Remove behaviours and members of object types for( n = 0; n < objTypes.GetLength(); n++ ) { asCObjectType *obj = objTypes[n]; obj->ReleaseAllFunctions(); } // Remove function definitions for( n = 0; n < funcDefs.GetLength(); n++ ) { engine->registeredFuncDefs.RemoveValue(funcDefs[n]); funcDefs[n]->Release(); } funcDefs.SetLength(0); engine->ClearUnusedTypes(); // Remove object types (skip this if it is possible other groups are still using the types) if( !notUsed ) { for( n = asUINT(objTypes.GetLength()); n-- > 0; ) { asCObjectType *t = objTypes[n]; asSMapNode<asSNameSpaceNamePair, asCObjectType*> *cursor; if( engine->allRegisteredTypes.MoveTo(&cursor, asSNameSpaceNamePair(t->nameSpace, t->name)) && cursor->value == t ) { #ifdef AS_DEBUG ValidateNoUsage(engine, t); #endif engine->allRegisteredTypes.Erase(cursor); if( engine->defaultArrayObjectType == t ) engine->defaultArrayObjectType = 0; if( t->flags & asOBJ_TYPEDEF ) engine->registeredTypeDefs.RemoveValue(t); else if( t->flags & asOBJ_ENUM ) engine->registeredEnums.RemoveValue(t); else if( t->flags & asOBJ_TEMPLATE ) engine->registeredTemplateTypes.RemoveValue(t); else engine->registeredObjTypes.RemoveValue(t); asDELETE(t, asCObjectType); } else { int idx = engine->templateInstanceTypes.IndexOf(t); if( idx >= 0 ) { #ifdef AS_DEBUG ValidateNoUsage(engine, t); #endif engine->templateInstanceTypes.RemoveIndexUnordered(idx); t->templateSubTypes.SetLength(0); asDELETE(t, asCObjectType); } } } objTypes.SetLength(0); } // Release other config groups for( n = 0; n < referencedConfigGroups.GetLength(); n++ ) referencedConfigGroups[n]->refCount--; referencedConfigGroups.SetLength(0); }