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);
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
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);
}