throw new RuntimeException(ex.getMessage());
}
if (refinements != null) {
for (int i = 0; i < refinements.length; i++) {
TypedActor refinement = refinements[i];
Local containerLocal = Jimple.v().newLocal("container",
RefType.v(PtolemyUtilities.namedObjClass));
body.getLocals().add(containerLocal);
Local entityLocal = Jimple.v().newLocal("entity",
RefType.v(PtolemyUtilities.entityClass));
body.getLocals().add(entityLocal);
NamedObj containerModel = entity.getContainer();
String deepName = ((NamedObj) refinement)
.getName(containerModel);
units.add(Jimple.v().newAssignStmt(
containerLocal,
Jimple.v().newInterfaceInvokeExpr(
thisLocal,
PtolemyUtilities.getContainerMethod
.makeRef())));
units
.add(Jimple
.v()
.newAssignStmt(
containerLocal,
Jimple
.v()
.newCastExpr(
containerLocal,
RefType
.v(PtolemyUtilities.compositeActorClass))));
units.add(Jimple.v().newAssignStmt(
entityLocal,
Jimple.v().newVirtualInvokeExpr(
containerLocal,
PtolemyUtilities.getEntityMethod
.makeRef(),
StringConstant.v(deepName))));
units
.add(Jimple
.v()
.newAssignStmt(
entityLocal,
Jimple
.v()
.newCastExpr(
entityLocal,
RefType
.v(PtolemyUtilities.compositeActorClass))));
SootMethod rprefireMethod;
SootMethod rfireMethod;
SootMethod rpostfireMethod;
if (refinement instanceof CompositeActor) {
rprefireMethod = SootUtilities
.searchForMethodByName(
PtolemyUtilities.compositeActorClass,
"prefire");
rfireMethod = SootUtilities.searchForMethodByName(
PtolemyUtilities.compositeActorClass,
"fire");
rpostfireMethod = SootUtilities
.searchForMethodByName(
PtolemyUtilities.compositeActorClass,
"postfire");
} else {
throw new RuntimeException();
}
units.add(Jimple.v().newInvokeStmt(
Jimple.v().newVirtualInvokeExpr(entityLocal,
rprefireMethod.makeRef())));
units.add(Jimple.v().newInvokeStmt(
Jimple.v().newVirtualInvokeExpr(entityLocal,
rfireMethod.makeRef())));
units.add(Jimple.v().newInvokeStmt(
Jimple.v().newVirtualInvokeExpr(entityLocal,
rpostfireMethod.makeRef())));
}
}
// Determine the next state in this state.
for (Iterator transitions = state.outgoingPort
.linkedRelationList().iterator(); transitions.hasNext();) {
Transition transition = (Transition) transitions.next();
System.out.println("transition = " + transition);
String guardExpression = transition.getGuardExpression();
Local guardLocal = DataUtilities.generateExpressionCode(
entity, entityInstanceClass, guardExpression,
nameToField, nameToType, body);
// Test the guard.
units
.add(Jimple
.v()
.newAssignStmt(
tokenLocal,
Jimple
.v()
.newCastExpr(
guardLocal,
RefType
.v(PtolemyUtilities.booleanTokenClass))));
units.add(Jimple.v().newAssignStmt(
flagLocal,
Jimple.v().newVirtualInvokeExpr(
tokenLocal,
PtolemyUtilities.booleanValueMethod
.makeRef())));
Stmt skipStmt = Jimple.v().newNopStmt();
units.add(Jimple.v().newIfStmt(
Jimple.v().newEqExpr(flagLocal, IntConstant.v(0)),
skipStmt));
units.add(Jimple.v().newIfStmt(
Jimple.v().newEqExpr(transitionTakenLocal,
IntConstant.v(1)), errorStmt));
// If transition taken, then store the next state
units.add(Jimple.v().newAssignStmt(transitionTakenLocal,
IntConstant.v(1)));
units.add(Jimple.v().newAssignStmt(
nextTransitionLocal,
IntConstant.v(entity.relationList().indexOf(
transition))));
int nextStateIndex = entity.entityList().indexOf(
transition.destinationState());
units.add(Jimple.v().newAssignStmt(nextStateLocal,
IntConstant.v(nextStateIndex)));
// Generate code for the outputExpression of the guard.
for (Iterator actions = transition.choiceActionList()
.iterator(); actions.hasNext();) {
AbstractActionsAttribute action = (AbstractActionsAttribute) actions
.next();
System.out.println("action = " + action);
_generateActionCode(entity, entityInstanceClass,
nameToField, nameToType, body, action);
}
units.add(skipStmt);
}
units.add(Jimple.v().newGotoStmt(finishedStmt));
}
units.add(errorStmt);
// throw an exception.
units.add(finishedStmt);
Local exceptionLocal = SootUtilities.createRuntimeException(body,
errorStmt, "state error");
units.insertBefore(Jimple.v().newThrowStmt(exceptionLocal),
errorStmt);
// Store the next state.
units.add(Jimple.v().newAssignStmt(
Jimple.v().newInstanceFieldRef(thisLocal,
currentStateField.makeRef()), nextStateLocal));
// And the next Transition.
units.add(Jimple.v()
.newAssignStmt(
Jimple.v().newInstanceFieldRef(thisLocal,
nextTransitionField.makeRef()),
nextTransitionLocal));
// return void
units.add(Jimple.v().newReturnVoidStmt());
LocalNameStandardizer.v().transform(body, "at.lns");
LocalSplitter.v().transform(body, "at.ls");
}
// populate the postfire method.
{
System.out.println("create postfire()");
SootMethod postfireMethod = new SootMethod("postfire",
Collections.EMPTY_LIST, BooleanType.v(), Modifier.PUBLIC);
entityInstanceClass.addMethod(postfireMethod);
JimpleBody body = Jimple.v().newBody(postfireMethod);
postfireMethod.setActiveBody(body);
body.insertIdentityStmts();
Chain units = body.getUnits();
Local thisLocal = body.getThisLocal();
Map transitionToStartStmt = new HashMap();
List transitionStmtList = new LinkedList();
int numberOfTransitions = entity.relationList().size();
// Figure out what transition we are in.
for (Iterator transitions = entity.relationList().iterator(); transitions
.hasNext();) {
Transition transition = (Transition) transitions.next();
Stmt startStmt = Jimple.v().newNopStmt();
transitionToStartStmt.put(transition, startStmt);
transitionStmtList.add(startStmt);
}
Local nextTransitionLocal = Jimple.v().newLocal(
"nextTransitionLocal", IntType.v());
body.getLocals().add(nextTransitionLocal);
units.add(Jimple.v().newAssignStmt(
nextTransitionLocal,
Jimple.v().newInstanceFieldRef(thisLocal,
nextTransitionField.makeRef())));
Stmt finishedStmt = Jimple.v().newNopStmt();
Stmt errorStmt = Jimple.v().newNopStmt();
// Get the current transition..
units.add(Jimple.v().newTableSwitchStmt(nextTransitionLocal, 0,
numberOfTransitions - 1, transitionStmtList, errorStmt));
// Generate code for each transition
for (Iterator transitions = entity.relationList().iterator(); transitions
.hasNext();) {
Transition transition = (Transition) transitions.next();
Stmt startStmt = (Stmt) transitionToStartStmt.get(transition);
units.add(startStmt);
// Generate code for the commitExpression of the guard.
for (Iterator actions = transition.commitActionList()
.iterator(); actions.hasNext();) {
AbstractActionsAttribute action = (AbstractActionsAttribute) actions
.next();
_generateActionCode(entity, entityInstanceClass,
nameToField, nameToType, body, action);
}
// Generate code to reinitialize the target state, if
// reset is true.
TypedActor[] refinements = null;
try {
BooleanToken resetToken = (BooleanToken) transition.reset
.getToken();
if (resetToken.booleanValue()) {
refinements = (transition.destinationState())
.getRefinement();
}
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
if (refinements != null) {
for (int i = 0; i < refinements.length; i++) {
TypedActor refinement = refinements[i];
Local containerLocal = Jimple.v().newLocal("container",
RefType.v(PtolemyUtilities.namedObjClass));
body.getLocals().add(containerLocal);