Reviewed by Maciej.
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Dec 2007 04:05:56 +0000 (04:05 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Dec 2007 04:05:56 +0000 (04:05 +0000)
        - fix http://bugs.webkit.org/show_bug.cgi?id=16370
          REGRESSION (r28540): source URL and line number no longer set for outer function/programs

        Test: fast/js/exception-linenums-in-html-1.html
        Test: fast/js/exception-linenums-in-html-2.html
        Test: fast/js/exception-linenums.html

        By the time the ProgramNode was constructed, the source URL was empty.

        * kjs/Parser.cpp:
        (KJS::Parser::parseProgram): Added code to set and clear m_sourceURL, which is now
        handled here instead of in the lexer; it needs to still be set when we create the
        program node. Call setLoc to set the first and last line number.
        (KJS::Parser::parseFunctionBody): Ditto, but for the body.
        (KJS::Parser::parse): Removed the sourceURL argument.

        * kjs/Parser.h: Added sourceURL(), m_sourceURL, and m_lastLine. Added a lastLine
        parameter to didFinishParsing, since the bison grammar knows the last line number
        and we otherwise do not know it. Removed the sourceURL parameter from parse, since
        that's now handled at a higher level.

        * kjs/grammar.y: Pass the last line number to didFinishParsing.

        * kjs/lexer.cpp:
        (KJS::Lexer::setCode): Removed the sourceURL argument and the code to set m_sourceURL.
        (KJS::Lexer::clear): Ditto.
        * kjs/lexer.h: More of the same.

        * kjs/nodes.cpp:
        (KJS::FunctionBodyNode::FunctionBodyNode): Get the source URL from the parser rather
        than from the lexer. Removed unneeded call to setLoc, since the line numbers already
        both default to -1.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28577 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/Parser.cpp
JavaScriptCore/kjs/Parser.h
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/lexer.cpp
JavaScriptCore/kjs/lexer.h
JavaScriptCore/kjs/nodes.cpp

index 9f766a819eea539ec031c0b1bceb507c89fad9f0..fd632b720fbde8d688bb268ca50a118e79286621 100644 (file)
@@ -1,3 +1,40 @@
+2007-12-09  Darin Adler  <darin@apple.com>
+
+        Reviewed by Maciej.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=16370
+          REGRESSION (r28540): source URL and line number no longer set for outer function/programs
+
+        Test: fast/js/exception-linenums-in-html-1.html
+        Test: fast/js/exception-linenums-in-html-2.html
+        Test: fast/js/exception-linenums.html
+
+        By the time the ProgramNode was constructed, the source URL was empty.
+
+        * kjs/Parser.cpp:
+        (KJS::Parser::parseProgram): Added code to set and clear m_sourceURL, which is now
+        handled here instead of in the lexer; it needs to still be set when we create the
+        program node. Call setLoc to set the first and last line number.
+        (KJS::Parser::parseFunctionBody): Ditto, but for the body.
+        (KJS::Parser::parse): Removed the sourceURL argument.
+
+        * kjs/Parser.h: Added sourceURL(), m_sourceURL, and m_lastLine. Added a lastLine
+        parameter to didFinishParsing, since the bison grammar knows the last line number
+        and we otherwise do not know it. Removed the sourceURL parameter from parse, since
+        that's now handled at a higher level.
+
+        * kjs/grammar.y: Pass the last line number to didFinishParsing.
+
+        * kjs/lexer.cpp:
+        (KJS::Lexer::setCode): Removed the sourceURL argument and the code to set m_sourceURL.
+        (KJS::Lexer::clear): Ditto.
+        * kjs/lexer.h: More of the same.
+
+        * kjs/nodes.cpp:
+        (KJS::FunctionBodyNode::FunctionBodyNode): Get the source URL from the parser rather
+        than from the lexer. Removed unneeded call to setLoc, since the line numbers already
+        both default to -1.
+
 2007-12-08  Oliver Hunt  <oliver@apple.com>
 
         Reviewed by Sam W.
index 718cc8d3b8a85a873f720ff7ac34301c7c85e329..af35bfa7477c16172867a355407cfc8e5d657d2a 100644 (file)
@@ -43,23 +43,35 @@ PassRefPtr<ProgramNode> Parser::parseProgram(const UString& sourceURL, int start
     const UChar* code, unsigned length,
     int* sourceId, int* errLine, UString* errMsg)
 {
-    parse(sourceURL, startingLineNumber, code, length, sourceId, errLine, errMsg);
-    if (!m_sourceElements)
+    m_sourceURL = sourceURL;
+    parse(startingLineNumber, code, length, sourceId, errLine, errMsg);
+    if (!m_sourceElements) {
+        m_sourceURL = UString();
         return 0;
-    return new ProgramNode(m_sourceElements.release());
+    }
+    RefPtr<ProgramNode> program = new ProgramNode(m_sourceElements.release());
+    m_sourceURL = UString();
+    program->setLoc(startingLineNumber, m_lastLine);
+    return program.release();
 }
 
 PassRefPtr<FunctionBodyNode> Parser::parseFunctionBody(const UString& sourceURL, int startingLineNumber,
     const UChar* code, unsigned length,
     int* sourceId, int* errLine, UString* errMsg)
 {
-    parse(sourceURL, startingLineNumber, code, length, sourceId, errLine, errMsg);
-    if (!m_sourceElements)
+    m_sourceURL = sourceURL;
+    parse(startingLineNumber, code, length, sourceId, errLine, errMsg);
+    if (!m_sourceElements) {
+        m_sourceURL = UString();
         return 0;
-    return new FunctionBodyNode(m_sourceElements.release());
+    }
+    RefPtr<FunctionBodyNode> body = new FunctionBodyNode(m_sourceElements.release());
+    m_sourceURL = UString();
+    body->setLoc(startingLineNumber, m_lastLine);
+    return body;
 }
 
-void Parser::parse(const UString& sourceURL, int startingLineNumber,
+void Parser::parse(int startingLineNumber,
     const UChar* code, unsigned length,
     int* sourceId, int* errLine, UString* errMsg)
 {
@@ -72,7 +84,7 @@ void Parser::parse(const UString& sourceURL, int startingLineNumber,
         
     Lexer& lexer = KJS::lexer();
 
-    lexer.setCode(sourceURL, startingLineNumber, code, length);
+    lexer.setCode(startingLineNumber, code, length);
     m_sourceId++;
     if (sourceId)
         *sourceId = m_sourceId;
index 1eaef808b7a8952576dfca5a2eb4eaef6165d282..25edb47b4f7bfa3fdfc84b7f7257840dcc62fdf1 100644 (file)
@@ -48,23 +48,26 @@ namespace KJS {
             const UChar* code, unsigned length,
             int* sourceId = 0, int* errLine = 0, UString* errMsg = 0);
 
-        int sourceId() { return m_sourceId; }
+        UString sourceURL() const { return m_sourceURL; }
+        int sourceId() const { return m_sourceId; }
 
-        void didFinishParsing(SourceElements* sourceElements)
+        void didFinishParsing(SourceElements* sourceElements, int lastLine)
         {
             m_sourceElements.set(sourceElements);
+            m_lastLine = lastLine;
         }
 
     private:
         friend Parser& parser();
 
         Parser(); // Use parser() instead.
-        void parse(const UString& sourceURL, int startingLineNumber,
-            const UChar* code, unsigned length,
-            int* sourceId = 0, int* errLine = 0, UString* errMsg = 0);
+        void parse(int startingLineNumber, const UChar* code, unsigned length,
+            int* sourceId, int* errLine, UString* errMsg);
 
+        UString m_sourceURL;
         int m_sourceId;
         OwnPtr<SourceElements> m_sourceElements;
+        int m_lastLine;
     };
     
     Parser& parser(); // Returns the singleton JavaScript parser.
index 3b43d7c401b4c4a309137feb094bc2de2d140ac4..ec8785d556e6a5a2e71ada5b75cae4265ed37211 100644 (file)
@@ -879,8 +879,8 @@ FunctionBody:
 ;
 
 Program:
-    /* not in spec */                   { parser().didFinishParsing(new SourceElements); }
-    | SourceElements                    { parser().didFinishParsing($1->release()); }
+    /* not in spec */                   { parser().didFinishParsing(new SourceElements, @$.last_line); }
+    | SourceElements                    { parser().didFinishParsing($1->release(), @$.last_line); }
 ;
 
 SourceElements:
index f3234482022f08af68f8417602fabfca972d2a6f..5c9e6d7b63af4868c8730231796167280cd33e52 100644 (file)
@@ -94,10 +94,9 @@ Lexer::Lexer()
     m_identifiers.reserveCapacity(initialStringTableCapacity);
 }
 
-void Lexer::setCode(const UString &sourceURL, int startingLineNumber, const KJS::UChar *c, unsigned int len)
+void Lexer::setCode(int startingLineNumber, const KJS::UChar *c, unsigned int len)
 {
   yylineno = 1 + startingLineNumber;
-  m_sourceURL = sourceURL;
   restrKeyword = false;
   delimited = false;
   eatNextIdentifier = false;
@@ -863,7 +862,6 @@ void Lexer::clear()
 
     m_pattern = 0;
     m_flags = 0;
-    m_sourceURL = 0;
 }
 
 Identifier* Lexer::makeIdentifier(const Vector<KJS::UChar>& buffer)
index 2f8724794d256702b449cc4a32a4d4607e5e96d2..bfaa888bb97f396c6707a61ca141350c2e1e96ac 100644 (file)
@@ -34,11 +34,10 @@ namespace KJS {
 
   class Lexer : Noncopyable {
   public:
-    void setCode(const UString &sourceURL, int startingLineNumber, const UChar *c, unsigned int len);
+    void setCode(int startingLineNumber, const UChar *c, unsigned int len);
     int lex();
 
     int lineNo() const { return yylineno; }
-    UString sourceURL() const { return m_sourceURL; }
 
     bool prevTerminator() const { return terminator; }
 
@@ -90,7 +89,6 @@ namespace KJS {
     Lexer();
 
     int yylineno;
-    UString m_sourceURL;
     bool done;
     Vector<char> m_buffer8;
     Vector<UChar> m_buffer16;
index be745c39f50e7226ea41cf29307b40c97d8fde13..6e8e1614e66ce06dc27e084aa645d1697adbac6b 100644 (file)
@@ -4402,13 +4402,12 @@ Completion TryNode::execute(ExecState *exec)
 
 FunctionBodyNode::FunctionBodyNode(SourceElements* children)
     : BlockNode(children)
-    , m_sourceURL(lexer().sourceURL())
+    , m_sourceURL(parser().sourceURL())
     , m_sourceId(parser().sourceId())
     , m_initializedDeclarationStacks(false)
     , m_initializedSymbolTable(false)
     , m_optimizedResolveNodes(false)
 {
-  setLoc(-1, -1);
 }
 
 void FunctionBodyNode::initializeDeclarationStacks(ExecState* exec)