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() {
31 private Vector getFieldSizes() {
32 Vector fieldsizes = new Vector();
34 for (int i = 0; i < fieldlist.size(); i++) {
35 FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);
36 TypeDescriptor td = fd.getType();
37 boolean ptr = fd.getPtr();
40 if (ptr) { /* ptrs are 32bits */
41 basesize = new IntegerLiteralExpr(32);
43 basesize = td.getSizeExpr();
46 if (fd instanceof ArrayDescriptor) {
47 Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
48 fieldsizes.addElement(totalsize);
50 fieldsizes.addElement(basesize);
57 public Expr getSizeExpr() {
58 Vector fieldsizes = getFieldSizes();
60 /* we've got the field sizes! now return the addition! */
61 Expr size = new IntegerLiteralExpr(0);
63 for (int i = 0; i < fieldsizes.size(); i++) {
64 Expr fieldsize = (Expr) fieldsizes.elementAt(i);
65 size = new OpExpr(Opcode.ADD, fieldsize, size);
71 public Expr getOffsetExpr(FieldDescriptor field) {
72 Vector fieldsizes = getFieldSizes();
74 // #ATTN#: getOffsetExpr needs to be called with the fielddescriptor obect that is in teh vector list
75 // this means that if the field is an arraydescriptor you have to call getOffsetExpr with the array
77 /* we've got the field sizes! now return the addition! */
78 Expr size = new IntegerLiteralExpr(0);
80 for (int i = 0; i < fieldsizes.size(); i++) {
81 FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
83 if (fd == field) { /* stop, reached target field */
87 Expr fieldsize = (Expr) fieldsizes.elementAt(i);
88 size = new OpExpr(Opcode.ADD, fieldsize, size);
94 public Iterator getFields() {
95 return fields.values().iterator();
98 public Iterator getLabels() {
99 return labels.values().iterator();
102 public FieldDescriptor getField(String name) {
103 return (FieldDescriptor) fields.get(name);
106 public LabelDescriptor getLabel(String name) {
107 return (LabelDescriptor) labels.get(name);
110 public void addField(FieldDescriptor fd) {
111 if (getField(fd.getSymbol()) != null) {
112 throw new IRException("Can not overwrite a field once it has been added.");
114 fields.put(fd.getSymbol(), fd);
115 fieldlist.addElement(fd);
118 public void addLabel(LabelDescriptor ld) {
119 if (getLabel(ld.getSymbol()) != null) {
120 throw new IRException("Can not overwrite a label once it has been added.");
122 labels.put(ld.getSymbol(), ld);
125 public TypeDescriptor getSubType() {
129 public void setSubType(TypeDescriptor td) {
133 public boolean isSubtypeOf(TypeDescriptor td) {
137 return subtype.isSubtypeOf(td);