]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/singletons/TypeOfConstant.java
(refs #7767) SafeDynamic module
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / singletons / TypeOfConstant.java
index b0a0639b274f0ee3a1116d116f25efc182c4b466..f99f2ac78ad93cf5fc2d9fd09342c4eaa0a44da4 100644 (file)
@@ -1,9 +1,13 @@
 package org.simantics.scl.compiler.constants.singletons;
 
+import java.util.Arrays;
+
 import org.simantics.scl.compiler.constants.FunctionValue;
 import org.simantics.scl.compiler.internal.codegen.references.Val;
+import org.simantics.scl.compiler.internal.codegen.references.ValRef;
+import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
-import org.simantics.scl.compiler.types.TCon;
+import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
@@ -11,17 +15,16 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 
 public class TypeOfConstant extends FunctionValue {
     private static final TVar A = Types.var(Kinds.STAR);
-    private static final TCon Type = Types.con(Types.BUILTIN, "Type");
     public static final TypeOfConstant INSTANCE = new TypeOfConstant();
     
     private TypeOfConstant() {
-        super(new TVar[] {A}, Types.NO_EFFECTS, Type, 
+        super(new TVar[] {A}, Types.NO_EFFECTS, Types.TYPE
                 Types.pred(Types.TYPEABLE, A), A);
     }
     
     @Override
     public Type applyExact(MethodBuilder mb, Val[] parameters) {
-        mb.push(parameters[0], Type);
+        mb.push(parameters[0], Types.TYPE);
         return getReturnType();
     }
     
@@ -29,4 +32,17 @@ public class TypeOfConstant extends FunctionValue {
     public String toString() {
         return "typeOf";
     }
+    
+    @Override
+    public void inline(SSASimplificationContext context, LetApply apply) {
+        ValRef[] parameters = apply.getParameters();
+        if(parameters.length == 2) {
+            parameters[1].remove();
+            apply.setParameters(Arrays.copyOf(parameters, 1));
+        }
+        ValRef oldFunc = apply.getFunction();
+        apply.setFunction(TypeValueConstant.INSTANCE.createOccurrence(oldFunc.getTypeParameters()));
+        oldFunc.remove();
+        context.markModified("inline-typeOf");
+    }
 }
\ No newline at end of file