update to latest Rhino, 1.7R2

git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@4107 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
dolby-oss 2011-04-05 19:18:14 +00:00
parent e7ac8c25fe
commit 78ae5ffece
5 changed files with 10 additions and 653 deletions

View File

@ -39,9 +39,9 @@
<target name="fetchRhino" depends="RhinoPresent" unless="rhino.present">
<delete dir="${temp.folder}"/>
<mkdir dir="${temp.folder}"/>
<get src="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino1_6R5.zip" dest="${temp.folder}/rhino1_6R5.zip" />
<unzip src="${temp.folder}/rhino1_6R5.zip" dest="${temp.folder}"/>
<copy file="${temp.folder}/rhino1_6R5/js.jar" tofile="${plugin.destination}/lib/js.jar" />
<get src="ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino1_7R2.zip" dest="${temp.folder}/rhino1_7R2.zip" />
<unzip src="${temp.folder}/rhino1_7R2.zip" dest="${temp.folder}"/>
<copy file="${temp.folder}/rhino1_7R2/js.jar" tofile="${plugin.destination}/lib/js.jar" />
<delete dir="${temp.folder}"/>
</target>

View File

@ -12,6 +12,8 @@ package com.ibm.wala.cast.js.translator;
import java.io.IOException;
import org.mozilla.javascript.RhinoToAstTranslator;
import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
import com.ibm.wala.cast.tree.CAstEntity;
import com.ibm.wala.cast.tree.impl.CAstImpl;

View File

@ -1,42 +0,0 @@
/******************************************************************************
* Copyright (c) 2002 - 2006 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
*****************************************************************************/
import java.io.FileReader;
import org.mozilla.javascript.CompilerEnvirons;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ScriptOrFnNode;
import org.mozilla.javascript.tools.ToolErrorReporter;
class dumpRhinoParse {
public static void main(String[] args) {
try {
ToolErrorReporter reporter = new ToolErrorReporter(true);
CompilerEnvirons compilerEnv = new CompilerEnvirons();
compilerEnv.setErrorReporter(reporter);
Parser P = new Parser(compilerEnv, compilerEnv.getErrorReporter());
ScriptOrFnNode N = P.parse(new FileReader(args[0]), args[0], 1);
System.out.println( N.toStringTree(N) );
System.out.println( P.getEncodedSource() );
}
catch (Exception e) {
System.err.println( e.getMessage() );
}
}
}

View File

@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package com.ibm.wala.cast.js.translator;
package org.mozilla.javascript;
import java.io.Reader;
import java.net.URL;
@ -21,12 +21,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.mozilla.javascript.CompilerEnvirons;
import org.mozilla.javascript.FunctionNode;
import org.mozilla.javascript.Node;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ScriptOrFnNode;
import org.mozilla.javascript.Token;
import org.mozilla.javascript.tools.ToolErrorReporter;
import com.ibm.wala.cast.js.html.MappedSourceModule;
@ -573,6 +567,7 @@ public class RhinoToAstTranslator {
if (n instanceof FunctionNode) {
FunctionNode f = (FunctionNode) n;
f.flattenSymbolTable(false);
int i = 0;
arguments = new String[f.getParamCount() + 2];
arguments[i++] = name;
@ -1352,7 +1347,9 @@ public class RhinoToAstTranslator {
sourceReader = sourceModule.getInputReader();
return walkEntity(P.parse(sourceReader, scriptName, 1), new RootContext());
ScriptOrFnNode top = P.parse(sourceReader, scriptName, 1);
return walkEntity(top, new RootContext());
}
private final CAst Ast;

View File

@ -1,600 +0,0 @@
/******************************************************************************
* Copyright (c) 2002 - 2006 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
*****************************************************************************/
import java.io.FileReader;
import java.util.Map;
import org.mozilla.javascript.CompilerEnvirons;
import org.mozilla.javascript.FunctionNode;
import org.mozilla.javascript.Node;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.ScriptOrFnNode;
import org.mozilla.javascript.Token;
import org.mozilla.javascript.tools.ToolErrorReporter;
import com.ibm.wala.util.collections.HashMapFactory;
class walkRhinoTree {
private final Map<Node, Integer> results = HashMapFactory.make();
private int nextValue = 1;
private int nextValueNumber() {
return nextValue++;
}
private int setValue(Node n, int v) {
results.put(n, new Integer(v));
return v;
}
private int allocValue(Node n) {
return setValue(n, nextValueNumber());
}
private int getValue(Node n) {
return results.get(n).intValue();
}
private interface Symbol {
int valueNumber();
boolean isParameter();
}
private final static int TYPE_LOCAL = 1;
private final static int TYPE_GLOBAL = 2;
private final static int TYPE_SCRIPT = 3;
private final static int TYPE_FUNCTION = 4;
private interface Scope {
int type();
void declare(String name);
boolean contains(String name);
Symbol lookup(String name);
}
private static abstract class AbstractScope implements Scope {
private final Scope parent;
private final Map<String, Symbol> values = HashMapFactory.make();
public void declare(String nm) {
if (! contains(nm)) {
values.put(nm, makeSymbol(nm));
}
}
AbstractScope(Scope parent) {
this.parent = parent;
}
abstract protected Symbol makeSymbol(String nm);
public Symbol lookup(String nm) {
if (contains(nm))
return values.get(nm);
else
return parent.lookup(nm);
}
public boolean contains(String nm) {
return values.containsKey(nm);
}
};
Scope makeScriptScope(final ScriptOrFnNode s, Scope parent) {
return new AbstractScope(parent) {
public int type() { return TYPE_SCRIPT; }
protected Symbol makeSymbol(final String nm) {
final int v = nextValueNumber();
return
new Symbol() {
public String toString() { return nm; }
public int valueNumber() { return v; }
public boolean isParameter() { return false; }
};
}
};
}
Scope makeLocalScope(Node s, Scope parent) {
return new AbstractScope(parent) {
public int type() { return TYPE_LOCAL; }
protected Symbol makeSymbol(final String nm) {
final int v = nextValueNumber();
return
new Symbol() {
public String toString() { return nm; }
public int valueNumber() { return v; }
public boolean isParameter() { return false; }
};
}
};
}
Scope makeFunctionScope(final FunctionNode f, Scope parent) {
Scope s = new AbstractScope(parent) {
public int type() { return TYPE_FUNCTION; }
protected Symbol makeSymbol(final String nm) {
final int v = nextValueNumber();
return
new Symbol() {
public String toString() { return nm; }
public int valueNumber() { return v; }
public boolean isParameter() {
return f.getParamOrVarIndex(nm)<f.getParamCount();
}
};
}
};
for(int i = 0; i < f.getParamCount(); i++)
s.declare( f.getParamOrVarName(i) );
return s;
}
private static Scope makeGlobalScope() {
return new Scope() {
public int type() { return TYPE_GLOBAL; }
public void declare(String nm) {
throw new UnsupportedOperationException();
}
public boolean contains(String nm) {
return nm.equals("Math");
}
public Symbol lookup(String nm) {
return new Symbol() {
public String toString() { return "Math"; }
public int valueNumber() { return -1; }
public boolean isParameter() { return false; }
};
}
};
}
private interface WalkContext {
ScriptOrFnNode top();
Scope scope();
boolean resultWanted();
Node getCatchFor(Object exceptionType);
Node getBreakFor(Object label);
Node getContinueFor(Object label);
Node getFinally();
}
private abstract class DelegatingContext implements WalkContext {
private final WalkContext parent;
DelegatingContext(WalkContext parent) {
this.parent = parent;
}
public ScriptOrFnNode top() { return parent.top(); }
public Scope scope() { return parent.scope(); }
public boolean resultWanted() { return parent.resultWanted(); }
public Node getCatchFor(Object l) { return parent.getCatchFor(l); }
public Node getBreakFor(Object l) { return parent.getBreakFor(l); }
public Node getContinueFor(Object l) { return parent.getContinueFor(l); }
public Node getFinally() { return parent.getFinally(); }
}
private class ScriptContext extends DelegatingContext {
private final Scope scriptScope;
ScriptContext(WalkContext parent, Scope scriptScope) {
super(parent);
this.scriptScope = scriptScope;
}
public Scope scope() { return scriptScope; }
}
private class LocalContext extends DelegatingContext {
private final Scope localScope;
LocalContext(WalkContext parent, Scope localScope) {
super(parent);
this.localScope = localScope;
}
public Scope scope() { return localScope; }
}
private class FunctionContext extends ScriptContext {
private final ScriptOrFnNode topNode;
FunctionContext(WalkContext parent, Scope funScope, ScriptOrFnNode s) {
super(parent, funScope);
this.topNode = s;
}
public ScriptOrFnNode top() { return topNode; }
}
private class LoopContext extends DelegatingContext {
private final Node breakTo;
private final Node continueTo;
LoopContext(WalkContext parent, Node breakTo, Node continueTo) {
super(parent);
this.breakTo = breakTo;
this.continueTo = continueTo;
}
public Node getBreakFor(Object l) {
return (l == null)? breakTo: super.getBreakFor(l);
}
public Node getContinueFor(Object l) {
return (l == null)? continueTo: super.getContinueFor(l);
}
}
private class TryCatchContext extends DelegatingContext {
private final Node catchNode;
private final Node finallyNode;
TryCatchContext(WalkContext parent, Node catchNode, Node finallyNode) {
super(parent);
this.catchNode = catchNode;
this.finallyNode = finallyNode;
}
public Node getCatchFor(Object l) { return catchNode; }
public Node getFinally() { return finallyNode; }
}
private void walkNodes(final Node n, WalkContext context) {
if (n instanceof ScriptOrFnNode) {
WalkContext child;
if (n instanceof FunctionNode) {
FunctionNode f = (FunctionNode)n;
System.err.println("function " + f.getFunctionName());
child = new FunctionContext(context, makeFunctionScope(f, context.scope()), f);
} else {
ScriptOrFnNode s = (ScriptOrFnNode)n;
System.err.println("program");
child = new ScriptContext(context, makeScriptScope(s, context.scope()));
}
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
walkNodes(c, child);
} else {
int NT = n.getType();
switch (NT) {
case Token.FUNCTION: {
int fnIndex = n.getExistingIntProp(Node.FUNCTION_PROP);
FunctionNode fn = context.top().getFunctionNode(fnIndex);
System.err.println("declaring " + fn.getFunctionName() );
context.scope().declare( fn.getFunctionName() );
walkNodes(fn, context);
break;
}
case Token.LOOP: {
Node contTo = ((Node.Jump)n).getContinue();
Node breakTo = ((Node.Jump)n).target;
WalkContext child = new LoopContext(context, breakTo, contTo);
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
walkNodes(c, child);
break;
}
case Token.LOCAL_BLOCK: {
WalkContext child = new LocalContext(context, makeLocalScope(n, context.scope()));
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
walkNodes(c, child);
break;
}
case Token.CATCH_SCOPE: {
Node id = n.getFirstChild();
context.scope().declare( id.getString() );
System.err.println( context.scope().lookup( id.getString() ).valueNumber() + " = caught exception");
break;
}
case Token.TRY: {
Node catchNode = ((Node.Jump)n).target;
Node finallyNode = ((Node.Jump)n).getFinally();
WalkContext child =
new TryCatchContext(context, catchNode, finallyNode);
Node c = n.getFirstChild();
for (; c != null; c = c.getNext()) {
if (c.getType() == Token.FINALLY) break;
walkNodes(c, child);
}
for (; c != null; c = c.getNext()) {
walkNodes(c, context);
}
break;
}
case Token.JSR: {
Node jsrTarget = ((Node.Jump)n).target;
Node finallyBlock = context.getFinally();
if (jsrTarget != finallyBlock) throw new Error();
Node finallyNode = jsrTarget.getNext();
walkNodes(finallyNode, context);
break;
}
case Token.WITH:
case Token.FINALLY:
case Token.BLOCK:
case Token.LABEL:
case Token.EXPR_VOID: {
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
walkNodes(c, context);
break;
}
case Token.CALL: {
int result = allocValue(n);
Node callee = n.getFirstChild();
int fun;
if (callee.getType() == Token.NAME)
fun = context.scope().lookup( callee.getString() ).valueNumber();
else {
walkNodes( callee, context );
fun = getValue( callee );
}
int children = 0;
for (Node c = callee.getNext(); c != null; c = c.getNext()) {
walkNodes(c, context);
children++;
}
int i = 0;
int arguments[] = new int[ children ];
for(Node arg = callee.getNext(); arg != null; arg = arg.getNext() )
arguments[i++] = getValue( arg );
System.err.print(result + " = CALL " + fun);
for(int j = 0; j < arguments.length; j++)
System.err.print( " " + arguments[j] );
System.err.print("\n");
break;
}
case Token.NAME: {
setValue(n, context.scope().lookup( n.getString() ).valueNumber() );
break;
}
case Token.STRING: {
int result = allocValue(n);
System.err.println(result + " = \"" + n.getString() + "\"");
break;
}
case Token.NUMBER: {
int result = allocValue(n);
System.err.println(result + " = " + n.getDouble());
break;
}
case Token.ADD:
case Token.EQ:
case Token.DIV:
case Token.NE:
case Token.GT:
case Token.LT: {
int result = allocValue(n);
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
walkNodes(c, context);
Node l = n.getFirstChild();
Node r = l.getNext();
System.err.println(result + " = " + getValue(l) + " " + Token.name(NT) + " " + getValue(r));
break;
}
case Token.VAR: {
Node nm = n.getFirstChild();
context.scope().declare(nm.getString());
if (nm.getFirstChild() != null) {
walkNodes( nm.getFirstChild(), context );
System.err.println(context.scope().lookup(nm.getString()) + " = " + getValue(nm.getFirstChild()) );
}
break;
}
case Token.RETURN: {
Node val = n.getFirstChild();
if (val != null) {
walkNodes(val, context);
System.err.println("return " + getValue(val));
} else {
System.err.println("return");
}
break;
}
case Token.SETNAME: {
Node nm = n.getFirstChild();
walkNodes( nm.getNext(), context);
System.err.println("set " + context.scope().lookup(nm.getString()).valueNumber() + "(" + nm.getString() + ") = " + getValue( nm.getNext() ));
break;
}
case Token.IFNE:
case Token.IFEQ: {
Node expr = n.getFirstChild();
walkNodes( expr, context );
System.err.println(Token.name(NT) + " " + getValue(expr) + " GOTO " + ((Node.Jump)n).target);
break;
}
case Token.GOTO: {
System.err.println("GOTO (" + Token.name(NT) + ") " + ((Node.Jump)n).target);
break;
}
case Token.BREAK: {
System.err.println("GOTO (" + Token.name(NT) + ") " + ((Node.Jump)n).getJumpStatement().target);
break;
}
case Token.TARGET: {
System.err.println("LABEL " + n);
break;
}
case Token.OR: {
Object label = new Object() { public String toString() { return "OR:" + System.identityHashCode(n); } };
Node l = n.getFirstChild();
walkNodes(l, context);
System.err.println(getValue(n) + " = " + getValue(l));
System.err.println("IFEQ " + getValue(n) + " GOTO " + label);
Node r = l.getNext();
walkNodes(r, context);
System.err.println(getValue(n) + " = " + getValue(r));
System.err.println("LABEL " + label);
break;
}
case Token.INC: {
int result = context.resultWanted()? allocValue(n): -1;
Node l = n.getFirstChild();
walkNodes(l, context);
int flags = n.getIntProp( Node.INCRDECR_PROP, -1 );
String op = ((flags&Node.DECR_FLAG)!=0)? "-": "+";
if ((flags&Node.POST_FLAG)!=0) {
if (context.resultWanted())
System.err.println(result + " = " + getValue(l));
System.err.println(getValue(l) + " = " + getValue(l) + " " + op + " 1");
} else {
System.err.println(getValue(l) + " = " + getValue(l) + " " + op + " 1");
if (context.resultWanted())
System.err.println(result + " = " + getValue(l));
}
break;
}
case Token.EMPTY:
case Token.ENTERWITH:
case Token.LEAVEWITH: {
break;
}
case Token.GETPROP:
case Token.GETELEM: {
int result = allocValue(n);
Node receiver = n.getFirstChild();
walkNodes(receiver, context);
Node elt = receiver.getNext();
if (elt.getType() == Token.STRING) {
System.err.println(result + " = getfield " + getValue(receiver) + "." + elt.getString());
} else {
walkNodes(elt, context);
System.err.println(result + " = reflective getfield " + getValue(receiver) + "." + getValue(elt));
}
break;
}
case Token.THROW: {
Node catchTarget = context.getCatchFor( null );
Node throwVal = n.getFirstChild();
walkNodes(throwVal, context);
if (catchTarget != null) {
System.err.println("THROW of " + getValue(throwVal) + " to " + catchTarget);
} else {
System.err.println("THROW out of " + getValue(throwVal));
}
break;
}
default: {
System.err.println("looking at unhandled " + n + "(" + NT + ")" + " of " + n.getClass());
for (Node c = n.getFirstChild(); c != null; c = c.getNext())
System.err.println(" with child " + c);
}
}
}
}
public static void main(String[] args) throws Exception {
ToolErrorReporter reporter = new ToolErrorReporter(true);
CompilerEnvirons compilerEnv = new CompilerEnvirons();
compilerEnv.setErrorReporter(reporter);
Parser P = new Parser(compilerEnv, compilerEnv.getErrorReporter());
final ScriptOrFnNode N = P.parse(new FileReader(args[0]), args[0], 1);
walkRhinoTree walker = new walkRhinoTree();
final Scope G = makeGlobalScope();
walker.walkNodes( N,
new WalkContext() {
public ScriptOrFnNode top() { return N; }
public Scope scope() { return G; }
public boolean resultWanted() { return true; }
public Node getCatchFor(Object exceptionType) { return null; }
public Node getBreakFor(Object label) { return null; }
public Node getContinueFor(Object label) { return null; }
public Node getFinally() { return null; }
} );
}
}