1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

The following changes are made:

- xxIndexVisitor objects are reused
- NamedEntry objects are reused where possible (not always).

Result:
overall memory consumption during indexation
is decreased by 10% approximately.
This commit is contained in:
Oleg Krasilnikov 2006-03-03 12:41:56 +00:00
parent 2e43c1a04b
commit 632cfdc3d6
6 changed files with 137 additions and 68 deletions

View file

@ -40,4 +40,12 @@ public class FunctionEntry extends NamedEntry implements IFunctionEntry {
output.addIndexEntry(this);
}
/* BugZilla ID#124618 */
public void setFunctionEntry(int meta_kind, int entry_type, char[][] fullName, int modifiers, int fileNumber) {
setNamedEntry(meta_kind, entry_type, fullName, modifiers, fileNumber);
// since we reuse FunctionEntry instance,
// the following vars should be cleared.
this.signature = null;
this.returnString = null;
}
}

View file

@ -39,4 +39,11 @@ public class NamedEntry extends CIndexStorageEntry implements INamedEntry {
output.addIndexEntry(this);
}
/* BugZilla ID#124618 */
public void setNamedEntry(int meta_kind, int entry_type, char[][] fullName, int modifiers, int fileNumber) {
this.entry_type = entry_type;
this.fileNumber = fileNumber;
this.fullName = fullName;
this.modifiers = modifiers;
}
}

View file

@ -47,4 +47,16 @@ public class TypeEntry extends NamedEntry implements ITypeEntry {
this.friends = friends;
}
/* BugZilla ID#124618 */
public void setTypeEntry(int type_kind, int entry_type, char[][] fullName, int modifiers, int fileNumber) {
this.entry_type = entry_type;
this.fileNumber = fileNumber;
this.fullName = fullName;
this.modifiers = modifiers;
this.type_kind = type_kind;
// since we reuse TypeEntry instance,
// the following vars should be cleared.
this.baseTypes = null;
this.friends = null;
}
}

View file

@ -37,7 +37,12 @@ import org.eclipse.cdt.internal.core.index.TypeEntry;
import org.eclipse.cdt.internal.core.model.Util;
public class CGenerateIndexVisitor extends CASTVisitor {
private DOMSourceIndexerRunner indexer;
private DOMSourceIndexerRunner indexer;
private FunctionEntry commonFunctionEntry;
private TypeEntry commonTypeEntry;
private NamedEntry commonNamedEntry;
{
shouldVisitNames = true;
shouldVisitDeclarations = true;
@ -58,6 +63,16 @@ public class CGenerateIndexVisitor extends CASTVisitor {
public CGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
super();
this.indexer = indexer;
// reuse of XXXEntry object allows to reduce memory consumption
char[][] dummy = new char[][] { null };
commonFunctionEntry = new FunctionEntry(IIndex.FUNCTION, 0, dummy, 0, 0);
commonTypeEntry = new TypeEntry (0, 0, dummy, 0, 0);
commonNamedEntry = new NamedEntry(0, 0, dummy, 0, 0);
}
/* BugZilla ID#124618 */
public void setCGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
this.indexer = indexer;
}
/* (non-Javadoc)
@ -187,10 +202,10 @@ public class CGenerateIndexVisitor extends CASTVisitor {
}
// guard against cpp entities in c project
if (iEntryType != 0) {
TypeEntry indexEntry = new TypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonTypeEntry.serialize(indexer.getOutput());
}
}
else if (binding instanceof IEnumeration){
@ -198,32 +213,32 @@ public class CGenerateIndexVisitor extends CASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonTypeEntry.serialize(indexer.getOutput());
}
else if (binding instanceof ITypedef) {
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonTypeEntry.serialize(indexer.getOutput());
}
else if (binding instanceof IEnumerator) {
NamedEntry indexEntry = new NamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonNamedEntry.serialize(indexer.getOutput());
}
else if (binding instanceof IField) {
int modifiers = 0;
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
NamedEntry indexEntry = new NamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonNamedEntry.serialize(indexer.getOutput());
}
else if (binding instanceof IVariable &&
!(binding instanceof IParameter)) {
@ -234,10 +249,10 @@ public class CGenerateIndexVisitor extends CASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
NamedEntry indexEntry = new NamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.serialize(indexer.getOutput());
commonNamedEntry.serialize(indexer.getOutput());
}
}
else if (binding instanceof IFunction) {
@ -245,12 +260,12 @@ public class CGenerateIndexVisitor extends CASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
commonFunctionEntry.setFunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
indexEntry.serialize(indexer.getOutput());
commonFunctionEntry.serialize(indexer.getOutput());
}
}

View file

@ -59,6 +59,9 @@ import org.eclipse.cdt.internal.core.model.Util;
public class CPPGenerateIndexVisitor extends CPPASTVisitor {
private DOMSourceIndexerRunner indexer;
private FunctionEntry commonFunctionEntry;
private TypeEntry commonTypeEntry;
private NamedEntry commonNamedEntry;
{
shouldVisitNames = true;
shouldVisitDeclarations = true;
@ -81,8 +84,19 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
public CPPGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
super();
this.indexer = indexer;
// reuse of XXXEntry object allows to reduce memory consumption
char[][] dummy = new char[0][0];
commonFunctionEntry = new FunctionEntry(IIndex.FUNCTION, 0, dummy, 0, 0);
commonTypeEntry = new TypeEntry (0, 0, dummy, 0, 0);
commonNamedEntry = new NamedEntry(0, 0, dummy, 0, 0);
}
/* BugZilla ID#124618 */
public void setCPPGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
this.indexer = indexer;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor#visit(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition)
*/
@ -228,52 +242,52 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
TypeEntry indexEntry = new TypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
if (entryKind == IIndex.DEFINITION && binding instanceof ICPPClassType) {
addDerivedDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
addFriendDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
addDerivedDeclarations(name, (ICPPClassType)binding, commonTypeEntry, fileNumber);
addFriendDeclarations(name, (ICPPClassType)binding, commonTypeEntry, fileNumber);
}
serialize(indexEntry);
serialize(commonTypeEntry);
}
else if (binding instanceof IEnumeration) {
int modifiers = 0;
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonTypeEntry);
}
else if (binding instanceof ITypedef) {
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonTypeEntry.setTypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonTypeEntry);
}
else if (binding instanceof ICPPNamespace) {
NamedEntry indexEntry = new NamedEntry(IIndex.NAMESPACE, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.NAMESPACE, entryKind, qualifiedName, 0, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonNamedEntry);
}
else if (binding instanceof IEnumerator) {
NamedEntry indexEntry = new NamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonNamedEntry);
}
else if (binding instanceof IField) {
int modifiers = 0;
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
NamedEntry indexEntry = new NamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonNamedEntry);
}
else if (binding instanceof IVariable &&
!(binding instanceof IParameter)) {
@ -284,10 +298,10 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
NamedEntry indexEntry = new NamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.setNamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
serialize(indexEntry);
serialize(commonNamedEntry);
}
}
else if (binding instanceof ICPPMethod) {
@ -295,12 +309,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.METHOD, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((ICPPMethod) binding));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((ICPPMethod) binding));
commonFunctionEntry.setFunctionEntry(IIndex.METHOD, entryKind, qualifiedName, modifiers, fileNumber);
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((ICPPMethod) binding));
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((ICPPMethod) binding));
serialize(indexEntry);
serialize(commonFunctionEntry);
// TODO In case we want to add friend method declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;
@ -311,12 +325,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
if (entryKind != IIndex.REFERENCE) {
modifiers = IndexVisitorUtil.getModifiers(name, binding);
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
commonFunctionEntry.setFunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
serialize(indexEntry);
serialize(commonFunctionEntry);
// TODO In case we want to add friend function declarations to index
// if (isFriendDeclaration(name, binding)) {
// entryType = IndexerOutputWrapper.FRIEND;

View file

@ -59,7 +59,11 @@ import org.eclipse.core.runtime.Path;
public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
private DOMSourceIndexer indexer;
// Bug 124618: reuse NamedEntry & Visitor instances to reduce memory consumption
private NamedEntry commonNamedEntry;
static CGenerateIndexVisitor visitorC = null;
static CPPGenerateIndexVisitor visitorCPP = null;
// for running JUnit tests
private static boolean skipScannerInfoTest=false;
@ -73,6 +77,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
public DOMSourceIndexerRunner(IFile resource, DOMSourceIndexer indexer) {
this.resourceFile = resource;
this.indexer = indexer;
commonNamedEntry = new NamedEntry(0, 0, new char[][] { null }, 0, 0);
}
/**
@ -118,18 +123,26 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
if (AbstractIndexerRunner.TIMING)
parseTime = System.currentTimeMillis();
// first clear all problem markers on non-external include files
clearProblemMarkers(tu.getIncludeDirectives());
ASTVisitor visitor = null;
//C or CPP?
if (tu.getParserLanguage() == ParserLanguage.CPP) {
visitor = new CPPGenerateIndexVisitor(this);
if (visitorCPP == null)
visitorCPP = new CPPGenerateIndexVisitor(this);
else
visitorCPP.setCPPGenerateIndexVisitor(this);
visitor = visitorCPP;
} else {
visitor = new CGenerateIndexVisitor(this);
if (visitorC == null)
visitorC = new CGenerateIndexVisitor(this);
else
visitorC.setCGenerateIndexVisitor(this);
visitor = visitorC;
}
tu.accept(visitor);
processMacroDefinitions(tu.getMacroDefinitions());
@ -284,9 +297,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
getOutput().addRelatives(fileNumber, include,
(parent != null) ? parent.getIncludeDirective().getPath() : null);
NamedEntry namedEntry = new NamedEntry(IIndex.INCLUDE, IIndex.REFERENCE, new char[][] {include.toCharArray()}, 0, fileNumber);
namedEntry.setNameOffset(1, 1, IIndex.OFFSET);
namedEntry.serialize(getOutput());
commonNamedEntry.setNamedEntry(IIndex.INCLUDE, IIndex.REFERENCE, new char[][] {include.toCharArray()}, 0, fileNumber);
commonNamedEntry.setNameOffset(1, 1, IIndex.OFFSET);
commonNamedEntry.serialize(getOutput());
/* See if this file has been encountered before */
indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include), true);
@ -310,9 +323,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro);
int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc);
NamedEntry namedEntry = new NamedEntry(IIndex.MACRO, IIndex.DECLARATION, new char[][] {macro.toCharArray()}, 0, fileNumber);
namedEntry.setNameOffset(loc.getNodeOffset(), loc.getNodeLength(), IIndex.OFFSET);
namedEntry.serialize(getOutput());
commonNamedEntry.setNamedEntry(IIndex.MACRO, IIndex.DECLARATION, new char[][] {macro.toCharArray()}, 0, fileNumber);
commonNamedEntry.setNameOffset(loc.getNodeOffset(), loc.getNodeLength(), IIndex.OFFSET);
commonNamedEntry.serialize(getOutput());
}
}