]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/references/BoundVar.java
migrated to svn revision 33108
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / references / BoundVar.java
1 package org.simantics.scl.compiler.internal.codegen.references;
2
3 import org.cojen.classfile.TypeDesc;
4 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
5 import org.simantics.scl.compiler.internal.codegen.ssa.binders.BoundVarBinder;
6 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
7 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
8 import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
9 import org.simantics.scl.compiler.types.TVar;
10 import org.simantics.scl.compiler.types.Type;
11
12 import gnu.trove.map.hash.THashMap;
13
14 public final class BoundVar extends Val {
15     public BoundVarBinder parent;
16     Type type;
17     String label;
18     
19     /**
20      * This means that the bound var does not need a local variable
21      * but it can be generated into stack when needed.
22      */
23     public boolean generateOnFly;
24     
25     public BoundVar(Type type) {
26         this.type = type;
27     }
28
29     @Override
30     public Type getType() {
31         return type;
32     }
33     
34     @Override
35     public void push(MethodBuilder mb) {
36         if(generateOnFly)
37             ((LetApply)parent).push(mb);
38         else if(!mb.getJavaTypeTranslator().toTypeDesc(type).equals(TypeDesc.VOID))
39             mb.loadLocal(mb.getLocalVariable(this));        
40     }
41
42     public BoundVar copy(THashMap<TVar, TVar> tvarMap) {
43         return new BoundVar(type.replace(tvarMap));
44     }
45
46     public void replace(TVar[] vars, Type[] replacements) {
47         type = type.replace(vars, replacements);
48     }
49
50     public SSAFunction getFunctionParent() {
51         return parent.getParentFunction();
52     }
53
54     public static BoundVar[] concat(BoundVar[] a, BoundVar[] b) {
55         BoundVar[] result = new BoundVar[a.length + b.length];
56         int l = a.length;
57         for(int i=0;i<l;++i)
58             result[i] = a[i];
59         for(int i=0;i<b.length;++i)
60             result[i+l] = b[i];
61         return result;
62     }
63
64     public BoundVarBinder getParent() {
65         return parent;
66     }
67     
68     @Override
69     public int getEffectiveArity() {
70         if(parent instanceof SSAFunction) {
71             SSAFunction function = (SSAFunction)parent;
72             int arity = function.getArity();
73             if(function.hasEffect())
74                 ++arity;
75             return arity;
76         }
77         else
78             return 0;
79     }
80     
81     @Override
82     public Object realizeValue(TransientClassBuilder classLoader) {
83         throw new UnsupportedOperationException();
84     }
85
86     public static BoundVar[] copy(BoundVar[] vars) {
87         BoundVar[] result = new BoundVar[vars.length];
88         for(int i=0;i<vars.length;++i)
89             result[i] = new BoundVar(vars[i].getType());
90         return result;
91     }
92     
93     @Override
94     public void setLabel(String label) {
95         this.label = label;
96     }
97
98     public String getLabel() {
99         return label;
100     }
101 }