9 public static Vector getrulelist(Descriptor d) {
11 Vector dispatchrules = new Vector();
12 Vector rules = State.currentState.vRules;
14 for (int i = 0; i < rules.size(); i++) {
15 Rule rule = (Rule) rules.elementAt(i);
16 Set requiredsymbols = rule.getRequiredDescriptors();
18 // #TBD#: in general this is wrong because these descriptors may contain descriptors
19 // bound in "in?" expressions which need to be dealt with in a topologically sorted
22 if (rule.getRequiredDescriptors().contains(d)) {
23 dispatchrules.addElement(rule);
30 public static void generate_dispatch(CodeWriter cr, RelationDescriptor rd, String leftvar, String rightvar) {
32 cr.outputline("// RELATION DISPATCH ");
34 Vector dispatchrules = getrulelist(rd);
36 if (dispatchrules.size() == 0) {
37 cr.outputline("// nothing to dispatch");
41 for(int i = 0; i < dispatchrules.size(); i++) {
42 Rule rule = (Rule) dispatchrules.elementAt(i);
43 if (rule.getGuardExpr().getRequiredDescriptors().contains(rd)) {
44 /* Guard depends on this relation, so we recomput everything */
45 cr.outputline("WORKLIST->add("+rule.getNum()+",-1,0,0);");
47 for (int j=0;j<rule.numQuantifiers();j++) {
48 Quantifier q=rule.getQuantifier(j);
49 if (q.getRequiredDescriptors().contains(rd)) {
51 cr.outputline("WORKLIST->add("+rule.getNum()+","+j+","+leftvar+","+rightvar+");");
59 public static void generate_dispatch(CodeWriter cr, SetDescriptor sd, String setvar) {
61 cr.outputline("// SET DISPATCH ");
63 Vector dispatchrules = getrulelist(sd);
65 if (dispatchrules.size() == 0) {
66 cr.outputline("// nothing to dispatch");
70 for(int i = 0; i < dispatchrules.size(); i++) {
71 Rule rule = (Rule) dispatchrules.elementAt(i);
72 if (SetDescriptor.expand(rule.getGuardExpr().getRequiredDescriptors()).contains(sd)) {
73 /* Guard depends on this relation, so we recomput everything */
74 cr.outputline("WORKLIST->add("+rule.getNum()+",-1,0,0);");
76 for (int j=0;j<rule.numQuantifiers();j++) {
77 Quantifier q=rule.getQuantifier(j);
78 if (SetDescriptor.expand(q.getRequiredDescriptors()).contains(sd)) {
80 cr.outputline("WORKLIST->add("+rule.getNum()+","+j+","+setvar+",0);");