From a0dd64276b4f12d0a2374c2537bf690f61e64ed5 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Fri, 24 Jun 2005 21:05:28 +0000 Subject: [PATCH] changes to help reduce the number of arrays used in resolving bindings --- .../cdt/core/parser/util/ObjectTable.java | 7 ++ .../dom/parser/cpp/CPPClassInstanceScope.java | 2 +- .../core/dom/parser/cpp/CPPClassType.java | 6 +- .../core/dom/parser/cpp/CPPNamespace.java | 2 +- .../core/dom/parser/cpp/CPPScope.java | 15 +++-- .../core/dom/parser/cpp/CPPSemantics.java | 67 +++++++++---------- 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 );