00001 package edu.ksu.cis.bandera.spin;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import edu.ksu.cis.bandera.bir.Collection;
00036
00037 import java.io.*;
00038 import java.util.*;
00039
00040 import edu.ksu.cis.bandera.bir.*;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 public class SpinTypeInit extends AbstractTypeSwitch {
00059
00060 SpinTrans spinTrans;
00061 PrintWriter out;
00062
00063 public SpinTypeInit(SpinTrans spinTrans, PrintWriter out) {
00064 this.spinTrans = spinTrans;
00065 this.out = out;
00066 }
00067 public void caseArray(Array type, Object o)
00068 {
00069 String name = varName(o);
00070 int size = type.getSize().getValue();
00071 spinTrans.println(name + ".length = " + size + ";");
00072 for (int i = 0; i < size; i++)
00073 type.getBaseType().apply(this, name + ".element[" + i + "]");
00074 }
00075 public void caseBool(Bool type, Object o)
00076 {
00077 simpleInit(type, o);
00078 }
00079 public void caseCollection(Collection type, Object o)
00080 {
00081 String name = varName(o);
00082 int size = type.getSize().getValue();
00083 for (int i = 0; i < size; i++) {
00084
00085 type.getBaseType().apply(this, name + ".instance[" + i + "]");
00086 }
00087 }
00088 public void caseEnumerated(Enumerated type, Object o)
00089 {
00090 simpleInit(type, o);
00091 }
00092 public void caseField(Field type, Object o)
00093 {
00094 type.getType().apply(this, varName(o) + "." + type.getName());
00095 }
00096 public void caseLock(Lock type, Object o)
00097 {
00098 String name = varName(o);
00099 spinTrans.println(name + ".lock!LOCK;");
00100
00101
00102
00103
00104
00105
00106 }
00107 public void caseRange(Range type, Object o)
00108 {
00109 simpleInit(type, o);
00110 }
00111 public void caseRecord(Record type, Object o)
00112 {
00113 Vector fields = type.getFields();
00114 for (int i = 0; i < fields.size(); i++)
00115 ((Field)fields.elementAt(i)).apply(this, o);
00116 }
00117 public void caseRef(Ref type, Object o)
00118 {
00119 String name = varName(o);
00120
00121 }
00122 public void defaultCase(Object obj) {
00123 throw new RuntimeException("Construct not handled: " + obj);
00124 }
00125 Expr initValue(Type type, Object context) {
00126 return (context instanceof String) ?
00127 type.defaultVal() : ((StateVar)context).getInitVal();
00128 }
00129 void simpleInit(Type type, Object o)
00130 {
00131 initValue(type,o).apply(spinTrans);
00132 CaseNode value = (CaseNode)spinTrans.getResult();
00133 ExprNode leaf = (ExprNode) value.getCase(SpinTrans.normal);
00134 if (! leaf.expr1.equals("0"))
00135 spinTrans.println(varName(o) + " = " + leaf.expr1 + ";");
00136 }
00137 String varName(Object context) {
00138 return (context instanceof String) ?
00139 (String) context : ((StateVar)context).getName();
00140 }
00141 }