- for(SSAFunction function = firstFunction; \r
- function != null; \r
- function = function.getNext()) {\r
- hasValues |= function.getArity() == 0;\r
- function.lambdaLift(context);\r
- targets.add((BoundVar)function.getTarget());\r
- function.collectFreeVariables(freeVars);\r
+ for(SSAClosure closure = firstClosure; \r
+ closure != null; \r
+ closure = closure.getNext()) {\r
+ hasValues |= closure.isValue();\r
+ closure.lambdaLift(context);\r
+ targets.add((BoundVar)closure.getTarget());\r
+ closure.collectFreeVariables(freeVars);\r
+ }\r
+ \r
+ if(!(firstClosure instanceof SSAFunction) && firstClosure.getNext() == null) {\r
+ THashMap<BoundVar, BoundVar> varMap = new THashMap<BoundVar, BoundVar>(); \r
+ ArrayList<BoundVar> oldVarsList = new ArrayList<BoundVar>(4);\r
+ ArrayList<BoundVar> newVarsList = new ArrayList<BoundVar>(4);\r
+ BoundVar newTarget = null;\r
+ for(ValRef ref : freeVars) {\r
+ BoundVar var = (BoundVar)ref.getBinding();\r
+ if(targets.contains(var)) {\r
+ if(newTarget == null)\r
+ newTarget = new BoundVar(var.getType());\r
+ ref.replaceBy(newTarget);\r
+ continue;\r
+ }\r
+ BoundVar newVar = varMap.get(var);\r
+ if(newVar == null) {\r
+ newVar = new BoundVar(var.getType());\r
+ oldVarsList.add(var);\r
+ newVarsList.add(newVar);\r
+ varMap.put(var, newVar);\r
+ }\r
+ ref.replaceBy(newVar);\r
+ }\r
+ Constant constant = firstClosure.liftClosure(newTarget, newVarsList.toArray(new BoundVar[newVarsList.size()]));\r
+ new LetApply(targets.iterator().next(), Types.PROC, constant.createOccurrence(), ValRef.createOccurrences(oldVarsList))\r
+ .insertBefore(this);\r
+ detach();\r
+ context.addClosure(firstClosure);\r
+ return;\r