diff --git a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java index bcb0340ac..07dde1179 100755 --- a/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java +++ b/com.ibm.wala.cast.js.rhino/source/com/ibm/wala/cast/js/translator/RhinoToAstTranslator.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import org.mozilla.javascript.CompilerEnvirons; import org.mozilla.javascript.ErrorReporter; @@ -108,6 +109,7 @@ import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.classLoader.SourceModule; import com.ibm.wala.util.collections.EmptyIterator; import com.ibm.wala.util.collections.HashMapFactory; +import com.ibm.wala.util.collections.HashSetFactory; import com.ibm.wala.util.debug.Assertions; import com.ibm.wala.util.warnings.Warning; @@ -2289,16 +2291,16 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { */ public CAstEntity translateToCAst() throws Error, IOException, com.ibm.wala.cast.ir.translator.TranslatorToCAst.Error { class CAstErrorReporter implements ErrorReporter { - private Warning w = null; + private Set w = HashSetFactory.make(); @Override public void error(final String arg0, final String arg1, final int arg2, final String arg3, int arg4) { - w = new Warning(Warning.SEVERE) { + w.add(new Warning(Warning.SEVERE) { @Override public String getMsg() { return arg0 + ": " + arg1 + "@" + arg2 + ": " + arg3; } - }; + }); } @Override @@ -2327,7 +2329,7 @@ private CAstNode[] walkChildren(final Node n, WalkContext context) { AstRoot top = P.parse(sourceReader, scriptName, 1); - if (reporter.w != null) { + if (! reporter.w.isEmpty()) { throw new TranslatorToCAst.Error(reporter.w); } diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java index aa3dfe741..28eca17e4 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/WebPageLoaderFactory.java @@ -44,6 +44,10 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { return new JSAstTranslator(this) { private final CAst Ast = new CAstImpl(); + private boolean isNestedWithinScriptBody(WalkContext context) { + return isScriptBody(context) || context.getName().contains("__WINDOW_MAIN__"); + } + private boolean isScriptBody(WalkContext context) { return context.top().getName().equals( "__WINDOW_MAIN__" ); } @@ -51,10 +55,10 @@ public class WebPageLoaderFactory extends JavaScriptLoaderFactory { @Override protected int doGlobalRead(CAstNode n, WalkContext context, String name) { int result = context.currentScope().allocateTempValue(); - if (isScriptBody(context) && ! "$$undefined".equals(name) && ! "window".equals(name)) { + if (isNestedWithinScriptBody(context) && ! "$$undefined".equals(name) && ! "window".equals(name)) { // check if field is defined on 'window' - int windowVal = super.doLocalRead(context, "this"); + int windowVal = isScriptBody(context)? super.doLocalRead(context, "this"): super.doGlobalRead(n, context, "window"); int isDefined = context.currentScope().allocateTempValue(); context.currentScope().getConstantValue(name); doIsFieldDefined(context, isDefined, windowVal, Ast.makeConstant(name)); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java index 73f47f40a..d3070f6a0 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoHtmlParser.java @@ -115,7 +115,7 @@ public class JerichoHtmlParser implements IHtmlParser{ parser.parse(e); } if (! warnings.isEmpty()) { - throw new TranslatorToCAst.Error(warnings.iterator().next()); + throw new TranslatorToCAst.Error(warnings); } } catch (IOException e) { System.err.println("Error parsing file: " + e.getMessage()); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java index 261f4f9c4..ada128fec 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/TranslatorToCAst.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Map; +import java.util.Set; import com.ibm.wala.cast.tree.CAst; import com.ibm.wala.cast.tree.CAstEntity; @@ -33,10 +34,10 @@ public interface TranslatorToCAst { public , K extends CopyKey> void addRewriter(CAstRewriterFactory factory, boolean prepend); public class Error extends WalaException { - public final Warning warning; + public final Set warning; - public Error(Warning message) { - super(message.getMsg()); + public Error(Set message) { + super(message.iterator().next().getMsg()); warning = message; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java index 87876c02b..efad149f1 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/CAstAbstractLoader.java @@ -65,6 +65,14 @@ public abstract class CAstAbstractLoader implements IClassLoader { this(cha, null); } + public void addMessage(ModuleEntry module, Set message) { + if (! errors.containsKey(module)) { + errors.put(module, new HashSet()); + } + + errors.get(module).addAll(message); + } + public void addMessage(ModuleEntry module, Warning message) { if (! errors.containsKey(module)) { errors.put(module, new HashSet()); @@ -72,7 +80,7 @@ public abstract class CAstAbstractLoader implements IClassLoader { errors.get(module).add(message); } - + private Iterator getMessages(final byte severity) { return new MapIterator>, ModuleEntry>(new FilterIterator>>(errors.entrySet().iterator(), new Filter>>() { @Override