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

Bug 402878. Do not instantiate all members when searching for a matching

one.
This commit is contained in:
Sergey Prigogin 2013-05-16 15:03:27 -07:00
parent 95073b1f13
commit ef19f9a8e6

View file

@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -76,6 +77,10 @@ public class PDOMCPPMemberBlock {
return linkage.getDB();
}
private PDOM getPDOM() {
return linkage.getPDOM();
}
public long getRecord() {
return record;
}
@ -96,6 +101,7 @@ public class PDOMCPPMemberBlock {
private static void addMember(PDOMCPPMemberBlock block, PDOMNode member, int visibility)
throws CoreException {
assert member.getPDOM() == block.getPDOM();
while (true) {
int pos = block.getNextPosition();
if (pos < MAX_MEMBER_COUNT) {
@ -150,16 +156,6 @@ public class PDOMCPPMemberBlock {
return record + MEMBER_POINTERS + Database.PTR_SIZE * memberIndex;
}
private PDOMNode getMember(int memberIndex) throws CoreException {
if (memberIndex < getNextPosition() && memberIndex < MAX_MEMBER_COUNT) {
long memberRecord = getMemberRecord(memberIndex);
if (memberRecord != 0) {
return linkage.getNode(memberRecord);
}
}
return null;
}
private void setVisibility(int memberIndex, int newVisibility) throws CoreException {
newVisibility &= VISIBILITY_MASK;
@ -182,12 +178,20 @@ public class PDOMCPPMemberBlock {
}
private static int getVisibility(PDOMCPPMemberBlock block, IBinding member) throws CoreException {
if (!(member instanceof PDOMNode))
return -1;
PDOMNode memberNode = (PDOMNode) member;
if (memberNode.getPDOM() != block.getPDOM())
return -1;
long memberRecord = memberNode.getRecord();
do {
for (int memberIndex = 0; memberIndex < block.getNextPosition(); memberIndex++) {
PDOMNode candidate = block.getMember(memberIndex);
if (candidate == null)
for (int memberIndex = 0; memberIndex < MAX_MEMBER_COUNT; memberIndex++) {
long rec = block.getMemberRecord(memberIndex);
if (rec == 0)
return -1;
if (candidate.equals(member))
if (rec == memberRecord)
return block.getVisibility(memberIndex);
}
} while ((block = block.getNextBlock()) != null);