From 6b2530050fd18a5c68e875e73649b306c148fe55 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 16 Sep 2016 16:33:11 -0700 Subject: [PATCH] Bug 501616 - ArrayIndexOutOfBoundsException in CPPField.getFieldPosition Use 16 bits to store field position. Change-Id: I2856bbc06e1df91ca209508ad3258bad1869087f --- .../cdt/core/dom/ast/cpp/ICPPField.java | 9 +++-- .../parser/cpp/CPPClassSpecialization.java | 2 +- .../core/dom/parser/cpp/CPPField.java | 9 ++--- .../core/dom/parser/cpp/CPPFieldInstance.java | 5 +-- .../parser/cpp/CPPFieldSpecialization.java | 3 +- .../core/dom/parser/cpp/CPPFieldTemplate.java | 3 +- ...CPPFieldTemplatePartialSpecialization.java | 3 +- .../core/dom/parser/cpp/CPPUnknownField.java | 3 +- .../composite/cpp/CompositeCPPField.java | 2 +- .../cpp/CompositeCPPFieldInstance.java | 4 +-- .../cpp/CompositeCPPFieldTemplate.java | 2 +- ...CPPFieldTemplatePartialSpecialization.java | 2 +- .../eclipse/cdt/internal/core/pdom/PDOM.java | 35 ++++++++++--------- .../cdt/internal/core/pdom/dom/PDOMNode.java | 17 +++++++++ .../core/pdom/dom/cpp/PDOMCPPField.java | 25 +++++++------ .../pdom/dom/cpp/PDOMCPPFieldInstance.java | 5 +-- .../dom/cpp/PDOMCPPFieldSpecialization.java | 7 ++-- .../pdom/dom/cpp/PDOMCPPFieldTemplate.java | 25 +++++++------ ...CPPFieldTemplatePartialSpecialization.java | 5 +-- 19 files changed, 103 insertions(+), 63 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java index 4630dbc198c..a9d655a705b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java @@ -7,6 +7,7 @@ * * Contributors: * Doug Schaefer (IBM) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; @@ -20,8 +21,10 @@ public interface ICPPField extends IField, ICPPMember, ICPPVariable { public static final ICPPField[] EMPTY_CPPFIELD_ARRAY = {}; /** - * Returns the position of this field within its class owner's declared fields. - * @since 6.0 + * Returns the position of this field within its class owner's declared fields, or -1 if the position + * cannot be determined. + * + * @since 6.1 */ - byte getFieldPosition(); + int getFieldPosition(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 89d4b414b38..7e469af3e33 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -93,7 +93,7 @@ public class CPPClassSpecialization extends CPPSpecialization } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return -1; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java index 8d4115237e2..8de41d19857 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java @@ -8,6 +8,7 @@ * Contributors: * Andrew Niefer (IBM Corporation) - initial API and implementation * Markus Schorn (Wind River Systems) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -50,7 +51,7 @@ public class CPPField extends CPPVariable implements ICPPField { } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return -1; } } @@ -99,13 +100,13 @@ public class CPPField extends CPPVariable implements ICPPField { } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return getFieldPosition(getName(), getClassOwner()); } - public static byte getFieldPosition(String fieldName, ICPPClassType classOwner) { + public static int getFieldPosition(String fieldName, ICPPClassType classOwner) { IField[] fields = ClassTypeHelper.getDeclaredFields(classOwner, null); - for (byte fieldPos = 0; fieldPos < fields.length; fieldPos++) { + for (int fieldPos = 0; fieldPos < fields.length; fieldPos++) { if (fields[fieldPos].getName().equals(fieldName)) { return fieldPos; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldInstance.java index 48ba97475dc..deacec1c98d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldInstance.java @@ -8,6 +8,7 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -54,7 +55,7 @@ public class CPPFieldInstance extends CPPVariableInstance implements ICPPField { } @Override - public byte getFieldPosition() { - return ((ICPPFieldTemplate)getSpecializedBinding()).getFieldPosition(); + public int getFieldPosition() { + return ((ICPPFieldTemplate) getSpecializedBinding()).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java index 4ef92581eca..8046f0facd0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java @@ -8,6 +8,7 @@ * Contributors: * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -48,7 +49,7 @@ public class CPPFieldSpecialization extends CPPVariableSpecialization implements } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return getField().getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplate.java index 3b45756432c..22c073a9929 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplate.java @@ -8,6 +8,7 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -53,7 +54,7 @@ public class CPPFieldTemplate extends CPPVariableTemplate implements ICPPFieldTe } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return CPPField.getFieldPosition(getName(), getClassOwner()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplatePartialSpecialization.java index f675b34bbde..0350d89380f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldTemplatePartialSpecialization.java @@ -8,6 +8,7 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -45,7 +46,7 @@ public class CPPFieldTemplatePartialSpecialization extends CPPVariableTemplatePa } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return ((ICPPFieldTemplate) getPrimaryTemplate()).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownField.java index feee867692d..cfbc3bf4225 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownField.java @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -87,7 +88,7 @@ public class CPPUnknownField extends CPPUnknownMember implements ICPPField { } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return -1; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPField.java index 7848f1157c9..0f281c2440b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPField.java @@ -41,7 +41,7 @@ class CompositeCPPField extends CompositeCPPVariable implements ICPPField { } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return ((ICPPField)rbinding).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldInstance.java index b0582c04e1b..c83a6512048 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldInstance.java @@ -41,7 +41,7 @@ public class CompositeCPPFieldInstance extends CompositeCPPVariableInstance impl } @Override - public byte getFieldPosition() { - return ((ICPPField)rbinding).getFieldPosition(); + public int getFieldPosition() { + return ((ICPPField) rbinding).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplate.java index 41e41ec7dbb..fcec1a1e8f6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplate.java @@ -41,7 +41,7 @@ public class CompositeCPPFieldTemplate extends CompositeCPPVariableTemplate impl } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return ((ICPPField) rbinding).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplatePartialSpecialization.java index d08fca99766..7e1bf3cddb6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldTemplatePartialSpecialization.java @@ -43,7 +43,7 @@ public class CompositeCPPFieldTemplatePartialSpecialization } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return ((ICPPField) rbinding).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 5646d45e0cc..109ca6092b0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -16,20 +16,6 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; - import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IPDOMNode; @@ -100,6 +86,20 @@ import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.PlatformObject; import org.eclipse.core.runtime.Status; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + /** * Database for storing semantic information for one project. */ @@ -274,10 +274,11 @@ public class PDOM extends PlatformObject implements IPDOM { * * CDT 9.2 development (versions not supported on the 9.0.x branch) * 202.0 - C++14 constexpr evaluation, bug 490475. + * 202.0 - Use 16 bits to store field position, bug 501616. */ - private static final int MIN_SUPPORTED_VERSION= version(202, 0); - private static final int MAX_SUPPORTED_VERSION= version(202, Short.MAX_VALUE); - private static final int DEFAULT_VERSION = version(202, 0); + private static final int MIN_SUPPORTED_VERSION= version(203, 0); + private static final int MAX_SUPPORTED_VERSION= version(203, Short.MAX_VALUE); + private static final int DEFAULT_VERSION = version(203, 0); private static int version(int major, int minor) { return (major << 16) + minor; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java index 487744ead4f..c65b542f90a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java @@ -9,6 +9,7 @@ * Doug Schaefer (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) * Andrew Ferguson (Symbian) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; @@ -207,6 +208,7 @@ public abstract class PDOMNode implements IInternalPDOMNode { /** * Convenience method for fetching a byte from the database. + * * @param offset Location of the byte. * @return a byte from the database. */ @@ -219,6 +221,21 @@ public abstract class PDOMNode implements IInternalPDOMNode { } } + /** + * Convenience method for fetching a two-byte integer number from the database. + * + * @param offset Location of the number + * @return a number from the database. + */ + protected short getShort(long offset) { + try { + return getDB().getShort(offset); + } catch (CoreException e) { + CCorePlugin.log(e); + return 0; + } + } + /** * Returns the bit at the specified offset in a bit vector. * @param bitVector Bits. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java index 5cba435c56e..ff541416f80 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java @@ -9,16 +9,17 @@ * QNX - Initial API and implementation * IBM Corporation * Markus Schorn (Wind River Systems) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; -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; import org.eclipse.core.runtime.CoreException; @@ -27,10 +28,10 @@ import org.eclipse.core.runtime.CoreException; * @author Doug Schaefer */ class PDOMCPPField extends PDOMCPPVariable implements ICPPField { - protected static final int FIELD_POSITION_OFFSET = PDOMCPPVariable.RECORD_SIZE; // byte + protected static final int FIELD_POSITION_OFFSET = PDOMCPPVariable.RECORD_SIZE; // 2 bytes 1-based @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = FIELD_POSITION_OFFSET + 1; + protected static final int RECORD_SIZE = FIELD_POSITION_OFFSET + 2; public PDOMCPPField(PDOMLinkage linkage, PDOMNode parent, ICPPField field, boolean setTypeAndValue) throws CoreException { @@ -50,11 +51,6 @@ class PDOMCPPField extends PDOMCPPVariable implements ICPPField { } } - private void setFieldPosition(ICPPField field) throws CoreException { - final Database db = getDB(); - db.putByte(record + FIELD_POSITION_OFFSET, field.getFieldPosition()); - } - @Override protected int getRecordSize() { return RECORD_SIZE; @@ -109,7 +105,16 @@ class PDOMCPPField extends PDOMCPPVariable implements ICPPField { } @Override - public byte getFieldPosition() { - return getByte(record + FIELD_POSITION_OFFSET); + public int getFieldPosition() { + return Short.toUnsignedInt(getShort(record + FIELD_POSITION_OFFSET)) - 1; + } + + private void setFieldPosition(ICPPField field) throws CoreException { + int shiftedPos = field.getFieldPosition() + 1; + if ((shiftedPos & 0xFFFF0000) != 0) { + CCorePlugin.log(new IllegalArgumentException("Invalid field position " + field.getFieldPosition())); //$NON-NLS-1$ + shiftedPos = 0; + } + getDB().putShort(record + FIELD_POSITION_OFFSET, (short) shiftedPos); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldInstance.java index bd54281d945..17e02fab52a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldInstance.java @@ -8,6 +8,7 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -53,7 +54,7 @@ public class PDOMCPPFieldInstance extends PDOMCPPVariableInstance implements ICP } @Override - public byte getFieldPosition() { - return ((ICPPField)getSpecializedBinding()).getFieldPosition(); + public int getFieldPosition() { + return ((ICPPField) getSpecializedBinding()).getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java index 06b0ca0ec3c..1173ae66b69 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java @@ -6,8 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Bryan Wilkinson (QNX) - Initial API and implementation - * Markus Schorn (Wind River Systems) + * Bryan Wilkinson (QNX) - Initial API and implementation + * Markus Schorn (Wind River Systems) + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -131,7 +132,7 @@ class PDOMCPPFieldSpecialization extends PDOMCPPSpecialization implements ICPPFi } @Override - public byte getFieldPosition() { + public int getFieldPosition() { return getField().getFieldPosition(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplate.java index ac4fabfceef..f118fcce948 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplate.java @@ -8,25 +8,26 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFieldTemplate; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; -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; import org.eclipse.core.runtime.CoreException; public class PDOMCPPFieldTemplate extends PDOMCPPVariableTemplate implements ICPPFieldTemplate { - protected static final int FIELD_POSITION_OFFSET = PDOMCPPVariableTemplate.RECORD_SIZE; // byte + protected static final int FIELD_POSITION_OFFSET = PDOMCPPVariableTemplate.RECORD_SIZE; // 2 bytes 1-based @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = FIELD_POSITION_OFFSET + 1; + protected static final int RECORD_SIZE = FIELD_POSITION_OFFSET + 2; public PDOMCPPFieldTemplate(PDOMCPPLinkage linkage, PDOMNode parent, ICPPFieldTemplate template) throws CoreException, DOMException { @@ -38,11 +39,6 @@ public class PDOMCPPFieldTemplate extends PDOMCPPVariableTemplate implements ICP super(pdomLinkage, record); } - private void setFieldPosition(ICPPField field) throws CoreException { - final Database db = getDB(); - db.putByte(record + FIELD_POSITION_OFFSET, field.getFieldPosition()); - } - @Override public int getNodeType() { return IIndexCPPBindingConstants.CPP_FIELD_TEMPLATE; @@ -64,7 +60,16 @@ public class PDOMCPPFieldTemplate extends PDOMCPPVariableTemplate implements ICP } @Override - public byte getFieldPosition() { - return getByte(record + FIELD_POSITION_OFFSET); + public int getFieldPosition() { + return Short.toUnsignedInt(getShort(record + FIELD_POSITION_OFFSET)) - 1; + } + + private void setFieldPosition(ICPPField field) throws CoreException { + int shiftedPos = field.getFieldPosition() + 1; + if ((shiftedPos & 0xFFFF0000) != 0) { + CCorePlugin.log(new IllegalArgumentException("Invalid field position " + field.getFieldPosition())); //$NON-NLS-1$ + shiftedPos = 0; + } + getDB().putShort(record + FIELD_POSITION_OFFSET, (short) shiftedPos); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplatePartialSpecialization.java index 344f99e27ed..c69f78e0b7f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldTemplatePartialSpecialization.java @@ -8,6 +8,7 @@ * * Contributors: * Lukas Wegmann (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -75,7 +76,7 @@ public class PDOMCPPFieldTemplatePartialSpecialization extends PDOMCPPVariableTe } @Override - public byte getFieldPosition() { - return ((ICPPField)getPrimaryTemplate()).getFieldPosition(); + public int getFieldPosition() { + return ((ICPPField) getPrimaryTemplate()).getFieldPosition(); } }