00001 package edu.ksu.cis.bandera.dspin;
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 java.io.*;
00036 import java.util.*;
00037 import edu.ksu.cis.bandera.bir.Collection;
00038
00039 import edu.ksu.cis.bandera.bir.*;
00040 import edu.ksu.cis.bandera.spin.*;
00041
00042
00043
00044
00045
00046 public class DSpinTypeInit extends AbstractTypeSwitch {
00047
00048 DSpinTrans spinTrans;
00049 PrintWriter out;
00050
00051 public DSpinTypeInit(DSpinTrans spinTrans, PrintWriter out) {
00052 this.spinTrans = spinTrans;
00053 this.out = out;
00054 }
00055 public void caseArray(Array type, Object o)
00056 {
00057 String name = varName(o);
00058 int size = type.getSize().getValue();
00059 spinTrans.println(name + ".length = " + size + ";");
00060 for (int i = 0; i < size; i++)
00061 type.getBaseType().apply(this, name + ".element[" + i + "]");
00062 }
00063 public void caseBool(Bool type, Object o)
00064 {
00065 simpleInit(type, o);
00066 }
00067 public void caseCollection(Collection type, Object o)
00068 {
00069
00070 }
00071 public void caseEnumerated(Enumerated type, Object o)
00072 {
00073 simpleInit(type, o);
00074 }
00075 public void caseField(Field type, Object o)
00076 {
00077 type.getType().apply(this, varName(o) + "." + type.getName());
00078 }
00079 public void caseLock(Lock type, Object o)
00080 {
00081 String name = varName(o);
00082 spinTrans.println(name + ".lock!LOCK;");
00083
00084
00085
00086
00087
00088
00089 }
00090 public void caseRange(Range type, Object o)
00091 {
00092 simpleInit(type, o);
00093 }
00094 public void caseRecord(Record type, Object o)
00095 {
00096
00097 int refIndex = spinTrans.refIndex((StateVar)o);
00098 spinTrans.println(varName(o) + ".refIndex = " + refIndex + ";");
00099 Vector fields = type.getFields();
00100 for (int i = 0; i < fields.size(); i++)
00101 ((Field)fields.elementAt(i)).apply(this, o);
00102 }
00103 public void caseRef(Ref type, Object o)
00104 {
00105 String name = varName(o);
00106
00107
00108 }
00109 public void defaultCase(Object obj) {
00110 throw new RuntimeException("Construct not handled: " + obj);
00111 }
00112 Expr initValue(Type type, Object context) {
00113 return (context instanceof String) ?
00114 type.defaultVal() : ((StateVar)context).getInitVal();
00115 }
00116 void simpleInit(Type type, Object o)
00117 {
00118 initValue(type,o).apply(spinTrans);
00119 CaseNode value = (CaseNode)spinTrans.getResult();
00120 ExprNode leaf = (ExprNode) value.getCase(DSpinTrans.normal);
00121 if (! leaf.expr1.equals("0"))
00122 spinTrans.println(varName(o) + " = " + leaf.expr1 + ";");
00123 }
00124 String varName(Object context) {
00125 return (context instanceof String) ?
00126 (String) context : ((StateVar)context).getName();
00127 }
00128 }