1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-23 16:23:52 +02:00

fix memory leak in the symbol table.

also fix a couple of places that were still doing symbol forwarding the old way
This commit is contained in:
Andrew Niefer 2004-07-12 14:16:50 +00:00
parent b78e2165a2
commit e560975741
9 changed files with 36 additions and 39 deletions

View file

@ -51,7 +51,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
public ParserSymbolTable newTable( ParserLanguage language ){ public ParserSymbolTable newTable( ParserLanguage language ){
table = new ParserSymbolTable( language, ParserMode.COMPLETE_PARSE ); table = new ParserSymbolTable( language, ParserMode.COMPLETE_PARSE );
provider = TypeInfoProvider.getProvider( table ); provider = table.getTypeInfoProvider();
return table; return table;
} }

View file

@ -72,7 +72,7 @@ public class ParserSymbolTableTest extends TestCase {
public ParserSymbolTable newTable( ParserLanguage language, ParserMode mode ){ public ParserSymbolTable newTable( ParserLanguage language, ParserMode mode ){
table = new ParserSymbolTable( language, mode ); table = new ParserSymbolTable( language, mode );
provider = TypeInfoProvider.getProvider( table ); provider = table.getTypeInfoProvider();
return table; return table;
} }
/** /**

View file

@ -1563,7 +1563,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
//basic types //basic types
if( kind.isBasicType() ){ if( kind.isBasicType() ){
TypeInfoProvider provider = TypeInfoProvider.getProvider( pst ); TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction(); provider.beginTypeConstruction();
if( literal != null && !literal.equals(EMPTY_STRING) && kind.isLiteral() ){ if( literal != null && !literal.equals(EMPTY_STRING) && kind.isLiteral() ){
@ -2226,7 +2226,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
protected ITypeInfo getParameterTypeInfo( IASTAbstractDeclaration absDecl)throws ASTSemanticException{ protected ITypeInfo getParameterTypeInfo( IASTAbstractDeclaration absDecl)throws ASTSemanticException{
TypeInfoProvider provider = TypeInfoProvider.getProvider( pst ); TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction(); provider.beginTypeConstruction();
if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier )
{ {
@ -3022,7 +3022,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
ISymbol symbol = null; ISymbol symbol = null;
TypeInfoProvider provider = TypeInfoProvider.getProvider( pst ); TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction(); provider.beginTypeConstruction();
if( defaultValue != null ){ if( defaultValue != null ){

View file

@ -1090,11 +1090,11 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
if( !alreadyReturned.contains( extensible ) ){ if( !alreadyReturned.contains( extensible ) ){
if( extensible instanceof ISymbol ){ if( extensible instanceof ISymbol ){
ISymbol symbol = (ISymbol) extensible; ISymbol symbol = (ISymbol) extensible;
if( symbol.isForwardDeclaration() && symbol.getTypeSymbol() != null && if( symbol.isForwardDeclaration() && symbol.getForwardSymbol() != null &&
symbol.getTypeSymbol().getContainingSymbol() == ContainerSymbol.this ) symbol.getForwardSymbol().getContainingSymbol() == ContainerSymbol.this )
{ {
alreadyReturned.add( symbol.getTypeSymbol() ); alreadyReturned.add( symbol.getForwardSymbol() );
return symbol.getTypeSymbol(); return symbol.getForwardSymbol();
} }
} else if( extensible instanceof IUsingDeclarationSymbol ){ } else if( extensible instanceof IUsingDeclarationSymbol ){
IUsingDeclarationSymbol using = (IUsingDeclarationSymbol) extensible; IUsingDeclarationSymbol using = (IUsingDeclarationSymbol) extensible;

View file

@ -201,7 +201,7 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva
paramType = TemplateEngine.instantiateWithinTemplateScope( this, (ITemplateSymbol) getContainingSymbol() ); paramType = TemplateEngine.instantiateWithinTemplateScope( this, (ITemplateSymbol) getContainingSymbol() );
} }
ITypeInfo param = TypeInfoProvider.getProvider(getSymbolTable()).getTypeInfo( ITypeInfo.t_type ); ITypeInfo param = getSymbolTable().getTypeInfoProvider().getTypeInfo( ITypeInfo.t_type );
param.setType( ITypeInfo.t_type ); param.setType( ITypeInfo.t_type );
param.setBit( true, ITypeInfo.isConst ); param.setBit( true, ITypeInfo.isConst );
param.setTypeSymbol( paramType ); param.setTypeSymbol( paramType );

View file

@ -456,7 +456,7 @@ public class ParserSymbolTable {
return true; return true;
} }
TypeInfoProvider provider = TypeInfoProvider.getProvider( symbol.getSymbolTable() ); TypeInfoProvider provider = symbol.getSymbolTable().getTypeInfoProvider();
ITypeInfo typeInfo = ParserSymbolTable.getFlatTypeInfo( symbol.getTypeInfo(), provider ); ITypeInfo typeInfo = ParserSymbolTable.getFlatTypeInfo( symbol.getTypeInfo(), provider );
boolean accept = data.getFilter().shouldAccept( symbol, typeInfo ) || data.getFilter().shouldAccept( symbol ); boolean accept = data.getFilter().shouldAccept( symbol, typeInfo ) || data.getFilter().shouldAccept( symbol );
provider.returnTypeInfo( typeInfo ); provider.returnTypeInfo( typeInfo );
@ -817,7 +817,7 @@ public class ParserSymbolTable {
//friend class declarations //friend class declarations
if( origSymbol.getIsInvisible() && origSymbol.isType( newSymbol.getType() ) ){ if( origSymbol.getIsInvisible() && origSymbol.isType( newSymbol.getType() ) ){
origSymbol.getTypeInfo().setTypeSymbol( newSymbol ); origSymbol.setForwardSymbol( newSymbol );
return true; return true;
} }
} }
@ -1008,8 +1008,8 @@ public class ParserSymbolTable {
for (int i = 0; i < numFns; i++) { for (int i = 0; i < numFns; i++) {
IParameterizedSymbol fn = (IParameterizedSymbol) functions.get(i); IParameterizedSymbol fn = (IParameterizedSymbol) functions.get(i);
if( fn.isForwardDeclaration() && fn.getForwardSymbol() != null ){ if( fn.isForwardDeclaration() && fn.getForwardSymbol() != null ){
if( functions.contains( fn.getTypeSymbol() ) ){ if( functions.contains( fn.getForwardSymbol() ) ){
return (IParameterizedSymbol) fn.getTypeSymbol(); return (IParameterizedSymbol) fn.getForwardSymbol();
} }
} }
} }
@ -1041,7 +1041,7 @@ public class ParserSymbolTable {
List sourceParameters = null; //the parameters the function is being called with List sourceParameters = null; //the parameters the function is being called with
List targetParameters = null; //the current function's parameters List targetParameters = null; //the current function's parameters
TypeInfoProvider infoProvider = TypeInfoProvider.getProvider( this ); TypeInfoProvider infoProvider = getTypeInfoProvider();
if( numSourceParams == 0 ){ if( numSourceParams == 0 ){
//f() is the same as f( void ) //f() is the same as f( void )
@ -1852,7 +1852,7 @@ public class ParserSymbolTable {
} }
protected Cost checkStandardConversionSequence( ITypeInfo source, ITypeInfo target ) throws ParserSymbolTableException{ protected Cost checkStandardConversionSequence( ITypeInfo source, ITypeInfo target ) throws ParserSymbolTableException{
Cost cost = lvalue_to_rvalue( TypeInfoProvider.getProvider( this ), source, target ); Cost cost = lvalue_to_rvalue( getTypeInfoProvider(), source, target );
if( cost.getSource() == null || cost.getTarget() == null ){ if( cost.getSource() == null || cost.getTarget() == null ){
return cost; return cost;
@ -1900,7 +1900,7 @@ public class ParserSymbolTable {
try{ try{
derivedToBaseConversion( cost ); derivedToBaseConversion( cost );
} catch ( ParserSymbolTableException e ){ } catch ( ParserSymbolTableException e ){
cost.release( TypeInfoProvider.getProvider( this ) ); cost.release( getTypeInfoProvider() );
throw e; throw e;
} }
@ -1948,7 +1948,7 @@ public class ParserSymbolTable {
} }
} }
TypeInfoProvider provider = TypeInfoProvider.getProvider( this ); TypeInfoProvider provider = getTypeInfoProvider();
//conversion operators //conversion operators
if( source.getType() == ITypeInfo.t_type ){ if( source.getType() == ITypeInfo.t_type ){
source = getFlatTypeInfo( source, provider ); source = getFlatTypeInfo( source, provider );
@ -2139,6 +2139,7 @@ public class ParserSymbolTable {
private IContainerSymbol _compilationUnit; private IContainerSymbol _compilationUnit;
private ParserLanguage _language; private ParserLanguage _language;
private TypeInfoProvider _typeInfoProvider;
private ParserMode _mode; private ParserMode _mode;
public void setLanguage( ParserLanguage language ){ public void setLanguage( ParserLanguage language ){
@ -2154,7 +2155,7 @@ public class ParserSymbolTable {
} }
public TypeInfoProvider getTypeInfoProvider(){ public TypeInfoProvider getTypeInfoProvider(){
return TypeInfoProvider.getProvider( this ); return _typeInfoProvider;
} }
// protected void pushCommand( Command command ){ // protected void pushCommand( Command command ){

View file

@ -177,7 +177,7 @@ public final class TemplateEngine {
return true; return true;
} else { } else {
Cost cost = null; Cost cost = null;
TypeInfoProvider provider = TypeInfoProvider.getProvider( param.getSymbolTable() ); TypeInfoProvider provider = param.getSymbolTable().getTypeInfoProvider();
try{ try{
ITypeInfo info = provider.getTypeInfo( param.getTypeInfo().getTemplateParameterType() ); ITypeInfo info = provider.getTypeInfo( param.getTypeInfo().getTemplateParameterType() );
try { try {
@ -462,6 +462,8 @@ public final class TemplateEngine {
if( symbol == null || ( a.isType( ITypeInfo.t_type) && aSymbol == null ) || a.isType( ITypeInfo.t_undef )) if( symbol == null || ( a.isType( ITypeInfo.t_type) && aSymbol == null ) || a.isType( ITypeInfo.t_undef ))
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo ); throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
if( symbol instanceof IDeferredTemplateInstance || symbol.isTemplateInstance() ){ if( symbol instanceof IDeferredTemplateInstance || symbol.isTemplateInstance() ){
if( aSymbol == null )
return false;
return deduceFromTemplateTemplateArguments(map, symbol, aSymbol); return deduceFromTemplateTemplateArguments(map, symbol, aSymbol);
} }
if( symbol.isType( ITypeInfo.t_templateParameter ) ){ if( symbol.isType( ITypeInfo.t_templateParameter ) ){
@ -1308,6 +1310,9 @@ public final class TemplateEngine {
ITemplateSymbol t1 = getContainingTemplate( p1 ); ITemplateSymbol t1 = getContainingTemplate( p1 );
ITemplateSymbol t2 = getContainingTemplate( p2 ); ITemplateSymbol t2 = getContainingTemplate( p2 );
if( t1 == null || t2 == null )
return false;
if( p1.getTypeInfo().getTemplateParameterType() == ITypeInfo.t_typeName ) if( p1.getTypeInfo().getTemplateParameterType() == ITypeInfo.t_typeName )
{ {
List l1 = t1.getParameterList(), l2 = t2.getParameterList(); List l1 = t1.getParameterList(), l2 = t2.getParameterList();

View file

@ -307,7 +307,7 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb
//in defining the explicit specialization for a member function, the factory would have set //in defining the explicit specialization for a member function, the factory would have set
//the specialization as the definition of the original declaration, which it is not //the specialization as the definition of the original declaration, which it is not
if( found.isForwardDeclaration() && found.getForwardSymbol() == symbol ) if( found.isForwardDeclaration() && found.getForwardSymbol() == symbol )
found.setTypeSymbol( null ); found.setForwardSymbol( null );
//TODO, once we can instantiate members as we need them instead of at the same time as the class //TODO, once we can instantiate members as we need them instead of at the same time as the class
//then found should stay as the instance, for now though, we need the original (not 100% correct //then found should stay as the instance, for now though, we need the original (not 100% correct

View file

@ -14,9 +14,6 @@
*/ */
package org.eclipse.cdt.internal.core.parser.pst; package org.eclipse.cdt.internal.core.parser.pst;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.internal.core.parser.pst.ITypeInfo.PtrOp; import org.eclipse.cdt.internal.core.parser.pst.ITypeInfo.PtrOp;
import org.eclipse.cdt.internal.core.parser.pst.ITypeInfo.eType; import org.eclipse.cdt.internal.core.parser.pst.ITypeInfo.eType;
@ -27,7 +24,6 @@ public class TypeInfoProvider
private static final int TYPE = 1; private static final int TYPE = 1;
private static final int TEMPLATE = 2; private static final int TEMPLATE = 2;
private static final int POOL_SIZE = 16; private static final int POOL_SIZE = 16;
private static final Map providerMap = new HashMap();
private final ITypeInfo [][] pool; private final ITypeInfo [][] pool;
private final boolean [][] free; private final boolean [][] free;
@ -42,24 +38,17 @@ public class TypeInfoProvider
for( int i = 0; i < POOL_SIZE; i++ ) for( int i = 0; i < POOL_SIZE; i++ )
{ {
pool[i] = new ITypeInfo[] { new BasicTypeInfo(), new TypeInfo(), new TemplateParameterTypeInfo() }; pool[i] = new ITypeInfo[] { newInfo( ITypeInfo.t_void, true ),
newInfo( ITypeInfo.t_type, true ),
newInfo( ITypeInfo.t_templateParameter, true ) };
free[i] = new boolean [] { true, true, true }; free[i] = new boolean [] { true, true, true };
} }
} }
static public TypeInfoProvider getProvider( ParserSymbolTable table ){
if( providerMap.containsKey( table ) )
return (TypeInfoProvider) providerMap.get( table );
TypeInfoProvider provider = new TypeInfoProvider();
providerMap.put( table, provider );
return provider;
}
public ITypeInfo getTypeInfo( eType type ) public ITypeInfo getTypeInfo( eType type )
{ {
int idx = BASIC; int idx = BASIC;
if( type == ITypeInfo.t_type ) if( type == ITypeInfo.t_type || type == ITypeInfo.t_enumerator )
idx = TYPE; idx = TYPE;
else if( type == ITypeInfo.t_templateParameter ) else if( type == ITypeInfo.t_templateParameter )
idx = TEMPLATE; idx = TEMPLATE;
@ -196,7 +185,7 @@ public class TypeInfoProvider
* @param def * @param def
* @return * @return
*/ */
public static ITypeInfo newTypeInfo( eType type, int bits, ISymbol symbol, PtrOp op, Object def ) { public final static ITypeInfo newTypeInfo( eType type, int bits, ISymbol symbol, PtrOp op, Object def ) {
ITypeInfo newInfo = newInfo( type, def != null ); ITypeInfo newInfo = newInfo( type, def != null );
newInfo.setType( type ); newInfo.setType( type );
@ -209,7 +198,7 @@ public class TypeInfoProvider
/** /**
* @return * @return
*/ */
public static ITypeInfo newTypeInfo() { public final static ITypeInfo newTypeInfo() {
return new BasicTypeInfo(); return new BasicTypeInfo();
} }
@ -250,10 +239,12 @@ public class TypeInfoProvider
if( templateParamType != null ) if( templateParamType != null )
newInfo.setTemplateParameterType( templateParamType ); newInfo.setTemplateParameterType( templateParamType );
//clear the fields
beginTypeConstruction();
return newInfo; return newInfo;
} }
private static ITypeInfo newInfo( eType type, boolean def ){ private final static ITypeInfo newInfo( eType type, boolean def ){
ITypeInfo newInfo = null; ITypeInfo newInfo = null;
if( type == ITypeInfo.t_type || type == ITypeInfo.t_enumerator ){ if( type == ITypeInfo.t_type || type == ITypeInfo.t_enumerator ){
if( def ) if( def )