WALA/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java

92 lines
3.7 KiB
Java

package com.ibm.wala.cast.js.html;
import com.ibm.wala.cast.ir.translator.TranslatorToIR;
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory;
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.CAstNode;
import com.ibm.wala.cast.tree.impl.CAstImpl;
import com.ibm.wala.cast.tree.impl.CAstOperator;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.cha.IClassHierarchy;
public class WebPageLoaderFactory extends JavaScriptLoaderFactory {
public WebPageLoaderFactory(JavaScriptTranslatorFactory factory) {
super(factory);
}
@Override
protected IClassLoader makeTheLoader(IClassHierarchy cha) {
return new JavaScriptLoader( cha, translatorFactory ) {
@Override
protected TranslatorToIR initTranslator() {
return new JSAstTranslator(this) {
private final CAst Ast = new CAstImpl();
private boolean isScriptBody(WalkContext context) {
return context.top().getName().equals( "__WINDOW_MAIN__" );
}
@Override
protected int doGlobalRead(CAstNode n, WalkContext context, String name) {
int result = context.currentScope().allocateTempValue();
if (isScriptBody(context) && ! "$$undefined".equals(name) && ! "window".equals(name)) {
// check if field is defined on 'window'
int windowVal = super.doLocalRead(context, "this");
int isDefined = context.currentScope().allocateTempValue();
context.currentScope().getConstantValue(name);
doIsFieldDefined(context, isDefined, windowVal, Ast.makeConstant(name));
context.cfg().addInstruction(
insts.ConditionalBranchInstruction(
translateConditionOpcode(CAstOperator.OP_NE),
null,
isDefined,
context.currentScope().getConstantValue(new Integer(0))));
PreBasicBlock srcB = context.cfg().getCurrentBlock();
// field lookup of value
context.cfg().newBlock(true);
context.cfg().addInstruction(((JSInstructionFactory) insts).GetInstruction(result, windowVal, name));
context.cfg().addInstruction(insts.GotoInstruction());
PreBasicBlock trueB = context.cfg().getCurrentBlock();
// read global
context.cfg().newBlock(false);
PreBasicBlock falseB = context.cfg().getCurrentBlock();
int sr = super.doGlobalRead(n, context, name);
context.cfg().addInstruction(((JSInstructionFactory) insts).AssignInstruction(result, sr));
// end
context.cfg().newBlock(true);
context.cfg().addEdge(trueB, context.cfg().getCurrentBlock());
context.cfg().addEdge(srcB, falseB);
return result;
} else {
return super.doGlobalRead(n, context, name);
}
}
@Override
protected void doLocalWrite(WalkContext context, String nm, int rval) {
if (isScriptBody(context)) {
int windowVal = super.doLocalRead(context, "this");
context.currentScope().getConstantValue(nm);
context.cfg().addInstruction(((JSInstructionFactory) insts).PutInstruction(windowVal, rval, nm));
}
super.doLocalWrite(context, nm, rval);
}
};
}
};
}
}