mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-10 09:45:39 +02:00
Protect against NPE in case "declarators" is null
Change-Id: Iab76315980cab8f2070cdf3ba853871b0eecf74c Signed-off-by: Jesper Eskilson <jesper.eskilson@iar.com>
This commit is contained in:
parent
548d5e19e1
commit
611c89cd36
1 changed files with 64 additions and 53 deletions
|
@ -23,12 +23,13 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExecSimpleDeclarat
|
||||||
/**
|
/**
|
||||||
* @author jcamelon
|
* @author jcamelon
|
||||||
*/
|
*/
|
||||||
public class CPPASTSimpleDeclaration extends CPPASTAttributeOwner implements IASTSimpleDeclaration, ICPPExecutionOwner {
|
public class CPPASTSimpleDeclaration extends CPPASTAttributeOwner
|
||||||
private IASTDeclarator[] declarators;
|
implements IASTSimpleDeclaration, ICPPExecutionOwner {
|
||||||
private int declaratorsPos = -1;
|
private IASTDeclarator[] declarators;
|
||||||
private IASTDeclSpecifier declSpecifier;
|
private int declaratorsPos = -1;
|
||||||
|
private IASTDeclSpecifier declSpecifier;
|
||||||
|
|
||||||
public CPPASTSimpleDeclaration() {
|
public CPPASTSimpleDeclaration() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CPPASTSimpleDeclaration(IASTDeclSpecifier declSpecifier) {
|
public CPPASTSimpleDeclaration(IASTDeclSpecifier declSpecifier) {
|
||||||
|
@ -52,76 +53,85 @@ public class CPPASTSimpleDeclaration extends CPPASTAttributeOwner implements IAS
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IASTDeclSpecifier getDeclSpecifier() {
|
public IASTDeclSpecifier getDeclSpecifier() {
|
||||||
return declSpecifier;
|
return declSpecifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IASTDeclarator[] getDeclarators() {
|
public IASTDeclarator[] getDeclarators() {
|
||||||
if (declarators == null)
|
if (declarators == null)
|
||||||
return IASTDeclarator.EMPTY_DECLARATOR_ARRAY;
|
return IASTDeclarator.EMPTY_DECLARATOR_ARRAY;
|
||||||
declarators = ArrayUtil.trimAt(IASTDeclarator.class, declarators, declaratorsPos);
|
declarators = ArrayUtil.trimAt(IASTDeclarator.class, declarators, declaratorsPos);
|
||||||
return declarators;
|
return declarators;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addDeclarator(IASTDeclarator d) {
|
public void addDeclarator(IASTDeclarator d) {
|
||||||
assertNotFrozen();
|
assertNotFrozen();
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
declarators = ArrayUtil.appendAt(IASTDeclarator.class, declarators, ++declaratorsPos, d);
|
declarators = ArrayUtil.appendAt(IASTDeclarator.class, declarators, ++declaratorsPos, d);
|
||||||
d.setParent(this);
|
d.setParent(this);
|
||||||
d.setPropertyInParent(DECLARATOR);
|
d.setPropertyInParent(DECLARATOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param declSpecifier The declSpecifier to set.
|
* @param declSpecifier
|
||||||
*/
|
* The declSpecifier to set.
|
||||||
@Override
|
*/
|
||||||
|
@Override
|
||||||
public void setDeclSpecifier(IASTDeclSpecifier declSpecifier) {
|
public void setDeclSpecifier(IASTDeclSpecifier declSpecifier) {
|
||||||
assertNotFrozen();
|
assertNotFrozen();
|
||||||
this.declSpecifier = declSpecifier;
|
this.declSpecifier = declSpecifier;
|
||||||
if (declSpecifier != null) {
|
if (declSpecifier != null) {
|
||||||
declSpecifier.setParent(this);
|
declSpecifier.setParent(this);
|
||||||
declSpecifier.setPropertyInParent(DECL_SPECIFIER);
|
declSpecifier.setPropertyInParent(DECL_SPECIFIER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(ASTVisitor action) {
|
public boolean accept(ASTVisitor action) {
|
||||||
if (action.shouldVisitDeclarations) {
|
if (action.shouldVisitDeclarations) {
|
||||||
switch (action.visit(this)) {
|
switch (action.visit(this)) {
|
||||||
case ASTVisitor.PROCESS_ABORT: return false;
|
case ASTVisitor.PROCESS_ABORT:
|
||||||
case ASTVisitor.PROCESS_SKIP: return true;
|
return false;
|
||||||
default: break;
|
case ASTVisitor.PROCESS_SKIP:
|
||||||
}
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!acceptByAttributeSpecifiers(action)) return false;
|
if (!acceptByAttributeSpecifiers(action))
|
||||||
if (declSpecifier != null && !declSpecifier.accept(action)) return false;
|
return false;
|
||||||
IASTDeclarator[] dtors = getDeclarators();
|
if (declSpecifier != null && !declSpecifier.accept(action))
|
||||||
for (int i = 0; i < dtors.length; i++) {
|
return false;
|
||||||
if (!dtors[i].accept(action))
|
IASTDeclarator[] dtors = getDeclarators();
|
||||||
return false;
|
for (int i = 0; i < dtors.length; i++) {
|
||||||
}
|
if (!dtors[i].accept(action))
|
||||||
|
return false;
|
||||||
if (action.shouldVisitDeclarations) {
|
|
||||||
switch (action.leave(this)) {
|
|
||||||
case ASTVisitor.PROCESS_ABORT: return false;
|
|
||||||
case ASTVisitor.PROCESS_SKIP: return true;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
if (action.shouldVisitDeclarations) {
|
||||||
|
switch (action.leave(this)) {
|
||||||
|
case ASTVisitor.PROCESS_ABORT:
|
||||||
|
return false;
|
||||||
|
case ASTVisitor.PROCESS_SKIP:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void replace(IASTNode child, IASTNode other) {
|
public void replace(IASTNode child, IASTNode other) {
|
||||||
IASTDeclarator[] declarators = getDeclarators();
|
IASTDeclarator[] declarators = getDeclarators();
|
||||||
for (int i = 0; i < declarators.length; i++) {
|
for (int i = 0; i < declarators.length; i++) {
|
||||||
if (declarators[i] == child) {
|
if (declarators[i] == child) {
|
||||||
declarators[i] = (IASTDeclarator) other;
|
declarators[i] = (IASTDeclarator) other;
|
||||||
other.setParent(child.getParent());
|
other.setParent(child.getParent());
|
||||||
other.setPropertyInParent(child.getPropertyInParent());
|
other.setPropertyInParent(child.getPropertyInParent());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,6 +140,7 @@ public class CPPASTSimpleDeclaration extends CPPASTAttributeOwner implements IAS
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ICPPExecution getExecution() {
|
public ICPPExecution getExecution() {
|
||||||
|
IASTDeclarator[] declarators = getDeclarators();
|
||||||
ICPPExecution[] declaratorExecutions = new ICPPExecution[declarators.length];
|
ICPPExecution[] declaratorExecutions = new ICPPExecution[declarators.length];
|
||||||
for (int i = 0; i < declarators.length; ++i) {
|
for (int i = 0; i < declarators.length; ++i) {
|
||||||
declaratorExecutions[i] = ((ICPPExecutionOwner) declarators[i]).getExecution();
|
declaratorExecutions[i] = ((ICPPExecutionOwner) declarators[i]).getExecution();
|
||||||
|
|
Loading…
Add table
Reference in a new issue