]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRQuery.java
Builtins and JavaModule SCL modules may leak memory
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRQuery.java
index 9e2bf6f343c026637ff5dfd0db3ae2af6663c512..4e5670fcd955edc0945e466ee8a4413e7a9909fb 100644 (file)
@@ -3,6 +3,8 @@ package org.simantics.scl.compiler.elaboration.chr;
 import org.simantics.scl.compiler.elaboration.chr.plan.PostCommitOp;
 import org.simantics.scl.compiler.elaboration.chr.plan.PreCommitOp;
 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
+import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
+import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation;
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
@@ -12,6 +14,7 @@ import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
+import org.simantics.scl.compiler.types.Type;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
 import gnu.trove.set.hash.THashSet;
@@ -52,6 +55,9 @@ public class CHRQuery extends Symbol {
     public void collectFreeVariables(THashSet<Variable> vars) {
         for(CHRLiteral literal : literals)
             literal.collectFreeVariables(vars);
+        for(CHRLiteral literal : literals)
+            if(literal.relation == SpecialCHRRelation.ASSIGN)
+                literal.parameters[0].removeFreeVariables(vars);
     }
 
     public void setLocationDeep(long loc) {
@@ -62,7 +68,7 @@ public class CHRQuery extends Symbol {
         }
     }
     
-    public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId) {
+    public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
         for(int i=0;i<literals.length;++i) {
             CHRLiteral literal = literals[i];
             if(i == activeLiteralId)
@@ -70,6 +76,9 @@ public class CHRQuery extends Symbol {
             else
                 context.add(literal, i);
         }
+        if(activeLiteralId == -1 && inputFact != null) {
+            context.addInitFact(initConstraint, inputFact);
+        }      
         return context.createQueryPlan();
     }
     
@@ -91,4 +100,14 @@ public class CHRQuery extends Symbol {
         visitor.visit(this);
         return b.toString();
     }
+
+    public void collectQueryEffects(THashSet<Type> effects) {
+        for(CHRLiteral literal : literals)
+            literal.collectQueryEffects(effects);
+    }
+    
+    public void collectEnforceEffects(THashSet<Type> effects) {
+        for(CHRLiteral literal : literals)
+            literal.collectEnforceEffects(effects);
+    }
 }