diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java index c2fb4f994..8a5a527bd 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/util/Util.java @@ -12,11 +12,20 @@ package com.ibm.wala.cast.js.util; import java.util.Iterator; +import com.ibm.wala.cast.js.ssa.PrototypeLookup; import com.ibm.wala.cast.loader.CAstAbstractLoader; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.ipa.cha.IClassHierarchy; +import com.ibm.wala.ssa.DefUse; +import com.ibm.wala.ssa.IR; +import com.ibm.wala.ssa.SSAInstruction; +import com.ibm.wala.ssa.SSAPhiInstruction; import com.ibm.wala.util.WalaException; +import com.ibm.wala.util.intset.IntSet; +import com.ibm.wala.util.intset.IntSetAction; +import com.ibm.wala.util.intset.IntSetUtil; +import com.ibm.wala.util.intset.MutableIntSet; import com.ibm.wala.util.warnings.Warning; public class Util { @@ -47,6 +56,49 @@ public class Util { throw new WalaException(String.valueOf(message)); } } + + public static IntSet getArgumentsArrayVns(IR ir, final DefUse du) { + int originalArgsVn = getArgumentsArrayVn(ir); + final MutableIntSet result = IntSetUtil.make(); + if (originalArgsVn == -1) { + return result; + } + + result.add(originalArgsVn); + int size; + do { + size = result.size(); + result.foreach(new IntSetAction() { + @Override + public void act(int vn) { + for(Iterator insts = du.getUses(vn); insts.hasNext(); ) { + SSAInstruction inst = insts.next(); + if (inst instanceof PrototypeLookup || inst instanceof SSAPhiInstruction) { + result.add(inst.getDef()); + } + } + } + }); + } while (size != result.size()); + + return result; + } + + public static int getArgumentsArrayVn(IR ir) { + for(int i = 0; i < ir.getInstructions().length; i++) { + SSAInstruction inst = ir.getInstructions()[i]; + if (inst != null) { + for(int v = 0; v < inst.getNumberOfUses(); v++) { + String[] names = ir.getLocalNames(i, inst.getUse(v)); + if (names != null && names.length == 1 && "arguments".equals(names[0])) { + return inst.getUse(v); + } + } + } + } + + return -1; + } }