diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java
index 4f6e463..d8b9d1b 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsParser.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -29,6 +29,7 @@
 import com.google.gwt.dev.js.ast.JsContinue;
 import com.google.gwt.dev.js.ast.JsDefault;
 import com.google.gwt.dev.js.ast.JsDoWhile;
+import com.google.gwt.dev.js.ast.JsExprStmt;
 import com.google.gwt.dev.js.ast.JsExpression;
 import com.google.gwt.dev.js.ast.JsFor;
 import com.google.gwt.dev.js.ast.JsForIn;
@@ -150,8 +151,12 @@
 
   private SourceInfo makeSourceInfo(Node node) {
     SourceInfo parent = sourceInfoStack.peek();
-    SourceInfo toReturn = program.createSourceInfo(node.getLineno(),
-        parent.getFileName());
+    int lineno = node.getLineno();
+    if (lineno == -1) {
+      // Rhino only reports line numbers for statement nodes, not expressions
+      return parent;
+    }
+    SourceInfo toReturn = program.createSourceInfo(lineno, parent.getFileName());
     toReturn.copyMissingCorrelationsFrom(parent);
     return toReturn;
   }
@@ -173,7 +178,7 @@
         return null;
 
       case TokenStream.EXPRSTMT:
-        return mapExpression(node.getFirstChild()).makeStmt();
+        return mapExprStmt(node);
 
       case TokenStream.REGEXP:
         return mapRegExp(node);
@@ -418,8 +423,11 @@
   }
 
   private JsBlock mapBlock(Node nodeStmts) throws JsParserException {
-    JsBlock block = new JsBlock(makeSourceInfo(nodeStmts));
+    SourceInfo info = makeSourceInfo(nodeStmts);
+    JsBlock block = new JsBlock(info);
+    pushSourceInfo(info);
     mapStatements(block.getStatements(), nodeStmts);
+    popSourceInfo();
     return block;
   }
 
@@ -515,6 +523,9 @@
       fromTestExpr = ifNode.getFirstChild().getNext();
     }
 
+    SourceInfo info = makeSourceInfo(ifNode);
+    pushSourceInfo(info);
+
     // Map the test expression.
     //
     JsExpression toTestExpr = mapExpression(fromTestExpr);
@@ -523,12 +534,14 @@
     //
     JsStatement toBody = mapStatement(fromBody);
 
+    popSourceInfo();
+
     // Create and attach the "while" or "do" statement we're mapping to.
     //
     if (isWhile) {
-      return new JsWhile(makeSourceInfo(ifNode), toTestExpr, toBody);
+      return new JsWhile(info, toTestExpr, toBody);
     } else {
-      return new JsDoWhile(makeSourceInfo(ifNode), toTestExpr, toBody);
+      return new JsDoWhile(info, toTestExpr, toBody);
     }
   }
 
@@ -575,6 +588,13 @@
     }
   }
 
+  private JsExprStmt mapExprStmt(Node node) throws JsParserException {
+    pushSourceInfo(makeSourceInfo(node));
+    JsExpression expr = mapExpression(node.getFirstChild());
+    popSourceInfo();
+    return expr.makeStmt();
+  }
+
   private JsStatement mapForStatement(Node forNode) throws JsParserException {
     Node fromInit = forNode.getFirstChild();
     Node fromTest = fromInit.getNext();
@@ -935,13 +955,16 @@
   }
 
   private JsReturn mapReturn(Node returnNode) throws JsParserException {
-    JsReturn toReturn = new JsReturn(makeSourceInfo(returnNode));
+    SourceInfo info = makeSourceInfo(returnNode);
+    JsReturn toReturn = new JsReturn(info);
+    pushSourceInfo(info);
     Node from = returnNode.getFirstChild();
     if (from != null) {
       JsExpression to = mapExpression(from);
       toReturn.setExpr(to);
     }
 
+    popSourceInfo();
     return toReturn;
   }
 
@@ -1032,7 +1055,9 @@
   }
 
   private JsSwitch mapSwitchStatement(Node switchNode) throws JsParserException {
-    JsSwitch toSwitch = new JsSwitch(makeSourceInfo(switchNode));
+    SourceInfo info = makeSourceInfo(switchNode);
+    JsSwitch toSwitch = new JsSwitch(info);
+    pushSourceInfo(info);
 
     // The switch expression.
     //
@@ -1078,15 +1103,20 @@
       fromMember = fromMember.getNext();
     }
 
+    popSourceInfo();
     return toSwitch;
   }
 
   private JsThrow mapThrowStatement(Node throwNode) throws JsParserException {
+    SourceInfo info = makeSourceInfo(throwNode);
+    pushSourceInfo(info);
+
     // Create, map, and attach.
     //
     Node fromExpr = throwNode.getFirstChild();
-    JsThrow toThrow = new JsThrow(makeSourceInfo(throwNode),
-        mapExpression(fromExpr));
+    JsThrow toThrow = new JsThrow(info, mapExpression(fromExpr));
+
+    popSourceInfo();
     return toThrow;
   }
 
@@ -1180,7 +1210,9 @@
   }
 
   private JsVars mapVar(Node varNode) throws JsParserException {
-    JsVars toVars = new JsVars(makeSourceInfo(varNode));
+    SourceInfo info = makeSourceInfo(varNode);
+    pushSourceInfo(info);
+    JsVars toVars = new JsVars(info);
     Node fromVar = varNode.getFirstChild();
     while (fromVar != null) {
       // Use a conservative name allocation strategy that allocates all names
@@ -1201,6 +1233,7 @@
       fromVar = fromVar.getNext();
     }
 
+    popSourceInfo();
     return toVars;
   }
 
@@ -1220,8 +1253,24 @@
     sourceInfoStack.pop();
   }
 
+  private void popSourceInfo() {
+    sourceInfoStack.pop();
+  }
+
   private void pushScope(JsScope scope, SourceInfo sourceInfo) {
     scopeStack.push(scope);
     sourceInfoStack.push(sourceInfo);
   }
+
+  /**
+   * This should be called when processing any Rhino statement Node that has
+   * line number data so that enclosed expressions will have a useful source
+   * location.
+   * 
+   * @see Node#hasLineno
+   */
+  private void pushSourceInfo(SourceInfo sourceInfo) {
+    assert sourceInfo.getStartLine() >= 0 : "Bad SourceInfo line number";
+    sourceInfoStack.push(sourceInfo);
+  }
 }
