reflect function statements into 'window' object. i have checked that

firefox does this.
This commit is contained in:
Julian Dolby 2013-08-07 15:11:25 -04:00
parent d528c16b0f
commit 0117b88698
1 changed files with 14 additions and 0 deletions

View File

@ -17,10 +17,12 @@ import com.ibm.wala.cast.js.ssa.JSInstructionFactory;
import com.ibm.wala.cast.js.translator.JSAstTranslator;
import com.ibm.wala.cast.js.translator.JavaScriptTranslatorFactory;
import com.ibm.wala.cast.tree.CAst;
import com.ibm.wala.cast.tree.CAstEntity;
import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.impl.CAstImpl;
import com.ibm.wala.cast.tree.impl.CAstOperator;
import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory;
import com.ibm.wala.cast.tree.visit.CAstVisitor;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.cha.IClassHierarchy;
@ -99,6 +101,18 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory {
super.doLocalWrite(context, nm, rval);
}
@Override
protected void leaveFunctionStmt(CAstNode n, WalkContext context, CAstVisitor<WalkContext> visitor) {
super.leaveFunctionStmt(n, context, visitor);
if (isScriptBody(context)) {
CAstEntity fn = (CAstEntity) n.getChild(0).getValue();
int fnValue = context.currentScope().lookup(fn.getName()).valueNumber();
assert fnValue > 0;
int windowVal = super.doLocalRead(context, "this");
context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(windowVal, fnValue, fn.getName()));
}
}
};
}
};