Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2005-06-24 21:05:28 +0000
committerAndrew Niefer2005-06-24 21:05:28 +0000
commita0dd64276b4f12d0a2374c2537bf690f61e64ed5 (patch)
tree8457ce61a5b5dd7b8b81131032a64080971f7439
parent2b8dec03b8e461bdaf3a6f07be3d621168de221c (diff)
downloadorg.eclipse.cdt-a0dd64276b4f12d0a2374c2537bf690f61e64ed5.tar.gz
org.eclipse.cdt-a0dd64276b4f12d0a2374c2537bf690f61e64ed5.tar.xz
org.eclipse.cdt-a0dd64276b4f12d0a2374c2537bf690f61e64ed5.zip
changes to help reduce the number of arrays used in resolving bindings
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ObjectTable.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java6
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java15
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java67
6 files changed, 53 insertions, 46 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ObjectTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ObjectTable.java
index c1010e0e35a..ec5bab9cb0c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ObjectTable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ObjectTable.java
@@ -15,6 +15,7 @@
*/
package org.eclipse.cdt.core.parser.util;
+import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
@@ -141,4 +142,10 @@ public abstract class ObjectTable extends HashTable implements Cloneable{
System.arraycopy( keyTable, 0, keys, 0, keys.length );
return keys;
}
+
+ public Object [] keyArray( Class c ){
+ Object [] keys = (Object[]) Array.newInstance( c, size() );
+ System.arraycopy( keyTable, 0, keys, 0, keys.length );
+ return keys;
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
index 73a602ae217..5b46146ad84 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
@@ -57,7 +57,7 @@ public class CPPClassInstanceScope implements ICPPClassScope {
}
public boolean isFullyCached(){
if( !isFullyCached ){
- CPPSemantics.LookupData data = new CPPSemantics.LookupData( CPPSemantics.EMPTY_NAME_ARRAY );
+ CPPSemantics.LookupData data = new CPPSemantics.LookupData();
try {
CPPSemantics.lookupInScope( data, this, null );
} catch (DOMException e) {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
index 3fbf1795811..5176f8b019b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
@@ -564,7 +564,7 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods()
*/
public ICPPMethod[] getMethods() throws DOMException {
- ObjectSet set = new ObjectSet(2);
+ ObjectSet set = new ObjectSet(4);
ICPPMethod [] ms = getDeclaredMethods();
set.addAll( ms );
ICPPClassScope scope = (ICPPClassScope) getCompositeScope();
@@ -573,7 +573,7 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
for ( int i = 0; i < bases.length; i++ ) {
set.addAll( bases[i].getBaseClass().getMethods() );
}
- return (ICPPMethod[]) ArrayUtil.trim( ICPPMethod.class, set.keyArray(), true );
+ return (ICPPMethod[]) set.keyArray( ICPPMethod.class );
}
/* (non-Javadoc)
@@ -733,7 +733,7 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
}
}
- return (IBinding[]) ArrayUtil.trim( IBinding.class, resultSet.keyArray(), true );
+ return (IBinding[]) resultSet.keyArray( IBinding.class );
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
index 06f3e086228..9496f84c519 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
@@ -333,7 +333,7 @@ public class CPPNamespace implements ICPPNamespace, ICPPInternalBinding {
}
}
}
- return (IBinding[]) ArrayUtil.trim( IBinding.class, collector.members.keyArray(), true );
+ return (IBinding[]) collector.members.keyArray( IBinding.class );
}
return IBinding.EMPTY_BINDING_ARRAY;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
index 3b9d7791674..56384638046 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
@@ -90,21 +90,22 @@ abstract public class CPPScope implements ICPPScope{
Object obj = bindings.get( c );
if( obj != null ){
if( obj instanceof ObjectSet ) {
+ ObjectSet os = (ObjectSet) obj;
if( forceResolve )
- return CPPSemantics.resolveAmbiguities( name, ((ObjectSet) obj).keyArray() );
+ return CPPSemantics.resolveAmbiguities( name, os.keyArray() );
IBinding [] bs = null;
- Object [] os = ((ObjectSet) obj).keyArray();
- for( int i = 0; i < os.length; i++ ){
- if( os[i] instanceof IASTName ){
- IASTName n = (IASTName) os[i];
+ for( int i = 0; i < os.size(); i++ ){
+ Object o = os.keyAt( i );
+ if( o instanceof IASTName ){
+ IASTName n = (IASTName) o;
if( n instanceof ICPPASTQualifiedName ){
IASTName [] ns = ((ICPPASTQualifiedName)n).getNames();
n = ns[ ns.length - 1 ];
}
bs = (IBinding[]) ArrayUtil.append( IBinding.class, bs, n.getBinding() );
} else
- bs = (IBinding[]) ArrayUtil.append( IBinding.class, bs, os[i] );
- }
+ bs = (IBinding[]) ArrayUtil.append( IBinding.class, bs, o );
+ }
return CPPSemantics.resolveAmbiguities( name, bs );
} else if( obj instanceof IASTName ){
IBinding binding = null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
index 70c0844eb82..8b5f8187bea 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
@@ -138,7 +138,6 @@ public class CPPSemantics {
static protected class LookupData
{
protected IASTName astName;
- public char[] name;
public ObjectMap usingDirectives = ObjectMap.EMPTY_MAP;
public ObjectSet visited = ObjectSet.EMPTY_SET; //used to ensure we don't visit things more than once
public ObjectSet inheritanceChain; //used to detect circular inheritance
@@ -161,14 +160,17 @@ public class CPPSemantics {
public LookupData( IASTName n ){
astName = n;
- this.name = n.toCharArray();
typesOnly = typesOnly();
considerConstructors = considerConstructors();
checkWholeClassScope = checkWholeClassScope();
}
- public LookupData( char [] n ){
+ public LookupData(){
astName = null;
- this.name = n;
+ }
+ public final char [] name () {
+ if( astName != null )
+ return astName.toCharArray();
+ return EMPTY_NAME_ARRAY;
}
public boolean includeBlockItem( IASTNode item ){
if( astName.getPropertyInParent() == STRING_LOOKUP_PROPERTY ) return true;
@@ -590,15 +592,11 @@ public class CPPSemantics {
try {
IScope scope = (binding != null ) ? binding.getScope() : null;
if( data.associated.size() > 0 && ( scope == null|| !(scope instanceof ICPPClassScope) ) ){
- Object [] assoc = new Object[ data.associated.size() ];
- System.arraycopy( data.associated.keyArray(), 0, assoc, 0, assoc.length );
data.ignoreUsingDirectives = true;
data.forceQualified = true;
- for( int i = 0; i < assoc.length; i++ ){
- if( data.associated.containsKey( assoc[i] ) )
- lookup( data, assoc[i] );
+ for( int i = 0; i < data.associated.size(); i++ ){
+ lookup( data, data.associated.keyAt(i) );
}
-
binding = resolveAmbiguities( data, data.astName );
}
} catch ( DOMException e ) {
@@ -663,7 +661,7 @@ public class CPPSemantics {
if( parent instanceof IASTTypeId && parent.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT ){
//don't do a problem here
} else {
- binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_INVALID_TYPE, data.name );
+ binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_INVALID_TYPE, data.name() );
}
}
}
@@ -675,9 +673,9 @@ public class CPPSemantics {
}
if( binding == null ){
if( name instanceof ICPPASTQualifiedName && data.forDefinition() )
- binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND, data.name );
+ binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_MEMBER_DECLARATION_NOT_FOUND, data.name() );
else
- binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.name );
+ binding = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, data.name() );
}
return binding;
}
@@ -1094,13 +1092,13 @@ public class CPPSemantics {
Object [] r = (Object[]) result;
for( int j = 0; j < r.length && r[j] != null; j++ ) {
if( checkForAmbiguity( data, r[j], inherited ) ){
- data.problem = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ data.problem = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
return null;
}
}
} else {
if( checkForAmbiguity( data, result, inherited ) ){
- data.problem = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ data.problem = new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
return null;
}
}
@@ -1655,8 +1653,9 @@ public class CPPSemantics {
return false;
}
char[] c = potential.toCharArray();
- return ( (data.prefixLookup && CharArrayUtils.equals( c, 0, data.name.length, data.name )) ||
- (!data.prefixLookup && CharArrayUtils.equals( c, data.name )) );
+ char [] n = data.name();
+ return ( (data.prefixLookup && CharArrayUtils.equals( c, 0, n.length, n )) ||
+ (!data.prefixLookup && CharArrayUtils.equals( c, n )) );
}
private static void addDefinition( IBinding binding, IASTName name ){
@@ -1817,7 +1816,7 @@ public class CPPSemantics {
{
//ok, stay with the template, the specialization, if applicable, will come out during instantiation
} else if( type != temp && !((IType)type).isSameType( (IType) temp )) {
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
} else if( temp instanceof IFunction ){
if( temp instanceof ICPPTemplateDefinition ){
@@ -1837,14 +1836,14 @@ public class CPPSemantics {
{
//ok, delegates are synonyms
} else if( obj != temp ){
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
}
}
if( data.forUsingDeclaration() ){
IBinding [] bindings = null;
if( obj != null ){
- if( fns.size() > 0 ) return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ if( fns.size() > 0 ) return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
// if( type == null ) return obj;
bindings = (IBinding[]) ArrayUtil.append( IBinding.class, bindings, obj );
bindings = (IBinding[]) ArrayUtil.append( IBinding.class, bindings, type );
@@ -1869,8 +1868,9 @@ public class CPPSemantics {
}
} else {
if( fns == ObjectSet.EMPTY_SET )
- fns = new ObjectSet( templateFns.size() );
- fns.addAll( templateFns );
+ fns = templateFns;
+ else
+ fns.addAll( templateFns );
}
}
int numFns = fns.size();
@@ -1881,8 +1881,8 @@ public class CPPSemantics {
if( numFns > 0 ){
if( obj != null )
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
- return resolveFunction( data, (IBinding[]) ArrayUtil.trim( IBinding.class, fns.keyArray(), true ) );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
+ return resolveFunction( data, (IBinding[]) fns.keyArray( IBinding.class ) );
}
return obj;
@@ -2047,7 +2047,7 @@ public class CPPSemantics {
}
static private IBinding resolveFunction( CPPSemantics.LookupData data, IBinding[] fns ) throws DOMException{
- fns = (IBinding[]) ArrayUtil.trim( IBinding.class, fns, true );
+ fns = (IBinding[]) ArrayUtil.trim( IBinding.class, fns );
if( fns == null || fns.length == 0 )
return null;
@@ -2246,7 +2246,7 @@ public class CPPSemantics {
if( ambiguous || bestHasAmbiguousParam ){
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
return bestFn;
@@ -2280,7 +2280,7 @@ public class CPPSemantics {
while( type != null ){
type = (type != null) ? getUltimateType( type, false ) : null;
if( type == null || !( type instanceof IFunctionType ) )
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
for( int i = 0; i < fns.length; i++ ){
IFunction fn = (IFunction) fns[i];
@@ -2294,7 +2294,7 @@ public class CPPSemantics {
if( result == null )
result = fn;
else
- return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
}
@@ -2305,7 +2305,7 @@ public class CPPSemantics {
}
}
- return ( result != null ) ? result : new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name );
+ return ( result != null ) ? result : new ProblemBinding( data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name() );
}
private static Object getTargetType( LookupData data ){
@@ -2550,15 +2550,14 @@ public class CPPSemantics {
//constructors
if( t instanceof ICPPClassType ){
- LookupData data = new LookupData( EMPTY_NAME_ARRAY );
- data.forUserDefinedConversion = true;
- data.functionParameters = new IType [] { source };
ICPPConstructor [] constructors = ((ICPPClassType)t).getConstructors();
-
if( constructors.length > 0 ){
if( constructors.length == 1 && constructors[0] instanceof IProblemBinding )
constructor = null;
else {
+ LookupData data = new LookupData();
+ data.forUserDefinedConversion = true;
+ data.functionParameters = new IType [] { source };
IBinding binding = resolveFunction( data, constructors );
if( binding instanceof ICPPConstructor )
constructor = (ICPPConstructor) binding;
@@ -3104,7 +3103,7 @@ public class CPPSemantics {
}
}
- return (IBinding[]) ArrayUtil.trim( IBinding.class, set.keyArray(), true );
+ return (IBinding[]) set.keyArray( IBinding.class );
}
public static IBinding [] prefixLookup( IASTName name ){
LookupData data = createLookupData( name, true );

Back to the top