Hashtable fields = new Hashtable(); /* fast lookups */
Vector fieldlist = new Vector(); /* ordering information */
Hashtable labels = new Hashtable();
+ int idnum;
+ static int counter=0;
+
+ public int getId() {
+ return idnum;
+ }
public StructureTypeDescriptor(String name) {
super(name);
+ idnum=counter++;
}
public TypeDescriptor getGenerateType() {
return fields.keys();
}
- private Vector getFieldSizes() {
- Vector fieldsizes = new Vector();
-
+
+ public Expr getSizeExpr() {
+ return getOffsetExpr(null);
+ }
+
+ public Expr getOffsetExpr(FieldDescriptor field) {
+ /* Fix sizeof calculations */
+ if ((field==null)&&(subtype!=null))
+ return subtype.getOFfsetExpr(field);
+
+ boolean aligned=true;
+ Expr size = new IntegerLiteralExpr(0);
+
for (int i = 0; i < fieldlist.size(); i++) {
- FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);
+ FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
+
TypeDescriptor td = fd.getType();
boolean ptr = fd.getPtr();
-
Expr basesize;
if (ptr) { /* ptrs are 32bits */
- basesize = new IntegerLiteralExpr(32);
+
+ basesize = new IntegerLiteralExpr(32);
} else {
- basesize = td.getSizeExpr();
+ basesize = td.getSizeExpr();
}
-
+ Expr fieldsize;
if (fd instanceof ArrayDescriptor) {
Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
- fieldsizes.addElement(totalsize);
+ fieldsize=totalsize;
} else {
- fieldsizes.addElement(basesize);
+ fieldsize=basesize;
}
- }
-
- return fieldsizes;
- }
-
- public Expr getSizeExpr() {
- Vector fieldsizes = getFieldSizes();
-
- /* we've got the field sizes! now return the addition! */
- Expr size = new IntegerLiteralExpr(0);
-
- for (int i = 0; i < fieldsizes.size(); i++) {
- Expr fieldsize = (Expr) fieldsizes.elementAt(i);
- size = new OpExpr(Opcode.ADD, fieldsize, size);
- }
-
- return size;
- }
-
- public Expr getOffsetExpr(FieldDescriptor field) {
- Vector fieldsizes = getFieldSizes();
-
- // #ATTN#: getOffsetExpr needs to be called with the fielddescriptor obect that is in teh vector list
- // this means that if the field is an arraydescriptor you have to call getOffsetExpr with the array
-
- /* we've got the field sizes! now return the addition! */
- Expr size = new IntegerLiteralExpr(0);
-
- for (int i = 0; i < fieldsizes.size(); i++) {
- FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
+ if (td instanceof ReservedTypeDescriptor) {
+ ReservedTypeDescriptor rtd=(ReservedTypeDescriptor) td;
+ if (rtd==ReservedTypeDescriptor.BIT) {
+ aligned=false;
+ } else {
+ if (!aligned) {
+ size=new OpExpr(Opcode.RND, size,null);
+ aligned=true;
+ }
+ }
+ } else {
+ if (!aligned) {
+ size=new OpExpr(Opcode.RND, size,null);
+ aligned=true;
+ }
+ }
if (fd == field) { /* stop, reached target field */
break;
}
- Expr fieldsize = (Expr) fieldsizes.elementAt(i);
size = new OpExpr(Opcode.ADD, fieldsize, size);
}
-
+
+ if ((field==null)&&(!aligned))
+ return new OpExpr(Opcode.RND, size, null);
return size;
}
labels.put(ld.getSymbol(), ld);
}
- public TypeDescriptor getSubType() {
+ public TypeDescriptor getSuperType() {
return subtype;
}
- public void setSubType(TypeDescriptor td) {
+ public void setSuperType(TypeDescriptor td) {
subtype = td;
}