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();
21 return fieldlist.size();
24 public FieldDescriptor get(int i) {
25 return (FieldDescriptor) fieldlist.get(i);
28 public StructureTypeDescriptor(String name) {
32 public TypeDescriptor getGenerateType() {
33 return ReservedTypeDescriptor.INT;
36 public Enumeration getFieldKeys() {
40 public void setSubClass(boolean b) {
44 public Expr getSizeExpr() {
45 return getOffsetExpr(null);
49 Hashtable oexpr=new Hashtable();
51 public Expr getOffsetExpr(FieldDescriptor field) {
54 sizeexpr=internalgetOffsetExpr(field);
57 } else if (oexpr.containsKey(field)) {
58 return (Expr)oexpr.get(field);
60 Expr tmp=internalgetOffsetExpr(field);
67 private Expr internalgetOffsetExpr(FieldDescriptor field) {
68 /* Fix sizeof calculations */
69 if ((field==null)&&(subtype!=null)&&(!subclass))
70 return subtype.getSizeExpr();
73 Expr size = new IntegerLiteralExpr(0);
75 for (int i = 0; i < fieldlist.size(); i++) {
76 FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
78 TypeDescriptor td = fd.getType();
79 boolean ptr = fd.getPtr();
81 if (ptr) { /* ptrs are 32bits */
82 basesize = new IntegerLiteralExpr(32);
84 basesize = td.getSizeExpr();
87 if (fd instanceof ArrayDescriptor) {
88 Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
93 if (td instanceof ReservedTypeDescriptor) {
94 ReservedTypeDescriptor rtd=(ReservedTypeDescriptor) td;
95 if (rtd==ReservedTypeDescriptor.BIT) {
99 size=new OpExpr(Opcode.RND, size,null);
105 size=new OpExpr(Opcode.RND, size,null);
110 if (fd == field) { /* stop, reached target field */
114 size = new OpExpr(Opcode.ADD, fieldsize, size);
117 if ((field==null)&&(!aligned))
118 return new OpExpr(Opcode.RND, size, null);
122 public Iterator getFields() {
123 return fields.values().iterator();
126 public Iterator getLabels() {
127 return labels.values().iterator();
130 public FieldDescriptor getField(String name) {
131 return (FieldDescriptor) fields.get(name);
134 public LabelDescriptor getLabel(String name) {
135 return (LabelDescriptor) labels.get(name);
138 public void addField(FieldDescriptor fd) {
139 if (getField(fd.getSymbol()) != null) {
140 throw new IRException("Can not overwrite a field once it has been added.");
142 fields.put(fd.getSymbol(), fd);
143 fieldlist.addElement(fd);
146 public void addLabel(LabelDescriptor ld) {
147 if (getLabel(ld.getSymbol()) != null) {
148 throw new IRException("Can not overwrite a label once it has been added.");
150 labels.put(ld.getSymbol(), ld);
153 public TypeDescriptor getSuperType() {
157 public void setSuperType(TypeDescriptor td) {
161 public boolean isSubtypeOf(TypeDescriptor td) {
167 return subtype.isSubtypeOf(td);
171 public void generate_printout(CodeWriter cr, VarDescriptor vd) {
172 // #TBD#: does not support printing out fields that have variable size, substructures, etc
174 cr.outputline("printf(\"" + getSymbol() + " %p: \", " + vd.getSafeSymbol() + ");");
175 for (int i = 0; i < fieldlist.size(); i++) {
176 FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);
177 cr.outputline("printf(\"\\n\\t" + fd.getSymbol() + " = \");");
179 cr.outputline("printf(\"(" + fd.getType().getSymbol() + ") %p \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");
180 } else if ( fd.getType() instanceof ReservedTypeDescriptor) {
181 cr.outputline("printf(\"%d \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");
183 cr.outputline("printf(\"unsupported, breaking\");");
188 cr.outputline("printf(\"\\n\");");