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();
19 public StructureTypeDescriptor(String name) {
23 public TypeDescriptor getGenerateType() {
24 return ReservedTypeDescriptor.INT;
27 public Enumeration getFieldKeys() {
32 public Expr getSizeExpr() {
33 return getOffsetExpr(null);
36 public Expr getOffsetExpr(FieldDescriptor field) {
39 Expr size = new IntegerLiteralExpr(0);
41 for (int i = 0; i < fieldlist.size(); i++) {
42 FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
44 TypeDescriptor td = fd.getType();
45 boolean ptr = fd.getPtr();
47 if (ptr) { /* ptrs are 32bits */
49 basesize = new IntegerLiteralExpr(32);
51 basesize = td.getSizeExpr();
54 if (fd instanceof ArrayDescriptor) {
55 Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
60 if (td instanceof ReservedTypeDescriptor) {
61 ReservedTypeDescriptor rtd=(ReservedTypeDescriptor) td;
62 if (rtd==ReservedTypeDescriptor.BIT) {
66 size=new OpExpr(Opcode.RND, size,null);
72 size=new OpExpr(Opcode.RND, size,null);
77 if (fd == field) { /* stop, reached target field */
81 size = new OpExpr(Opcode.ADD, fieldsize, size);
84 if ((field==null)&&(!aligned))
85 return new OpExpr(Opcode.RND, size, null);
89 public Iterator getFields() {
90 return fields.values().iterator();
93 public Iterator getLabels() {
94 return labels.values().iterator();
97 public FieldDescriptor getField(String name) {
98 return (FieldDescriptor) fields.get(name);
101 public LabelDescriptor getLabel(String name) {
102 return (LabelDescriptor) labels.get(name);
105 public void addField(FieldDescriptor fd) {
106 if (getField(fd.getSymbol()) != null) {
107 throw new IRException("Can not overwrite a field once it has been added.");
109 fields.put(fd.getSymbol(), fd);
110 fieldlist.addElement(fd);
113 public void addLabel(LabelDescriptor ld) {
114 if (getLabel(ld.getSymbol()) != null) {
115 throw new IRException("Can not overwrite a label once it has been added.");
117 labels.put(ld.getSymbol(), ld);
120 public TypeDescriptor getSubType() {
124 public void setSubType(TypeDescriptor td) {
128 public boolean isSubtypeOf(TypeDescriptor td) {
132 return subtype.isSubtypeOf(td);