Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2004-07-12 14:16:50 +0000
committerAndrew Niefer2004-07-12 14:16:50 +0000
commite56097574196f6b06c09b4478ba478805d61b0fe (patch)
treec3681a36c24a6b37444a9c265b4f911eb85b4cd7
parentb78e2165a24b61be42acf33edc2cd80cef274d49 (diff)
downloadorg.eclipse.cdt-e56097574196f6b06c09b4478ba478805d61b0fe.tar.gz
org.eclipse.cdt-e56097574196f6b06c09b4478ba478805d61b0fe.tar.xz
org.eclipse.cdt-e56097574196f6b06c09b4478ba478805d61b0fe.zip
fix memory leak in the symbol table.
also fix a couple of places that were still doing symbol forwarding the old way
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java2
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java6
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java8
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java19
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfoProvider.java27
9 files changed, 36 insertions, 39 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java
index a48a00fe22d..a1b0f570802 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java
@@ -51,7 +51,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
public ParserSymbolTable newTable( ParserLanguage language ){
table = new ParserSymbolTable( language, ParserMode.COMPLETE_PARSE );
- provider = TypeInfoProvider.getProvider( table );
+ provider = table.getTypeInfoProvider();
return table;
}
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
index e8b8b4a7a48..7abf5452052 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
@@ -72,7 +72,7 @@ public class ParserSymbolTableTest extends TestCase {
public ParserSymbolTable newTable( ParserLanguage language, ParserMode mode ){
table = new ParserSymbolTable( language, mode );
- provider = TypeInfoProvider.getProvider( table );
+ provider = table.getTypeInfoProvider();
return table;
}
/**
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
index 96a375a97b7..ef8f12c2890 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
@@ -1563,7 +1563,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
//basic types
if( kind.isBasicType() ){
- TypeInfoProvider provider = TypeInfoProvider.getProvider( pst );
+ TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction();
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{
- TypeInfoProvider provider = TypeInfoProvider.getProvider( pst );
+ TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction();
if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier )
{
@@ -3022,7 +3022,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{
ISymbol symbol = null;
- TypeInfoProvider provider = TypeInfoProvider.getProvider( pst );
+ TypeInfoProvider provider = pst.getTypeInfoProvider();
provider.beginTypeConstruction();
if( defaultValue != null ){
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
index e22499e918c..b93669094ca 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
@@ -1090,11 +1090,11 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
if( !alreadyReturned.contains( extensible ) ){
if( extensible instanceof ISymbol ){
ISymbol symbol = (ISymbol) extensible;
- if( symbol.isForwardDeclaration() && symbol.getTypeSymbol() != null &&
- symbol.getTypeSymbol().getContainingSymbol() == ContainerSymbol.this )
+ if( symbol.isForwardDeclaration() && symbol.getForwardSymbol() != null &&
+ symbol.getForwardSymbol().getContainingSymbol() == ContainerSymbol.this )
{
- alreadyReturned.add( symbol.getTypeSymbol() );
- return symbol.getTypeSymbol();
+ alreadyReturned.add( symbol.getForwardSymbol() );
+ return symbol.getForwardSymbol();
}
} else if( extensible instanceof IUsingDeclarationSymbol ){
IUsingDeclarationSymbol using = (IUsingDeclarationSymbol) extensible;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java
index fcd61a2f9b8..5eb5045c8b5 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java
@@ -201,7 +201,7 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva
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.setBit( true, ITypeInfo.isConst );
param.setTypeSymbol( paramType );
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
index 6395811aa94..fd05a82d0e4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
@@ -456,7 +456,7 @@ public class ParserSymbolTable {
return true;
}
- TypeInfoProvider provider = TypeInfoProvider.getProvider( symbol.getSymbolTable() );
+ TypeInfoProvider provider = symbol.getSymbolTable().getTypeInfoProvider();
ITypeInfo typeInfo = ParserSymbolTable.getFlatTypeInfo( symbol.getTypeInfo(), provider );
boolean accept = data.getFilter().shouldAccept( symbol, typeInfo ) || data.getFilter().shouldAccept( symbol );
provider.returnTypeInfo( typeInfo );
@@ -817,7 +817,7 @@ public class ParserSymbolTable {
//friend class declarations
if( origSymbol.getIsInvisible() && origSymbol.isType( newSymbol.getType() ) ){
- origSymbol.getTypeInfo().setTypeSymbol( newSymbol );
+ origSymbol.setForwardSymbol( newSymbol );
return true;
}
}
@@ -1008,8 +1008,8 @@ public class ParserSymbolTable {
for (int i = 0; i < numFns; i++) {
IParameterizedSymbol fn = (IParameterizedSymbol) functions.get(i);
if( fn.isForwardDeclaration() && fn.getForwardSymbol() != null ){
- if( functions.contains( fn.getTypeSymbol() ) ){
- return (IParameterizedSymbol) fn.getTypeSymbol();
+ if( functions.contains( fn.getForwardSymbol() ) ){
+ return (IParameterizedSymbol) fn.getForwardSymbol();
}
}
}
@@ -1041,7 +1041,7 @@ public class ParserSymbolTable {
List sourceParameters = null; //the parameters the function is being called with
List targetParameters = null; //the current function's parameters
- TypeInfoProvider infoProvider = TypeInfoProvider.getProvider( this );
+ TypeInfoProvider infoProvider = getTypeInfoProvider();
if( numSourceParams == 0 ){
//f() is the same as f( void )
@@ -1852,7 +1852,7 @@ public class ParserSymbolTable {
}
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 ){
return cost;
@@ -1900,7 +1900,7 @@ public class ParserSymbolTable {
try{
derivedToBaseConversion( cost );
} catch ( ParserSymbolTableException e ){
- cost.release( TypeInfoProvider.getProvider( this ) );
+ cost.release( getTypeInfoProvider() );
throw e;
}
@@ -1948,7 +1948,7 @@ public class ParserSymbolTable {
}
}
- TypeInfoProvider provider = TypeInfoProvider.getProvider( this );
+ TypeInfoProvider provider = getTypeInfoProvider();
//conversion operators
if( source.getType() == ITypeInfo.t_type ){
source = getFlatTypeInfo( source, provider );
@@ -2139,6 +2139,7 @@ public class ParserSymbolTable {
private IContainerSymbol _compilationUnit;
private ParserLanguage _language;
+ private TypeInfoProvider _typeInfoProvider;
private ParserMode _mode;
public void setLanguage( ParserLanguage language ){
@@ -2154,7 +2155,7 @@ public class ParserSymbolTable {
}
public TypeInfoProvider getTypeInfoProvider(){
- return TypeInfoProvider.getProvider( this );
+ return _typeInfoProvider;
}
// protected void pushCommand( Command command ){
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java
index 7595a8ad68b..330350b798c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java
@@ -177,7 +177,7 @@ public final class TemplateEngine {
return true;
} else {
Cost cost = null;
- TypeInfoProvider provider = TypeInfoProvider.getProvider( param.getSymbolTable() );
+ TypeInfoProvider provider = param.getSymbolTable().getTypeInfoProvider();
try{
ITypeInfo info = provider.getTypeInfo( param.getTypeInfo().getTemplateParameterType() );
try {
@@ -462,6 +462,8 @@ public final class TemplateEngine {
if( symbol == null || ( a.isType( ITypeInfo.t_type) && aSymbol == null ) || a.isType( ITypeInfo.t_undef ))
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
if( symbol instanceof IDeferredTemplateInstance || symbol.isTemplateInstance() ){
+ if( aSymbol == null )
+ return false;
return deduceFromTemplateTemplateArguments(map, symbol, aSymbol);
}
if( symbol.isType( ITypeInfo.t_templateParameter ) ){
@@ -1308,6 +1310,9 @@ public final class TemplateEngine {
ITemplateSymbol t1 = getContainingTemplate( p1 );
ITemplateSymbol t2 = getContainingTemplate( p2 );
+ if( t1 == null || t2 == null )
+ return false;
+
if( p1.getTypeInfo().getTemplateParameterType() == ITypeInfo.t_typeName )
{
List l1 = t1.getParameterList(), l2 = t2.getParameterList();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java
index ab5f551e125..52f53d3bb93 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java
@@ -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
//the specialization as the definition of the original declaration, which it is not
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
//then found should stay as the instance, for now though, we need the original (not 100% correct
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfoProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfoProvider.java
index d356368c317..611ab173c6c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfoProvider.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfoProvider.java
@@ -14,9 +14,6 @@
*/
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.eType;
@@ -27,7 +24,6 @@ public class TypeInfoProvider
private static final int TYPE = 1;
private static final int TEMPLATE = 2;
private static final int POOL_SIZE = 16;
- private static final Map providerMap = new HashMap();
private final ITypeInfo [][] pool;
private final boolean [][] free;
@@ -42,24 +38,17 @@ public class TypeInfoProvider
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 };
}
}
- 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 )
{
int idx = BASIC;
- if( type == ITypeInfo.t_type )
+ if( type == ITypeInfo.t_type || type == ITypeInfo.t_enumerator )
idx = TYPE;
else if( type == ITypeInfo.t_templateParameter )
idx = TEMPLATE;
@@ -196,7 +185,7 @@ public class TypeInfoProvider
* @param def
* @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 );
newInfo.setType( type );
@@ -209,7 +198,7 @@ public class TypeInfoProvider
/**
* @return
*/
- public static ITypeInfo newTypeInfo() {
+ public final static ITypeInfo newTypeInfo() {
return new BasicTypeInfo();
}
@@ -250,10 +239,12 @@ public class TypeInfoProvider
if( templateParamType != null )
newInfo.setTemplateParameterType( templateParamType );
+ //clear the fields
+ beginTypeConstruction();
return newInfo;
}
- private static ITypeInfo newInfo( eType type, boolean def ){
+ private final static ITypeInfo newInfo( eType type, boolean def ){
ITypeInfo newInfo = null;
if( type == ITypeInfo.t_type || type == ITypeInfo.t_enumerator ){
if( def )

Back to the top