4 * StructureTypeDescriptor
6 * represents structure types
11 public class StructureTypeDescriptor extends TypeDescriptor {
13 TypeDescriptor subtype;
15 Hashtable fields = new Hashtable(); /* fast lookups */
16 Vector fieldlist = new Vector(); /* ordering information */
17 Hashtable labels = new Hashtable();
25 public StructureTypeDescriptor(String name) {
30 public TypeDescriptor getGenerateType() {
31 return ReservedTypeDescriptor.INT;
34 public Enumeration getFieldKeys() {
39 public Expr getSizeExpr() {
40 return getOffsetExpr(null);
43 public Expr getOffsetExpr(FieldDescriptor field) {
44 /* Fix sizeof calculations */
45 if ((field==null)&&(subtype!=null))
46 return subtype.getSizeExpr();
49 Expr size = new IntegerLiteralExpr(0);
51 for (int i = 0; i < fieldlist.size(); i++) {
52 FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
54 TypeDescriptor td = fd.getType();
55 boolean ptr = fd.getPtr();
57 if (ptr) { /* ptrs are 32bits */
59 basesize = new IntegerLiteralExpr(32);
61 basesize = td.getSizeExpr();
64 if (fd instanceof ArrayDescriptor) {
65 Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
70 if (td instanceof ReservedTypeDescriptor) {
71 ReservedTypeDescriptor rtd=(ReservedTypeDescriptor) td;
72 if (rtd==ReservedTypeDescriptor.BIT) {
76 size=new OpExpr(Opcode.RND, size,null);
82 size=new OpExpr(Opcode.RND, size,null);
87 if (fd == field) { /* stop, reached target field */
91 size = new OpExpr(Opcode.ADD, fieldsize, size);
94 if ((field==null)&&(!aligned))
95 return new OpExpr(Opcode.RND, size, null);
99 public Iterator getFields() {
100 return fields.values().iterator();
103 public Iterator getLabels() {
104 return labels.values().iterator();
107 public FieldDescriptor getField(String name) {
108 return (FieldDescriptor) fields.get(name);
111 public LabelDescriptor getLabel(String name) {
112 return (LabelDescriptor) labels.get(name);
115 public void addField(FieldDescriptor fd) {
116 if (getField(fd.getSymbol()) != null) {
117 throw new IRException("Can not overwrite a field once it has been added.");
119 fields.put(fd.getSymbol(), fd);
120 fieldlist.addElement(fd);
123 public void addLabel(LabelDescriptor ld) {
124 if (getLabel(ld.getSymbol()) != null) {
125 throw new IRException("Can not overwrite a label once it has been added.");
127 labels.put(ld.getSymbol(), ld);
130 public TypeDescriptor getSuperType() {
134 public void setSuperType(TypeDescriptor td) {
138 public boolean isSubtypeOf(TypeDescriptor td) {
142 return subtype.isSubtypeOf(td);