]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/ValRef.java
Replace System.err and System.out with SLF4J Logging
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / references / ValRef.java
index 20a8eb1c3414c6eb4b713a89c39172bf9b475b50..954e8d0a3546ca07d2eb09b4ac284cd4e10726a4 100644 (file)
-package org.simantics.scl.compiler.internal.codegen.references;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder;\r
-import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;\r
-import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
-import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;\r
-import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;\r
-import org.simantics.scl.compiler.top.SCLCompilerConfiguration;\r
-import org.simantics.scl.compiler.types.TVar;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.Types;\r
-\r
-public final class ValRef implements IVal {\r
-    public static final ValRef[] EMPTY_ARRAY = new ValRef[0];\r
-\r
-    Val binding;\r
-    ValRef prev; // FreeVars with the same binding form a linked list\r
-    ValRef next;     \r
-    ValRefBinder parent;\r
-    Type[] parameters;\r
-    \r
-    /**\r
-     * Just for deserialization\r
-     */\r
-    public ValRef(Type[] parameters) {\r
-        this.parameters = parameters;\r
-    }\r
-    \r
-    ValRef(Val binding, Type[] parameters) {\r
-        //System.out.println("+ " + bindin g);\r
-        this.parameters = parameters;        \r
-        setBinding(binding);\r
-    }    \r
-    \r
-    public void setBinding(Val binding) {\r
-        this.binding = binding;\r
-        \r
-        ValRef head = binding.occurrence;\r
-        binding.occurrence = this;\r
-        this.next = head;\r
-        this.prev = null;\r
-        if(head != null)\r
-            head.prev = this;\r
-    }\r
-    \r
-    int removeModiId = -1;\r
-    public void remove() {\r
-        //System.out.println("- " + binding);\r
-        if(prev == null)\r
-            try {\r
-                binding.occurrence = next;\r
-            } catch(NullPointerException e) {\r
-                System.err.println("removeModiId = " + removeModiId);\r
-                System.err.println("current ModiId = " + SSASimplificationContext.modiId);\r
-                throw new InternalCompilerError("The ValRef has already been removed.");\r
-            }\r
-        else\r
-            prev.next = next;\r
-        if(next != null)\r
-            next.prev = prev;\r
-        if(SCLCompilerConfiguration.DEBUG) {\r
-            next = null;\r
-            prev = null;\r
-            binding = null;\r
-        }\r
-        removeModiId = SSASimplificationContext.modiId;\r
-    }\r
-    \r
-    public Val getBinding() {\r
-        return binding;\r
-    }\r
-    \r
-    public ValRef getNext() {\r
-        return next;\r
-    }\r
-    \r
-    public static Val[] getBindings(ValRef[] refs) {\r
-        Val[] result = new Val[refs.length];\r
-        for(int i=0;i<refs.length;++i)\r
-            result[i] = refs[i].getBinding();\r
-        return result;\r
-    }\r
-\r
-    @Override\r
-    public ValRef createOccurrence() {\r
-        return binding.createOccurrence(parameters);\r
-    }\r
-\r
-    @Override\r
-    public ValRef createOccurrence(Type... otherParameters) {\r
-        return binding.createOccurrence(Types.concat(parameters, otherParameters));\r
-    }\r
-    \r
-    @Override\r
-    public IVal createSpecialization(Type... otherParameters) {\r
-        return new ValSpecialization(binding, Types.concat(parameters, otherParameters));\r
-    }\r
-\r
-    public void setParent(ValRefBinder parent) {\r
-        this.parent = parent;\r
-    }\r
-    \r
-    @Override\r
-    public Type getType() {\r
-        if(parameters.length == 0)\r
-            return binding.getType();\r
-        else\r
-            return Types.instantiate(binding.getType(), parameters); \r
-    }\r
-    \r
-    public static ValRef[] createOccurrences(IVal[] vals) {\r
-        ValRef[] result = new ValRef[vals.length];\r
-        for(int i=0;i<vals.length;++i)\r
-            result[i] = vals[i].createOccurrence();\r
-        return result;\r
-    }\r
-    \r
-    public static <T extends IVal> ValRef[] createOccurrences(List<T> vals) {\r
-        ValRef[] result = new ValRef[vals.size()];\r
-        for(int i=0;i<vals.size();++i)\r
-            result[i] = vals.get(i).createOccurrence();\r
-        return result;\r
-    }\r
-    \r
-    public Type[] getTypeParameters() {\r
-        return parameters;\r
-    }\r
-    \r
-    public Type getTypeParameter(int i) {\r
-        return parameters[i];\r
-    }\r
-\r
-    public static ValRef[] concat(ValRef[] refs1, ValRef[] refs2) {\r
-        ValRef[] result = new ValRef[refs1.length + refs2.length];\r
-        for(int i=0;i<refs1.length;++i)\r
-            result[i] = refs1[i];\r
-        for(int i=0;i<refs2.length;++i)\r
-            result[refs1.length + i] = refs2[i];\r
-        return result;\r
-    }\r
-    \r
-    @Override\r
-    public void push(MethodBuilder mb) {\r
-        binding.push(mb);\r
-    }\r
-    \r
-    public ValRefBinder getParent() {\r
-        return parent;\r
-    }\r
-    \r
-    public SSAFunction getParentFunction() {\r
-        return parent.getParentFunction();\r
-    }\r
-    \r
-    public void replace(TVar[] vars, Type[] replacements) {\r
-        for(int i=0;i<parameters.length;++i) {\r
-            Type oldType = parameters[i];\r
-            Type newType = parameters[i].replace(vars, replacements);\r
-            if(oldType != newType) {\r
-                Type[] newParameters = new Type[parameters.length];\r
-                for(int j=0;j<i;++j)\r
-                    newParameters[j] = parameters[j];\r
-                newParameters[i] = newType;\r
-                for(int j=i+1;j<parameters.length;++j)\r
-                    newParameters[j] = parameters[j].replace(vars, replacements);\r
-                this.parameters = newParameters;\r
-                return;\r
-            }\r
-            \r
-        }\r
-    }\r
-\r
-    public void setTypeParameters(Type[] parameters) {\r
-        this.parameters = parameters;\r
-    }\r
-    \r
-    public static ValRef[] copy(ValRef[] refs) {\r
-        ValRef[] result = new ValRef[refs.length];\r
-        for(int i=0;i<refs.length;++i)\r
-            result[i] = refs[i].copy();\r
-        return result;\r
-    }\r
-\r
-    public ValRef copy() {\r
-        return binding.createOccurrence(parameters);\r
-    }\r
-\r
-    public void collectFreeVariables(SSAFunction function,\r
-            ArrayList<ValRef> vars) {\r
-        if(binding instanceof BoundVar) {\r
-            BoundVar var = (BoundVar)binding;\r
-            if(var.getFunctionParent() != function)\r
-                vars.add(this);\r
-        }\r
-    }\r
-\r
-    public void replaceBy(Val binding) {\r
-        remove();\r
-        setBinding(binding);\r
-    }\r
-    \r
-    @Override\r
-    public Type apply(MethodBuilder mb, Type[] typeParameters,\r
-            Val... parameters) {\r
-        return binding.apply(mb, Types.concat(this.parameters, typeParameters), parameters);\r
-    }\r
-\r
-    /**\r
-     * Replaces this reference with an application\r
-     */\r
-    public void replaceByApply(Val function, Val ... parameters) {\r
-        getParent().replaceByApply(this, function, this.parameters, parameters);\r
-    }\r
-    \r
-    @Override\r
-    public Object realizeValue(TransientClassBuilder classLoader) {\r
-        return binding.realizeValue(classLoader); \r
-    }\r
-\r
-    @Override\r
-    public void setLabel(String label) {\r
-    }\r
-\r
-    public void updateParentEffect() {\r
-        if(parent instanceof LetApply) {\r
-            LetApply apply = (LetApply)parent;\r
-            if(apply.getFunction() == this)\r
-                apply.updateEffect();\r
-        }\r
-    }\r
-}\r
+package org.simantics.scl.compiler.internal.codegen.references;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
+import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder;
+import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
+import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
+import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
+import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ValRef implements IVal {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ValRef.class);
+    public static final ValRef[] EMPTY_ARRAY = new ValRef[0];
+
+    Val binding;
+    ValRef prev; // FreeVars with the same binding form a linked list
+    ValRef next;     
+    ValRefBinder parent;
+    Type[] parameters;
+    
+    /**
+     * Just for deserialization
+     */
+    public ValRef(Type[] parameters) {
+        this.parameters = parameters;
+    }
+    
+    ValRef(Val binding, Type[] parameters) {
+        //System.out.println("+ " + bindin g);
+        this.parameters = parameters;        
+        setBinding(binding);
+    }    
+    
+    public void setBinding(Val binding) {
+        this.binding = binding;
+        
+        ValRef head = binding.occurrence;
+        binding.occurrence = this;
+        this.next = head;
+        this.prev = null;
+        if(head != null)
+            head.prev = this;
+    }
+    
+    int removeModiId = -1;
+    public void remove() {
+        //System.out.println("- " + binding);
+        if(prev == null)
+            try {
+                binding.occurrence = next;
+            } catch(NullPointerException e) {
+                LOGGER.error("removeModiId = " + removeModiId);
+                LOGGER.error("current ModiId = " + SSASimplificationContext.modiId, e);
+                throw new InternalCompilerError("The ValRef has already been removed.");
+            }
+        else
+            prev.next = next;
+        if(next != null)
+            next.prev = prev;
+        if(SCLCompilerConfiguration.DEBUG) {
+            next = null;
+            prev = null;
+            binding = null;
+        }
+        removeModiId = SSASimplificationContext.modiId;
+    }
+    
+    public Val getBinding() {
+        return binding;
+    }
+    
+    public ValRef getNext() {
+        return next;
+    }
+    
+    public static Val[] getBindings(ValRef[] refs) {
+        Val[] result = new Val[refs.length];
+        for(int i=0;i<refs.length;++i)
+            result[i] = refs[i].getBinding();
+        return result;
+    }
+
+    @Override
+    public ValRef createOccurrence() {
+        return binding.createOccurrence(parameters);
+    }
+
+    @Override
+    public ValRef createOccurrence(Type... otherParameters) {
+        return binding.createOccurrence(Types.concat(parameters, otherParameters));
+    }
+    
+    @Override
+    public IVal createSpecialization(Type... otherParameters) {
+        return new ValSpecialization(binding, Types.concat(parameters, otherParameters));
+    }
+
+    public void setParent(ValRefBinder parent) {
+        this.parent = parent;
+    }
+    
+    @Override
+    public Type getType() {
+        if(parameters.length == 0)
+            return binding.getType();
+        else
+            return Types.instantiate(binding.getType(), parameters); 
+    }
+    
+    public static ValRef[] createOccurrences(IVal[] vals) {
+        ValRef[] result = new ValRef[vals.length];
+        for(int i=0;i<vals.length;++i)
+            result[i] = vals[i].createOccurrence();
+        return result;
+    }
+    
+    public static <T extends IVal> ValRef[] createOccurrences(List<T> vals) {
+        ValRef[] result = new ValRef[vals.size()];
+        for(int i=0;i<vals.size();++i)
+            result[i] = vals.get(i).createOccurrence();
+        return result;
+    }
+    
+    public Type[] getTypeParameters() {
+        return parameters;
+    }
+    
+    public Type getTypeParameter(int i) {
+        return parameters[i];
+    }
+
+    public static ValRef[] concat(ValRef[] refs1, ValRef[] refs2) {
+        ValRef[] result = new ValRef[refs1.length + refs2.length];
+        for(int i=0;i<refs1.length;++i)
+            result[i] = refs1[i];
+        for(int i=0;i<refs2.length;++i)
+            result[refs1.length + i] = refs2[i];
+        return result;
+    }
+    
+    @Override
+    public void push(MethodBuilder mb) {
+        binding.push(mb);
+    }
+    
+    public ValRefBinder getParent() {
+        return parent;
+    }
+    
+    public SSAFunction getParentFunction() {
+        return parent.getParentFunction();
+    }
+    
+    public void replace(TVar[] vars, Type[] replacements) {
+        for(int i=0;i<parameters.length;++i) {
+            Type oldType = parameters[i];
+            Type newType = parameters[i].replace(vars, replacements);
+            if(oldType != newType) {
+                Type[] newParameters = new Type[parameters.length];
+                for(int j=0;j<i;++j)
+                    newParameters[j] = parameters[j];
+                newParameters[i] = newType;
+                for(int j=i+1;j<parameters.length;++j)
+                    newParameters[j] = parameters[j].replace(vars, replacements);
+                this.parameters = newParameters;
+                return;
+            }
+            
+        }
+    }
+
+    public void setTypeParameters(Type[] parameters) {
+        this.parameters = parameters;
+    }
+    
+    public static ValRef[] copy(ValRef[] refs) {
+        ValRef[] result = new ValRef[refs.length];
+        for(int i=0;i<refs.length;++i)
+            result[i] = refs[i].copy();
+        return result;
+    }
+
+    public ValRef copy() {
+        return binding.createOccurrence(parameters);
+    }
+
+    public void collectFreeVariables(SSAFunction function,
+            ArrayList<ValRef> vars) {
+        if(binding instanceof BoundVar) {
+            BoundVar var = (BoundVar)binding;
+            if(var.getFunctionParent() != function)
+                vars.add(this);
+        }
+    }
+
+    public void replaceBy(Val binding) {
+        remove();
+        setBinding(binding);
+    }
+    
+    @Override
+    public Type apply(MethodBuilder mb, Type[] typeParameters,
+            Val... parameters) {
+        return binding.apply(mb, Types.concat(this.parameters, typeParameters), parameters);
+    }
+
+    /**
+     * Replaces this reference with an application
+     */
+    public void replaceByApply(Val function, Val ... parameters) {
+        getParent().replaceByApply(this, function, this.parameters, parameters);
+    }
+    
+    @Override
+    public Object realizeValue(TransientClassBuilder classLoader) {
+        return binding.realizeValue(classLoader); 
+    }
+
+    @Override
+    public void setLabel(String label) {
+    }
+
+    public void updateParentEffect() {
+        if(parent instanceof LetApply) {
+            LetApply apply = (LetApply)parent;
+            if(apply.getFunction() == this)
+                apply.updateEffect();
+        }
+    }
+}