134 lines
5.1 KiB
Java
134 lines
5.1 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2013 IBM Corporation.
|
|
* All rights reserved. This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial API and implementation
|
|
*******************************************************************************/
|
|
package com.ibm.wala.cast.js.rhino.test;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.util.Collections;
|
|
import java.util.Set;
|
|
|
|
import com.ibm.wala.cast.ipa.callgraph.CAstAnalysisScope;
|
|
import com.ibm.wala.cast.ir.ssa.AstIRFactory;
|
|
import com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error;
|
|
import com.ibm.wala.cast.js.html.DefaultSourceExtractor;
|
|
import com.ibm.wala.cast.js.html.MappedSourceModule;
|
|
import com.ibm.wala.cast.js.html.WebPageLoaderFactory;
|
|
import com.ibm.wala.cast.js.html.WebUtil;
|
|
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil;
|
|
import com.ibm.wala.cast.js.loader.JavaScriptLoader;
|
|
import com.ibm.wala.cast.js.loader.JavaScriptLoaderFactory;
|
|
import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
|
|
import com.ibm.wala.cast.js.util.Util;
|
|
import com.ibm.wala.cast.loader.AstMethod;
|
|
import com.ibm.wala.cast.types.AstMethodReference;
|
|
import com.ibm.wala.classLoader.IClass;
|
|
import com.ibm.wala.classLoader.IMethod;
|
|
import com.ibm.wala.classLoader.SourceModule;
|
|
import com.ibm.wala.ipa.callgraph.impl.Everywhere;
|
|
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
|
import com.ibm.wala.ipa.cha.ClassHierarchyFactory;
|
|
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
|
import com.ibm.wala.ssa.IR;
|
|
import com.ibm.wala.ssa.IRFactory;
|
|
import com.ibm.wala.ssa.SSAOptions;
|
|
import com.ibm.wala.util.CancelException;
|
|
import com.ibm.wala.util.Predicate;
|
|
import com.ibm.wala.util.WalaException;
|
|
import com.ibm.wala.util.collections.Pair;
|
|
|
|
public class PrintIRs {
|
|
|
|
/**
|
|
* prints the IR of each function in the script
|
|
*
|
|
* @throws IOException
|
|
* @throws ClassHierarchyException
|
|
*/
|
|
public static void printIRsForJS(String filename) throws IOException, ClassHierarchyException {
|
|
// use Rhino to parse JavaScript
|
|
JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory());
|
|
// build a class hierarchy, for access to code info
|
|
IClassHierarchy cha = JSCallGraphUtil.makeHierarchyForScripts(filename);
|
|
printIRsForCHA(cha, new Predicate<String>() {
|
|
|
|
@Override
|
|
public boolean test(String t) {
|
|
return t.startsWith("Lprologue.js");
|
|
}
|
|
});
|
|
}
|
|
|
|
protected static void printIRsForCHA(IClassHierarchy cha, Predicate<String> exclude) {
|
|
// for constructing IRs
|
|
IRFactory<IMethod> factory = AstIRFactory.makeDefaultFactory();
|
|
for (IClass klass : cha) {
|
|
// ignore models of built-in JavaScript methods
|
|
String name = klass.getName().toString();
|
|
if (exclude.test(name)) continue;
|
|
// get the IMethod representing the code
|
|
IMethod m = klass.getMethod(AstMethodReference.fnSelector);
|
|
if (m != null) {
|
|
IR ir = factory.makeIR(m, Everywhere.EVERYWHERE, new SSAOptions());
|
|
System.out.println(ir);
|
|
if (m instanceof AstMethod) {
|
|
AstMethod astMethod = (AstMethod) m;
|
|
System.out.println(astMethod.getSourcePosition());
|
|
}
|
|
System.out.println("===================================================\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void printIRsForHTML(String filename) throws IllegalArgumentException, MalformedURLException, IOException,
|
|
WalaException, Error {
|
|
// use Rhino to parse JavaScript
|
|
JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory());
|
|
// add model for DOM APIs
|
|
JavaScriptLoader.addBootstrapFile(WebUtil.preamble);
|
|
URL url = (new File(filename)).toURI().toURL();
|
|
Pair<Set<MappedSourceModule>, File> p = WebUtil.extractScriptFromHTML(url, DefaultSourceExtractor.factory);
|
|
SourceModule[] scripts = p.fst.toArray(new SourceModule[] {});
|
|
JavaScriptLoaderFactory loaders = new WebPageLoaderFactory(JSCallGraphUtil.getTranslatorFactory());
|
|
CAstAnalysisScope scope = new CAstAnalysisScope(scripts, loaders, Collections.singleton(JavaScriptLoader.JS));
|
|
IClassHierarchy cha = ClassHierarchyFactory.make(scope, loaders, JavaScriptLoader.JS);
|
|
Util.checkForFrontEndErrors(cha);
|
|
printIRsForCHA(cha, new Predicate<String>() {
|
|
|
|
@Override
|
|
public boolean test(String t) {
|
|
return t.startsWith("Lprologue.js") || t.startsWith("Lpreamble.js");
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param args
|
|
* @throws IOException
|
|
* @throws WalaException
|
|
* @throws CancelException
|
|
* @throws IllegalArgumentException
|
|
* @throws Error
|
|
*/
|
|
public static void main(String[] args) throws IOException, IllegalArgumentException, CancelException, WalaException, Error {
|
|
String filename = args[0];
|
|
if (filename.endsWith(".js")) {
|
|
printIRsForJS(filename);
|
|
} else if (filename.endsWith(".html")) {
|
|
printIRsForHTML(filename);
|
|
}
|
|
|
|
}
|
|
|
|
}
|