mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52: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:
parent
2e43c1a04b
commit
632cfdc3d6
6 changed files with 137 additions and 68 deletions
|
@ -40,4 +40,12 @@ public class FunctionEntry extends NamedEntry implements IFunctionEntry {
|
||||||
output.addIndexEntry(this);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,4 +39,11 @@ public class NamedEntry extends CIndexStorageEntry implements INamedEntry {
|
||||||
output.addIndexEntry(this);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,16 @@ public class TypeEntry extends NamedEntry implements ITypeEntry {
|
||||||
this.friends = friends;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,12 @@ import org.eclipse.cdt.internal.core.index.TypeEntry;
|
||||||
import org.eclipse.cdt.internal.core.model.Util;
|
import org.eclipse.cdt.internal.core.model.Util;
|
||||||
|
|
||||||
public class CGenerateIndexVisitor extends CASTVisitor {
|
public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
private DOMSourceIndexerRunner indexer;
|
private DOMSourceIndexerRunner indexer;
|
||||||
|
|
||||||
|
private FunctionEntry commonFunctionEntry;
|
||||||
|
private TypeEntry commonTypeEntry;
|
||||||
|
private NamedEntry commonNamedEntry;
|
||||||
|
|
||||||
{
|
{
|
||||||
shouldVisitNames = true;
|
shouldVisitNames = true;
|
||||||
shouldVisitDeclarations = true;
|
shouldVisitDeclarations = true;
|
||||||
|
@ -58,6 +63,16 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
public CGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
|
public CGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
|
||||||
super();
|
super();
|
||||||
this.indexer = indexer;
|
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)
|
/* (non-Javadoc)
|
||||||
|
@ -187,10 +202,10 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
}
|
}
|
||||||
// guard against cpp entities in c project
|
// guard against cpp entities in c project
|
||||||
if (iEntryType != 0) {
|
if (iEntryType != 0) {
|
||||||
TypeEntry indexEntry = new TypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
|
commonTypeEntry.setTypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonTypeEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (binding instanceof IEnumeration){
|
else if (binding instanceof IEnumeration){
|
||||||
|
@ -198,32 +213,32 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
|
commonTypeEntry.setTypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonTypeEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
else if (binding instanceof ITypedef) {
|
else if (binding instanceof ITypedef) {
|
||||||
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
|
commonTypeEntry.setTypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonTypeEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
else if (binding instanceof IEnumerator) {
|
else if (binding instanceof IEnumerator) {
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonNamedEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
else if (binding instanceof IField) {
|
else if (binding instanceof IField) {
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonNamedEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
else if (binding instanceof IVariable &&
|
else if (binding instanceof IVariable &&
|
||||||
!(binding instanceof IParameter)) {
|
!(binding instanceof IParameter)) {
|
||||||
|
@ -234,10 +249,10 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonNamedEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (binding instanceof IFunction) {
|
else if (binding instanceof IFunction) {
|
||||||
|
@ -245,12 +260,12 @@ public class CGenerateIndexVisitor extends CASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
|
commonFunctionEntry.setFunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
|
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
|
||||||
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
|
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
|
||||||
|
|
||||||
indexEntry.serialize(indexer.getOutput());
|
commonFunctionEntry.serialize(indexer.getOutput());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,9 @@ import org.eclipse.cdt.internal.core.model.Util;
|
||||||
public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
||||||
private DOMSourceIndexerRunner indexer;
|
private DOMSourceIndexerRunner indexer;
|
||||||
|
|
||||||
|
private FunctionEntry commonFunctionEntry;
|
||||||
|
private TypeEntry commonTypeEntry;
|
||||||
|
private NamedEntry commonNamedEntry;
|
||||||
{
|
{
|
||||||
shouldVisitNames = true;
|
shouldVisitNames = true;
|
||||||
shouldVisitDeclarations = true;
|
shouldVisitDeclarations = true;
|
||||||
|
@ -81,8 +84,19 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
||||||
public CPPGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
|
public CPPGenerateIndexVisitor(DOMSourceIndexerRunner indexer) {
|
||||||
super();
|
super();
|
||||||
this.indexer = indexer;
|
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)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor#visit(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition)
|
* @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) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
TypeEntry indexEntry = new TypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
|
commonTypeEntry.setTypeEntry(iEntryType, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
if (entryKind == IIndex.DEFINITION && binding instanceof ICPPClassType) {
|
if (entryKind == IIndex.DEFINITION && binding instanceof ICPPClassType) {
|
||||||
addDerivedDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
|
addDerivedDeclarations(name, (ICPPClassType)binding, commonTypeEntry, fileNumber);
|
||||||
addFriendDeclarations(name, (ICPPClassType)binding, indexEntry, fileNumber);
|
addFriendDeclarations(name, (ICPPClassType)binding, commonTypeEntry, fileNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonTypeEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof IEnumeration) {
|
else if (binding instanceof IEnumeration) {
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
|
commonTypeEntry.setTypeEntry(IIndex.TYPE_ENUM, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonTypeEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof ITypedef) {
|
else if (binding instanceof ITypedef) {
|
||||||
TypeEntry indexEntry = new TypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
|
commonTypeEntry.setTypeEntry(IIndex.TYPE_TYPEDEF, entryKind, qualifiedName, 0, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonTypeEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonTypeEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof ICPPNamespace) {
|
else if (binding instanceof ICPPNamespace) {
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.NAMESPACE, entryKind, qualifiedName, 0, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.NAMESPACE, entryKind, qualifiedName, 0, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonNamedEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof IEnumerator) {
|
else if (binding instanceof IEnumerator) {
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.ENUMTOR, entryKind, qualifiedName, 0, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonNamedEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof IField) {
|
else if (binding instanceof IField) {
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.FIELD, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonNamedEntry);
|
||||||
}
|
}
|
||||||
else if (binding instanceof IVariable &&
|
else if (binding instanceof IVariable &&
|
||||||
!(binding instanceof IParameter)) {
|
!(binding instanceof IParameter)) {
|
||||||
|
@ -284,10 +298,10 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
NamedEntry indexEntry = new NamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.VAR, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonNamedEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (binding instanceof ICPPMethod) {
|
else if (binding instanceof ICPPMethod) {
|
||||||
|
@ -295,12 +309,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
FunctionEntry indexEntry = new FunctionEntry(IIndex.METHOD, entryKind, qualifiedName, modifiers, fileNumber);
|
commonFunctionEntry.setFunctionEntry(IIndex.METHOD, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
indexEntry.setSignature(IndexVisitorUtil.getParameters((ICPPMethod) binding));
|
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((ICPPMethod) binding));
|
||||||
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((ICPPMethod) binding));
|
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((ICPPMethod) binding));
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonFunctionEntry);
|
||||||
// TODO In case we want to add friend method declarations to index
|
// TODO In case we want to add friend method declarations to index
|
||||||
// if (isFriendDeclaration(name, binding)) {
|
// if (isFriendDeclaration(name, binding)) {
|
||||||
// entryType = IndexerOutputWrapper.FRIEND;
|
// entryType = IndexerOutputWrapper.FRIEND;
|
||||||
|
@ -311,12 +325,12 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
|
||||||
if (entryKind != IIndex.REFERENCE) {
|
if (entryKind != IIndex.REFERENCE) {
|
||||||
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
modifiers = IndexVisitorUtil.getModifiers(name, binding);
|
||||||
}
|
}
|
||||||
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
|
commonFunctionEntry.setFunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
|
||||||
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
commonFunctionEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
|
||||||
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
|
commonFunctionEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
|
||||||
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
|
commonFunctionEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
|
||||||
|
|
||||||
serialize(indexEntry);
|
serialize(commonFunctionEntry);
|
||||||
// TODO In case we want to add friend function declarations to index
|
// TODO In case we want to add friend function declarations to index
|
||||||
// if (isFriendDeclaration(name, binding)) {
|
// if (isFriendDeclaration(name, binding)) {
|
||||||
// entryType = IndexerOutputWrapper.FRIEND;
|
// entryType = IndexerOutputWrapper.FRIEND;
|
||||||
|
|
|
@ -59,7 +59,11 @@ import org.eclipse.core.runtime.Path;
|
||||||
public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
|
public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
|
||||||
|
|
||||||
private DOMSourceIndexer indexer;
|
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
|
// for running JUnit tests
|
||||||
private static boolean skipScannerInfoTest=false;
|
private static boolean skipScannerInfoTest=false;
|
||||||
|
|
||||||
|
@ -73,6 +77,7 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
|
||||||
public DOMSourceIndexerRunner(IFile resource, DOMSourceIndexer indexer) {
|
public DOMSourceIndexerRunner(IFile resource, DOMSourceIndexer indexer) {
|
||||||
this.resourceFile = resource;
|
this.resourceFile = resource;
|
||||||
this.indexer = indexer;
|
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)
|
if (AbstractIndexerRunner.TIMING)
|
||||||
parseTime = System.currentTimeMillis();
|
parseTime = System.currentTimeMillis();
|
||||||
|
|
||||||
// first clear all problem markers on non-external include files
|
// first clear all problem markers on non-external include files
|
||||||
clearProblemMarkers(tu.getIncludeDirectives());
|
clearProblemMarkers(tu.getIncludeDirectives());
|
||||||
|
|
||||||
ASTVisitor visitor = null;
|
ASTVisitor visitor = null;
|
||||||
//C or CPP?
|
//C or CPP?
|
||||||
if (tu.getParserLanguage() == ParserLanguage.CPP) {
|
if (tu.getParserLanguage() == ParserLanguage.CPP) {
|
||||||
visitor = new CPPGenerateIndexVisitor(this);
|
if (visitorCPP == null)
|
||||||
|
visitorCPP = new CPPGenerateIndexVisitor(this);
|
||||||
|
else
|
||||||
|
visitorCPP.setCPPGenerateIndexVisitor(this);
|
||||||
|
visitor = visitorCPP;
|
||||||
} else {
|
} else {
|
||||||
visitor = new CGenerateIndexVisitor(this);
|
if (visitorC == null)
|
||||||
|
visitorC = new CGenerateIndexVisitor(this);
|
||||||
|
else
|
||||||
|
visitorC.setCGenerateIndexVisitor(this);
|
||||||
|
visitor = visitorC;
|
||||||
}
|
}
|
||||||
|
|
||||||
tu.accept(visitor);
|
tu.accept(visitor);
|
||||||
|
|
||||||
processMacroDefinitions(tu.getMacroDefinitions());
|
processMacroDefinitions(tu.getMacroDefinitions());
|
||||||
|
@ -284,9 +297,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
|
||||||
getOutput().addRelatives(fileNumber, include,
|
getOutput().addRelatives(fileNumber, include,
|
||||||
(parent != null) ? parent.getIncludeDirective().getPath() : null);
|
(parent != null) ? parent.getIncludeDirective().getPath() : null);
|
||||||
|
|
||||||
NamedEntry namedEntry = new NamedEntry(IIndex.INCLUDE, IIndex.REFERENCE, new char[][] {include.toCharArray()}, 0, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.INCLUDE, IIndex.REFERENCE, new char[][] {include.toCharArray()}, 0, fileNumber);
|
||||||
namedEntry.setNameOffset(1, 1, IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(1, 1, IIndex.OFFSET);
|
||||||
namedEntry.serialize(getOutput());
|
commonNamedEntry.serialize(getOutput());
|
||||||
|
|
||||||
/* See if this file has been encountered before */
|
/* See if this file has been encountered before */
|
||||||
indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include), true);
|
indexer.haveEncounteredHeader(resourceFile.getProject().getFullPath(), new Path(include), true);
|
||||||
|
@ -310,9 +323,9 @@ public class DOMSourceIndexerRunner extends AbstractIndexerRunner {
|
||||||
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro);
|
IASTFileLocation loc = IndexEncoderUtil.getFileLocation(macro);
|
||||||
int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc);
|
int fileNumber = IndexEncoderUtil.calculateIndexFlags(this, loc);
|
||||||
|
|
||||||
NamedEntry namedEntry = new NamedEntry(IIndex.MACRO, IIndex.DECLARATION, new char[][] {macro.toCharArray()}, 0, fileNumber);
|
commonNamedEntry.setNamedEntry(IIndex.MACRO, IIndex.DECLARATION, new char[][] {macro.toCharArray()}, 0, fileNumber);
|
||||||
namedEntry.setNameOffset(loc.getNodeOffset(), loc.getNodeLength(), IIndex.OFFSET);
|
commonNamedEntry.setNameOffset(loc.getNodeOffset(), loc.getNodeLength(), IIndex.OFFSET);
|
||||||
namedEntry.serialize(getOutput());
|
commonNamedEntry.serialize(getOutput());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue